マクロでいくつか確認No.04385
h-tom さん 09/11/04 23:39
 

h-tom です。

マクロでいくつか確認したいことがあります。

1)アウトプット枠を一度も表示していない("HmOutputPane.dll"が未ロード)状態
 から、loaddll → "Output"を実行した場合、アウトプット枠は表示されますが、
 指定した引数の内容が、表示されません。
 これは仕様になりますか?
 # 関数実行時、ウィンドウがまだありませんし。

// ここから
loaddll "HmOutputPane.dll";
#outhandle = dllfunc("GetWindowHandle",hidemaruhandle(0));
if(#outhandle == 0){
    //ロードされていないことを確認してから実行
    message "初回実行";
    #n = dllfunc("Output", hidemaruhandle(0), "初回テスト");
    //アウトプット枠は表示されるが、"初回テスト"は表示されない。
}
freedll;
// ここまで

2)loaddll関数ですが、ロードに失敗した場合、戻り値は"0"でいいのでしょうか?
 (識別値 > 0 )

[ ]
RE:04385 マクロでいくつか確認No.04389
秀丸担当 さん 09/11/05 14:46
 

>1)アウトプット枠を一度も表示していない("HmOutputPane.dll"が未ロード)状態
> から、loaddll → "Output"を実行した場合、アウトプット枠は表示されますが、
> 指定した引数の内容が、表示されません。
> これは仕様になりますか?

そうなるとしたら、仕様ではありませんでした。
試しにやってみたのですが、こちらではすぐに表示されましたが、何かタイミン
グが合わないのかもしれないです。
表示が完了するまで待機するようにβ24で修正してみます。

>2)loaddll関数ですが、ロードに失敗した場合、戻り値は"0"でいいのでしょうか?
> (識別値 > 0 )

失敗時は0ということでいいです。
ヘルプにも書いておきます。

[ ]
RE:04389 マクロでいくつか確認No.04393
h-tom さん 09/11/05 22:32
 

h-tom です。

>そうなるとしたら、仕様ではありませんでした。
>試しにやってみたのですが、こちらではすぐに表示されましたが、何かタイミン
>グが合わないのかもしれないです。
そんな感じですね。

出力部分を以下のように変更しても、2個とも表示されないです。
    #n = dllfunc("Output", hidemaruhandle(0), "初回テスト1");
    #n = dllfunc("Output", hidemaruhandle(0), "初回テスト2");

出力の間に sleep を入れると、2個目は表示されます。
    #n = dllfunc("Output", hidemaruhandle(0), "初回テスト1");
    sleep 1;
    #n = dllfunc("Output", hidemaruhandle(0), "初回テスト2");
微妙に、遅らせると、大丈夫みたいです。

非表示状態のアウトプット枠だと問題ないんですけど。

[ ]
RE:04389 マクロでいくつか確認No.04417
h-tom さん 09/11/06 21:53
 

h-tom です。

>そうなるとしたら、仕様ではありませんでした。
>試しにやってみたのですが、こちらではすぐに表示されましたが、何かタイミン
>グが合わないのかもしれないです。
>表示が完了するまで待機するようにβ24で修正してみます。
β24で、正常に表示される事を確認しました。

それと、
>・HmOutputPane.dllのGetWindowHandle関数は非表示のときは取得しないようにする。
となってますが、"HmExplorerPane.dll"も同じ修正が入ってますよね。

[ ]
RE:04417 マクロでいくつか確認No.04423
秀丸担当 さん 09/11/09 09:38
 

>それと、
>>・HmOutputPane.dllのGetWindowHandle関数は非表示のときは取得しないようにする。
>>
>となってますが、"HmExplorerPane.dll"も同じ修正が入ってますよね。

そうでした。
HmExplorerPane.dllも同様ということでお願いします。

[ ]
RE:04385 OutputPaneについて確認No.04431
たけとり さん 09/11/10 12:02
 
いつもお世話になっています。
beta24で追加された変更について、私もちょっと確認です。

>HmOutputPane.dllのGetWindowHandle関数は非表示のときは取得しないようにする。

これなんですが、OutputPaneが表示されていない状態で、GetWindowHandleによりハ
ンドルを取得したい場合は、いったん適当な文字列(たとえば改行のみとか)を出力し
たりしてアウトプット枠を表示させないとだめということでよろしいでしょうか。
要するに、最も簡単に書くと↓のようなマクロになるということでしょうか。

// OutputPaneのハンドルを取得。
loaddll "HmOutputPane.dll";
if(!result){
  // エラー処理
}
if(!dllfunc("Output", hidemaruhandle(0), "\\n")){
  // エラー処理
}
##hdlOutput = dllfunc("GetWindowHandle", hidemaruhandle(0));
if(!##hdlOutput){
  // エラー処理
}

もう1点ですが、そのハンドルにsendmessage関数を実行した場合、もし何もなければ
(成功ならば)、戻り値は0で、成功でなければ0以外でいいのでしょうか。
 (たぶんないとは思いますが、)万が一失敗というかうまく動作しなかった場合に備
えて↓とやっているのですが、これは意味のあるコードでしょうか。

