マクロ実行後に$cへNo.08734
ももかず さん 02/08/23 17:46
 
こんにちは、ももかずです。

どなたの作成したものか忘れてしまいましたが、「送信用のエディタ
起動時」に、下記のマクロを使用して、ヘッダを編集しています。

すると、テンプレートに記述した「$c」が効かなくなり、カーソルは
ヘッダの先頭にきてしまいます。
おそらく、テンプレートで雛形を作成した後にマクロが実行されて、
このようになるのだと思いますが、「送信用のエディタ起動時」に
マクロを実行した後でも、「$c」個所にカーソルを戻すことはでき
ないでしょうか?


************ マクロ ************

loaddll "tkinfo.dll";
call Sub "To";
call Sub "Cc";
call Sub "Bcc";
endmacro;

Sub:
    ##i = 0;
    ##c = dllfunc("CountCurrentHeader", $$1);
    while( ##i < ##c ) {
        $$in = dllfuncstr("CurrentHeader2", $$1, ##i );
        $$out = "";
        ##n = 0;
        while(1) {
            $$temp = dllfuncstr("GetEmailList", $$in, ##n );
            if( $$temp == "" ) {
                break;
            }
            $$temp = dllfuncstr("SetEmailOnly", $$temp );
            if( $$temp != "" ) {
                if( $$out == "" ) {
                    $$out = $$temp;
                } else {
                    $$out = $$out + ", " + $$temp;
                }
            }
            ##n = ##n + 1;
        }
        ##n = dllfunc("SetHeader2", $$1, $$out, ##i );
        ##i = ##i + 1;
    }
    return;

[ ]
RE:08734 マクロ実行後に$cへNo.08740
秀まるお2 さん 02/08/26 11:03
 
 状況によりますが、解決方法はあります。

 返信メールの場合に限ってなら、マクロの開始時にカーソル位置を変数に記憶
して、マクロ終了時にカーソル位置を戻してやればいいです。

 具体的には、マクロの先頭に

    #xPrev = x;
    #yPrev = y;

 を入れておいて、マクロ終了直前(endmacro文の前)に、

    moveto #xPrev, #yPrev;

 を入れておけばいいです。

 もし、「新規メール」などで$c位置へ移動させたいなら、裏技になりますけど、
マクロ終了時(endmacro文の直前)に以下の文を入れる方法があります。

clearupdated;
moveto 0, -2;
right;
#n = dllfunc("Bypass_keybd_event", 9);

 一度おためしください。

[ ]
RE:08740 マクロ実行後に$cへNo.08741
ももかず さん 02/08/26 11:39
 
秀まるお2さん、こんにちは。ももかずです。

お返事ありがとうございます。

対象マクロが「送信用のエディタ起動時」に登録されているもの
なので、下記の処理を追加してみました。
どうも、転送、新規などでは「To」にカーソルが行くようなので
この位置を調べて、下記のようにしたのですが、どうも新規時の
時だけ、「$c」に飛ばずに「Subject」に行きます。
転送時は上手くいくのですが、どうしてなのでしょう?

*************************************************

#xPrev = x;
#yPrev = y;
if( (#xPrev==10) && (#yPrev==-5) ) {
    clearupdated;
    moveto 0, -2;
    right;
    #n = dllfunc("Bypass_keybd_event", 9);
}
else {
    moveto #xPrev, #yPrev;
}

[ ]
RE:08741 マクロ実行後に$cへNo.08749
秀まるお2 さん 02/08/26 17:17
 
>この位置を調べて、下記のようにしたのですが、どうも新規時の
>時だけ、「$c」に飛ばずに「Subject」に行きます。

 あのー、意味が間違って解釈されているようです。

 解決する方法が2つあるのでどちらか都合のいい方法を使ってほしいという話
でした。以下に記載する「解決方法その1」か「解決方法その2」かどちらか都
合のいい方法を1つだけ使ってください。

 2つの解決方法を合成してしまうとおかしくなります。

■解決方法その1

 マクロの先頭に

    #xPrev = x;
    #yPrev = y;

 を入れておいて、マクロ終了直前(endmacro文の前)に、

    moveto #xPrev, #yPrev;

 を入れておけばいいです。

■解決方法その2

 マクロ終了時(endmacro文の直前)に以下の文を入れる方法があります。

    clearupdated;
    moveto 0, -2;
    right;
    #n = dllfunc("Bypass_keybd_event", 9);

[ ]
RE:08749 マクロ実行後に$cへNo.08754
ももかず さん 02/08/26 18:26
 
秀まるお2さん、こんにちは。ももかずです。

お返事ありがとうございます。
すいませんが、もう少しおつきあいください。

> あのー、意味が間違って解釈されているようです。
>:(割愛)
> 2つの解決方法を合成してしまうとおかしくなります。

そうでしたか...。
でも、合成といっても必ずどちらかしか実行されないように
したつもりですが、それでもおかしくなりますか?

ちなみに、その2だけを使用した場合、やはり「$c」に行く
場合といかない場合があります。
まだ何か取り違えているのでしょうか?

と書いているうちに、$cに行かないケースを発見しました。
その2を使用して、ショートカットキーで送信用エディタを
開くと、どうもSubjectにしかカーソルが行かないみたいです。
ツールバーのボタンを使用すれば、$cに行くようです。

何か違いがあるのでしょうか?


>■解決方法その1
>
> マクロの先頭に
>
>    #xPrev = x;
>    #yPrev = y;
>:(割愛)
>
>■解決方法その2
>
>    clearupdated;
>    moveto 0, -2;
>    right;
>    #n = dllfunc("Bypass_keybd_event", 9);

[ ]
RE:08754 マクロ実行後に$cへNo.08759
秀まるお2 さん 02/08/26 23:29
 
 今見直してみたら、たしかにマクロはうまく出来ているようです。

 今日は仕事する時間が無かったのに無理無理仕事をしたので頭がぼけていたよ
うです。もうちょっと時間のある時にちゃんと考えてお返事させていただきます。

 こんな生活もうやめたい…

[ ]
RE:08759 マクロ実行後に$cへNo.08766
ももかず さん 02/08/27 10:06
 
秀まるお2さん、こんにちは。ももかずです。

> 今日は仕事する時間が無かったのに無理無理仕事をしたので頭が
>ぼけていたようです。もうちょっと時間のある時にちゃんと考えて
>お返事させていただきます。

すいません、お手数をおかけしております。
そんなに急いでいないですから、ゆっくりでいいです。

といいながら、ちょっとだけ簡単そうな質問を...。
 moveto 0, -2;
ってありましたが、鶴亀メール内でmovetoを使用する場合、指定する
X、Y座標ってどこが基準でどういった方向にプラスマイナスになって
いるのでしょう?

デフォルト新規作成時にマクロ内で調べてみたところ、ToのY座標が
-5だったので、本文基準になっていて、ちょうどSubjectが-2のような
気もするんですが...。
そうすると、moveto 0, -2;って実行するとSubjectに飛んでいくのも
当然のような気がします。
きっと、dllfunc("Bypass_keybd_event", 9);ってのがキー処理に
なっているんですよね。

おぉっといけない、どんどん急かしているみたいになってきちゃい
ましたね。返事はゆっくりでいいです(^^ゞ

[ ]
RE:08766 マクロ実行後に$cへNo.08768
秀まるお2 さん 02/08/27 11:29
 
 いろいろテストして、1つ肝心なことに気づきました。そもそも「返信メー
ル」などの場合には、僕の書いた2番目の方法(Bypass_keybd_eventを使う方
法)はまったくだめでした。

 いろいろ考えた結果、最終的な解決策マクロは以下の通りです。

------------------------------------------
#xPrev = x; #yPrev = y;
loaddll "tkinfo.dll";
call Sub "To";
call Sub "Cc";
call Sub "Bcc";

    clearupdated;
    if( #yPrev >= 0 ) {
        moveto #xPrev, #yPrev;
    } else {
        moveto 0, -9999;
        right;
        while(1) {
            if( linelen2 == 0 ) {
                moveto 0, 0;
                break;
            }
            if( code == 13 ) {
                break;
            }
            golineend2;
            down;
            golinetop2;
        }
    }

endmacro;

Sub:
    ##i = 0;
    ##c = dllfunc("CountCurrentHeader", $$1);
    while( ##i < ##c ) {
        $$in = dllfuncstr("CurrentHeader2", $$1, ##i );
        $$out = "";
        ##n = 0;
        while(1) {
            $$temp = dllfuncstr("GetEmailList", $$in, ##n );
            if( $$temp == "" ) {
                break;
            }
            $$temp = dllfuncstr("SetEmailOnly", $$temp );
            if( $$temp != "" ) {
                if( $$out == "" ) {
                    $$out = $$temp;
                } else {
                    $$out = $$out + ", " + $$temp;
                }
            }
            ##n = ##n + 1;
        }
        ##n = dllfunc("SetHeader2", $$1, $$out, ##i );
        ##i = ##i + 1;
    }
    return;
------------------------------------------


>といいながら、ちょっとだけ簡単そうな質問を...。
> moveto 0, -2;
>ってありましたが、鶴亀メール内でmovetoを使用する場合、指定する
>X、Y座標ってどこが基準でどういった方向にプラスマイナスになって
>いるのでしょう?

 メール本文の先頭が0,0です。0,-2を指定すると、それより2行上に移動しま
す。さらに「right」を実行すると、ヘッダ内容の先頭位置に移動するはずです。

 そこからタブキーを押すと$cの位置に移動するはずです。Bypass_keybd_event
でパラメータに9を指定すると、タブキーを押す操作をシミュレートします。と
ころが返信メールの場合はこれがうまく期待通りに動きませんでした。

[ ]
RE:08768 マクロ実行後に$cへNo.08770
ももかず さん 02/08/27 13:07
 
秀まるお2さん、こんにちは。ももかずです。

お返事ありがとうございます。
いつもすばやい対応で驚きです。

> いろいろ考えた結果、最終的な解決策マクロは以下の通りです。

すいません、このマクロでもどうも駄目です。
返信は上手くいくのですが、To無しテンプレートの新規および転送だと
必ずToに行ってしまい、$cへ移動しません。
なぜかTo付きテンプレートを使用すると$cへ移動するのですが...。

っていうか、どうも元々新規と転送では$cへ移動していないようです。
マクロ内でmessageを使って、カーソル位置を確認したのですが、新規
と転送はいつも最初が(10,-5)になっています。

使ってるテンプレートを記述しておきます。
いずれも署名は使用していません。

<アカウント設定のテンプレート>
****** 新規 ******
$c

******************

<アカウント設定のテンプレート>
****** 返信 ******
$c

"$(SetNameOnly,$(RootHeader,From))" wrote... :
$(QuotedSelectedRootText2)

******************

<アカウント設定のテンプレート>
****** 転送 ******
$(AddHeader,References,$(RootHeader,Message-Id))$-
$c

This is forwarding "$(SetNameOnly,$(RootHeader,From))"'s message... :
$(Quote,"[Subject] ")$(RootHeader,Subject)
$(Quote," ")
$(QuotedSelectedRootText2)

******************

<テンプレート設定の新規メール用>
****** To付 ******
$(SetHeader,"To","xxx@xxx")$-
$(SetHeader,"Subject","所要時間("+$(CurrentDate,"MM/DD")+")")$-

xxxさま

本日($(CurrentDate,"MM/DD"))の所要時間は、$c時間です。

******************

[ ]
RE:08770 マクロ実行後に$cへNo.08771
tnobu2 さん 02/08/27 13:28
 
>すいません、このマクロでもどうも駄目です。
>返信は上手くいくのですが、To無しテンプレートの新規および転送だと
>必ずToに行ってしまい、$cへ移動しません。
>なぜかTo付きテンプレートを使用すると$cへ移動するのですが...。

$cは使っていないのですが、マクロ無しで普通に新規あるいは転送をして
みるとTo:ヘッダに限らず、空のヘッダがあるとそこにカーソルが行くよう
ですね。

おそらく$cは効いているんでしょうけど、最後に空ヘッダに飛んでしまうため
実質的に機能していないということのようです。

[ ]
RE:08770 マクロ実行後に$cへNo.08772
ひろ さん 02/08/27 13:45
 
 ももかずさん今日は、ひろです。
> どうも元々新規と転送では$cへ移動していないようです。
 ヘルプを読むと
>  エディタが起動すると、普通、中身の無い最初のヘッダにカーソルが位置
> しています。この状態でタブキーを押すと、次のヘッダへと移動していき、
> 最後に本文に移動します。$cでカーソル位置を指定した場合には、その$cの
> あった位置にカーソルが自動的に移動します。
となっているので、これは仕様ではないでしょうか? つまり $c は、あくま
で本文に移動したときの位置を表すのではないでしょうか? ただマクロでカー
ソルを移動していると、$c の位置を保存しているのではないので、これも有
効ではないのでしょう?

 この解釈が正しいなら、別途 $c の位置を指定/取得する関数が別途必要にな
ると思います。

[ ]
RE:08770 マクロ実行後に$cへNo.08773
秀まるお2 さん 02/08/27 15:10
 
 話はtnobu2さん&ひろさんの通りですが、必ず「$c」の位置に移動させたいな
ら、以下のマクロを使ってください。

----------------------
    #xPrev = x; #yPrev = y;
    loaddll "tkinfo.dll";
    call Sub "To";
    call Sub "Cc";
    call Sub "Bcc";

    clearupdated;
    if( #yPrev >= 0 ) {
        moveto #xPrev, #yPrev;
    } else {
        moveto 0, -2;
        golinetop2;
        #n = dllfunc("Bypass_keybd_event", 9);
    }

endmacro;

Sub:
    ##i = 0;
    ##c = dllfunc("CountCurrentHeader", $$1);
    while( ##i < ##c ) {
        $$in = dllfuncstr("CurrentHeader2", $$1, ##i );
        $$out = "";
        ##n = 0;
        while(1) {
            $$temp = dllfuncstr("GetEmailList", $$in, ##n );
            if( $$temp == "" ) {
                break;
            }
            $$temp = dllfuncstr("SetEmailOnly", $$temp );
            if( $$temp != "" ) {
                if( $$out == "" ) {
                    $$out = $$temp;
                } else {
                    $$out = $$out + ", " + $$temp;
                }
            }
            ##n = ##n + 1;
        }
        ##n = dllfunc("SetHeader2", $$1, $$out, ##i );
        ##i = ##i + 1;
    }
    return;

[ ]
RE:08772 マクロ実行後に$cへNo.08774
ももかず さん 02/08/27 15:18
 
tnobu2さん、ひろさん、こんにちは。ももかずです。

お返事ありがとうございます。

みなさんのおかげで、なんとなく状況が把握できてきました。

08741でのマクロを使用した場合に発生する、08754での「$c」に
行かないケースについてもショートカットキーの割り当てが原因
のようです。
各送信メールのショートカットキーが「Ctrl+○」となっている
のが原因だったようです。
08741でのマクロでは、最後にタブキーを押す操作になるわけです
が、ショートカットキーでエディタを開くと「Ctrl」キーを離す
タイミングによって、このタブキーを押す操作に「Ctrl」が加わり
「Ctrl+タブ」になってタブ操作が無効になってしまっていたよう
です。

結局キー操作をするのであれば、ひろさんのおっしゃっている
ように、
> この解釈が正しいなら、別途 $c の位置を指定/取得する
>関数が別途必要になると思います。
が必要になるみたいですね。

なんとなく動作の仕組みがわかったので、とりあえずはなんとか
なりそうです。

ところで、
>  エディタが起動すると、普通、中身の無い最初のヘッダに
>カーソルが位置しています。
と書かれている「ヘッダ」にはCcやBccは含まれていないような
動作をしていますが、そういう認識であっていますか?

[ ]
RE:08774 マクロ実行後に$cへNo.08777
秀まるお2 さん 02/08/27 16:11
 
>タイミングによって、このタブキーを押す操作に「Ctrl」が加わり
>「Ctrl+タブ」になってタブ操作が無効になってしまっていたよう
>です。

 うむ、現象理解しました。

 それで、またまた超裏技になるんですけど、

        #n = dllfunc("Bypass_keybd_event", 9);

 の所を以下のように修正すればとりあえずCtrlキーに関係なく動くようです。

        #n = sendmessage( hidemaruhandle(0), 0x0111, 80, 0);

[ ]
RE:08777 マクロ実行後に$cへNo.08782
ももかず さん 02/08/27 17:04
 
秀まるお2さん、こんにちは。ももかずです。

下記修正で希望どおりの動作ができるようになりました。
ありがとうございました。
これからもよろしくお願いします。

> うむ、現象理解しました。
>
> それで、またまた超裏技になるんですけど、
>
>        #n = dllfunc("Bypass_keybd_event", 9);
>
> の所を以下のように修正すればとりあえずCtrlキーに関係なく動くようです。
>
>        #n = sendmessage( hidemaruhandle(0), 0x0111, 80, 0);

[ ]