if(sendmessage(##hdlOutput, 〜)){
  // エラー処理
}

よろしくお願いします。


[ ]
RE:04431 OutputPaneについて確認No.04432
秀丸担当 さん 09/11/10 16:37
 

>これなんですが、OutputPaneが表示されていない状態で、GetWindowHandleによりハ
>ンドルを取得したい場合は、いったん適当な文字列(たとえば改行のみとか)を出力し
>たりしてアウトプット枠を表示させないとだめということでよろしいでしょうか。
>要するに、最も簡単に書くと↓のようなマクロになるということでしょうか。

現状ではそういうことになってしまうと思います。
もし何らかの現状ではできない動きが必要なことがあれば、関数追加など検討さ
せていただきます。

>もう1点ですが、そのハンドルにsendmessage関数を実行した場合、もし何もなければ
>(成功ならば)、戻り値は0で、成功でなければ0以外でいいのでしょうか。

sendmessageでWM_COMMAND(0x0111)を送る場合でしたら、必ず 0 が帰ってきて成
功したかどうかを戻り値で知ることはできないです。
もしやるとしたら、例えば getresultex で特別にこの結果を取得できるものを
用意するとか、そういうことになってくると思いますが、ちょっとややこしいこ
とになるかもしれません。

[ ]
RE:04432 OutputPaneについて確認No.04442
たけとり さん 09/11/12 19:12
 
>現状ではそういうことになってしまうと思います。

了解しました。

>もしやるとしたら、例えば getresultex で特別にこの結果を取得できるものを
>用意するとか、そういうことになってくると思いますが、ちょっとややこしいこ
>とになるかもしれません。

sendmessage関数はWindows APIのSendMessage関数と同様の結果が帰ってくることが
明記されていますので、失敗でも成功でも0ということなら、仕方ないですね。
getresultexでやるぐらいなら、sendmessage関数の返値になってくれた方がうれしい
ような気がします。
いずれにしても、ややこしいということでしたら、断念します。

それともう1点確認です。
マクロ起動前にアウトプット枠に表示されていたものが、何の結果だったか知る方法
ってございますか?
マクロでアウトプット枠を使った(アウトプット枠の内容を変えた)場合に、終了時に
起動前の内容(とほぼ同様)に戻したいと思っています。

よろしくお願いします。

[ ]
RE:04442 OutputPaneについて確認No.04454
秀丸担当 さん 09/11/13 10:41
 

>それともう1点確認です。
>マクロ起動前にアウトプット枠に表示されていたものが、何の結果だったか知る方法
>ってございますか?
>マクロでアウトプット枠を使った(アウトプット枠の内容を変えた)場合に、終了時に
>起動前の内容(とほぼ同様)に戻したいと思っています。

いまのところアウトプット枠の内容を取得する方法は無です。
無理やりやるとしたら、自前のDLLなどでエディットコントロールを探してコン
トロール内容を保存するなどをするとできてしまうかもしれないですが、現実的
ではないかもしれません。
もし取得できる関数を作るとすると、大きなサイズのものが出力されていた場合、
マクロの変数の容量制限にかかってしまうかもしれないです。

うまいことできる方法を考えてみたところ、2つ思いつきました。
1つは、クリップボードにコピーするコマンド値を新たに用意して、
getclipboardで一行ずつ取得するという方法です。クリップボードが乱れるのと、
マクロを作るのが面倒かもしれません。
もう1つはHmOutputPane.dllに関数を追加して、現在の内容を退避/復元する関
数を用意する方法で、制限にも関係なくうまいことできるかもしれないです。
そういう方法ではどうでしょうか。

[ ]
RE:04454 OutputPaneについて確認No.04467
たけとり さん 09/11/13 19:06
 
>いまのところアウトプット枠の内容を取得する方法は無です。

了解しました。

>うまいことできる方法を考えてみたところ

自分の稚拙なアイデアは↓でした。(^^;
私の個人的な範囲では、アウトプット枠の内容が、grepの結果か、プログラム実行の
結果か、マクロでdllfunc("Output")した結果かを判別できるキーワードのようなも
のでも、用は足りるかもと思っていました。
# 現状、アウトプット枠に出力できるのはその3通りしかないと仮定して話を進めます。
# ほかにありましたらすみません。
たとえば、grepの結果とわかれば(そしてその検索オプションがわかれば)、ほぼ同じ
結果を出力することはできます。(時間はかかるかもしれませんが)
また、マクロでファイル内容を変更したなどのときには、表示を更新するという意味
で再検索をしたいこともあるのでは、と愚考しています。
プログラムの結果も同様の考えです。再度実行しても差し支えなければ、ですが。

>1つは、クリップボードにコピーするコマンド値を新たに用意して、
>getclipboardで一行ずつ取得するという方法です。クリップボードが乱

実は、「ない」とおっしゃられたときには、これに近い方法も考えていました。
枠にフォーカスを当てた後、COM(WSH)のsendkeyで^A ^C(または、もしできるような
らマクロのsendmessage関数でコマンド)を送ってコピー→1行ずつ取り出して出力→c
learcliphist 0;...という方法なので、現状でもできるかなぁと。
ほかのクリップボード用のソフトを使っている環境のために、これよりいい方法があ
ればと思っていました。

>もう1つはHmOutputPane.dllに関数を追加して、現在の内容を退避/復元する関
>数を用意する方法で、制限にも関係なくうまいことできるかもしれないです。
>そういう方法ではどうでしょうか。

お、これはいいですね。
こういうことができるならば是非お願いしたいです。

よろしくお願いします。

[ ]
RE:04467 OutputPaneについて確認No.04472
秀丸担当 さん 09/11/16 11:47
 

>>もう1つはHmOutputPane.dllに関数を追加して、現在の内容を退避/復元する関
>>数を用意する方法で、制限にも関係なくうまいことできるかもしれないです。
>>そういう方法ではどうでしょうか。
>
>お、これはいいですね。
>こういうことができるならば是非お願いしたいです。

退避できる関数ということにしようと思います。
種類の取得やコピーはまた必要性があるときに検討したいと思います。

[ ]
RE:04472 OutputPaneについて確認No.04480
たけとり さん 09/11/16 17:33
 
>退避できる関数ということにしようと思います。
>種類の取得やコピーはまた必要性があるときに検討したいと思います。

了解しました。
よろしくお願いします。

[ ]