マクロ:SAVEASが開くフォルダNo.37997
hirahira さん 10/03/06 16:07
 
いつもお世話になっております。

永遠とメール保存マクロを作成しております。

このうち、やはり、SAVEASで開くフォルダが動作不安定です。

原因として、どのようなものが、考えられるでしょうか。


動作確認用マクロは以下のようなものです。


//※ 本マクロは動作確認用で、E:\tmpフォルダにディレクトリを作成します。

//デバッグ時は、以下の2行のコメントを外すこと
    debuginfo 1;  //デバッグ出力許可
    #debug = 1;   //デバッグフラグ
   
   
    call sub_tkinfo;
    call Dserver;

 $NameDay = "Fw: 【ABC】?重要/ホームページの仕様変更";
 $strDir = " E:\\tmp";

//フォルダ名の修正 空白は「無」に置き換えるなど
// 使えない文字 \ / : * ? " < > |
    call ChangeCharacter $NameDay," ","";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay," ","";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,"\"","";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,":","-";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,";","-";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,"/","-";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,"?","";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,"<","(";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,">",")";
    $NameDay2 = $$return;//戻り値受領
    call ChangeCharacter $NameDay2,"|","-";
    $NameDay2 = $$return;//戻り値受領


    call DBOUT "$NameDay2 = " + $NameDay2 +" \n";
   
// セーブするか否かの確認
    question "保存処理しますか?  " + "\x0a" + "\x0a" + $strDir + "\x0a" + "
\x0a" + $NameDay2;
    if( result != yes ) goto LEND;

//カレントディレクトリセット
    ddeexecute "setcurdir " + $strDir;

//フォルダ作成
    ddeexecute "mkdir /n " + $NameDay2;

//フォルダ作成に成功したか否か
//・処理の結果コード(result)
//  0: 成功
//  1: 失敗
    ##r1 = val(dderequest("fileopresult"));
   
    if( ##r1==0 ){
        //ディレクトリを書き換え
        writeregstr "ExpDir", $strDir + "\\" + $NameDay2;
        message "フォルダ作成しました。"+ "\x0a" + "\x0a" + "$strDir : " +$s
trDir + "\x0a" +"\x0a"+ "$NameDay2 : " + $NameDay2;
    }else{
        //ディレクトリを書き換え
        writeregstr "ExpDir", $strDir;
        message "フォルダ作成に失敗しています。"+ "\x0a" +  $strDir + " をレ
ジストリに登録しました";
    }

//カレントディレクトリ問合せ
    $cdir = dderequest("getcurdir");
    if( strlen($cdir) > 0 ) message "カレントディレクトリ = " + $cdir;

//レジストリを閉じて
    closereg;

//秀丸に読み込ませる
    #n = dllfunc("EnvChanged", 1);

//クリックボードにフォルダ名を保存
    beginclipboardread;
   
    setclipboard $NameDay2;

    call Time_wait 1000;

//名前を付けて保存(秀丸エディタマクロ)
    SAVEAS;

//キャンセルした場合は、終了
    if(result==false)goto LEND;
   
//**************************************************************************
***********

ChangeCharacter://buffer 中の文字列を置換

//$$1:buffer
//$$2:検索文字列
//$$3:置換文字列

  ##change_char=strlen($$2);
  $$string = "";
  while(1){
    ##number = strstr($$1, $$2);
    if(##number == -1)break;
    else{
      ##long = strlen($$1);
      $$string = $$string + leftstr($$1, ##number) + $$3;
      $$1 = rightstr($$1, ##long - ##number - ##change_char);
    }
  }
  return $$string + $$1;

//**************************************************************************
***********
//**************************************************************************
***********
Time_wait://ウエイト
   
    #tick = tickcount;
    while( tickcount - #tick < val($$1) ) {
        //
    }
return;

//**************************************************************************
***********
//**************************************************************************
***********

DBOUT:
    if(#debug == 1 && findwindowclass("DBConClass") != 0) debuginfo $$1 + "\n";
return;



LEND:
    freedll;
    endmacro;
       
//**************************************************************************
***********
//**************************************************************************
***********

Dserver:

        //田楽DLLをload
        call Dengaku;

        //$apppath = input("田楽サーバのあるフォルダを入力して下さい。",hide
marudir);
        $apppath = hidemarudir;
        //message $apppath;
        if( (!result) || $apppath == "" ) endmacro;
        if( rightstr($apppath,1) != "\\" ) $apppath = $apppath + "\\";
        if( !existfile($apppath+"dgserver.exe") ){
            message "指定されたフォルダに dgserver.exe がありません。";
            endmacro;
        }

//田楽サーバのダイアログ機能使用部−−−−−−−−−−−−−−−−
    //  田楽サーバの実行
    run $apppath + "dgserver.exe";
    if( !result ){
        message "田楽サーバの起動に失敗しました。";
        goto LEND;
    }
   
    ddeinitiate "DengakuServer", "AllService";
    if( !result ){
        #hwnddg = findwindowclass("DengakuServerClass");
        if( #hwnddg == 0 ) {
            run $apppath + "dgserver.exe";
        }
       
        call Time_wait 500;
       
        ddeinitiate "DengakuServer", "AllService";
        if( !result ){
            message "やっぱりエラーです";
            endmacro;
        }
    }
    return;


//**************************************************************************
***********
    Dengaku:
//  田楽DLLのロード
        if(existfile(hidemarudir+"\\DengakuDLL.dll")){
//            loaddll hidemarudir+"\\DengakuDLL.dll";
            loaddll "tkinfo.dll";
            $$filename =hidemarudir+"\\DengakuDLL.dll";
            #dll = dllfunc("LoadDll",$$filename );
            if( #dll == 0 ) {
                message "dllがロードできませんでした。";
                goto LEND ;
            }

        }
        else {
            $$mes = "田楽DLLが見つかりませんでした。\n" +
                    "田楽DLLを秀丸エディタインストールディレクトリにおいてく
ださい。\n" +
                    "  秀丸エディタインストールディレクトリ:\n\t"+hidemarudi
r + "\n\n" +
                    "田楽DLL ダウンロードURL\n"+
                    "  http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgserver/
\n" +
                    $info ;
            message $$mes ;
            goto LEND ;
        }

        if (!result) {
            message "田楽DLL をロードできませんでした。"+$info;
            goto LEND ;
        }
    return;


//**************************************************************************
***********
//**************************************************************************
***********

    sub_tkinfo:
    loaddll "tkinfo.dll";
    if( !result ) {
        message "このマクロは秀丸メールで実行してください。";
        endmacro;
    }
    if( !dllfunc("IsTuruKameMain") ) {
        message "このマクロは秀丸メール本体側で実行してください。";
        endmacro;
    }
    return;

動作環境

秀丸メール Ver.5.34 V8
秀丸エディタ Ver.8.00 V44
OS XP SP3

[ ]
RE:37997 マクロ:SAVEASが開くフォルダNo.37998
hirahira さん 10/03/06 16:14
 
マクロの目的は、適当なフォルダをその都度作成し、

そのフォルダに自動で移動し、メールを保存するためのものです。

きちんと、動く場合と動かない場合があり、

動作不安定な理由がイマイチ分かりません。

何か、原因と思われることがあれば、ご教示下さい。

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


[ ]
RE:37998 マクロ:SAVEASが開くフォルダNo.37999
秀まるお2 さん 10/03/06 23:11
 
 とりあえずこちらで試した例としては、

 changename "c:\\temp.txt";
 SAVEAS;

 のようにすれば、保存先のファイル名/フォルダ名の初期値の指定が出来るよ
うです。

 ファイル名は指定せずに(秀丸メールまかせにして)フォルダ名だけ指定した
いということなら…、いろいろ調べてみた限りでは、その方法は見つかりません
でした。

 もしも、「SAVEAS;」を実行した時に出てくる初期ファイル名を取得するよう
な関数が欲しいということでしたら、それはそれで用意してもいいですけども、
とりあえすそうでなければ、上記の「changename」を使うやり方でいけると思い
ます。

[ ]
RE:37999 マクロ:SAVEASが開くフォルダNo.38002
hirahira さん 10/03/08 12:25
 
> もしも、「SAVEAS;」を実行した時に出てくる初期ファイル名を取得するよう
>な関数が欲しいということでしたら、それはそれで用意してもいいですけども、
>とりあえすそうでなければ、上記の「changename」を使うやり方でいけると思い
>ます。

秀まるお2さん、いつもお手数をお掛けしております。

ありがとうございます。

上記の「changename」をやってみましたが、

どうも、うまく行きません。


SAVEAS; を実行した時に出てくる初期ファイル名を

設定および取得できるような関数をつくっていただけるのでしたら、

うれしいです。

ご検討いただけますよう、お願い申し上げます。m(_ _)m




[ ]
RE:38002 マクロ:SAVEASが開くフォルダNo.38006
秀まるお2 さん 10/03/08 13:43
 
 うまくいかないというのは、例えば

    changename "c:\\temp.txt";
    SAVEAS;

 このマクロを実行した時に出てくる初期ファイル名が「c:\temp.txt」になら
ない、という話でしょうか。

 それとも、初期ファイル名を好きなように設定するのがうまくいかないという
だけであって、changename自体はうまく動くのでしょうか。

 とりあえず僕が追加しようと思うのは、例えば

    $file = dllfunc("GetSaveAsDefaultFileName");

 とかいう関数を追加して、それで「名前を付けて保存...」時のデフォルトで
出てくるファイル名文字列を取得出来るようにするって程度なので、もしも現状
でchangenameがうまくいかないなら、関数追加したとしてもどっちみちダメじゃ
ないかと思います。

 changenameがうまくいかないという話でしたら、それはそれで僕の方で詳しく
調べてみたいと思います。

[ ]
RE:38006 マクロ:SAVEASが開くフォルダNo.38009
Iranoan さん 10/03/08 14:38
 
 秀まるおさん今日は、一ユーザの Iranoan です。
>     $file = dllfunc("GetSaveAsDefaultFileName");
>
>  とかいう関数を
 本題から外れますが、これは filename や filename2 と機能的に何が違う
のでしょう?

[ ]
RE:38009 マクロ:SAVEASが開くフォルダNo.38011
秀まるお2 さん 10/03/08 15:16
 
 現状の秀丸メールで、例えば

 message filename;

 とやると、何も出てこないです。これはつまり、秀丸メール内の秀丸エディタ
相当部分は、実は「新規作成」の秀丸エディタ相当になっているからです。

 なので、そのままだと、「SAVEAS;」を実行した時にはファイル名が空っぽで
ダイアログボックスが出てくる訳ですが、それでは寂しいので、Subject:ヘッダ
からファイル名相当の物を自動生成して、それをダイアログボックスにセットす
るような処理をしています。

 その自動生成するファイル名だけ取得したいってニーズがあるなら、それだけ
関数として用意してもいいかなぁと思ったのでした。

[ ]
RE:38006 マクロ:SAVEASが開くフォルダNo.38013
秀まるお2 さん 10/03/08 15:27
 
 それと、レジストリの"ExportDir"を書き換えてEnvChangedするマクロがうま
く動かない理由も分かりました。

 例えば以下のマクロがうまく動きませんでした。

    loaddll "tkinfo.dll";
    #n = dllfunc("SaveConfig", 1);
    openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
    writeregstr "ExpDir", "c:\\temp";
    #n = dllfunc("EnvChanged", 1);
    SAVEAS;

 調べてみたら、V5.32β1の時に、「秀丸メールが落ちた形跡があれば、各種の
フォルダ履歴を消去する」って処理を入れてまして、それが悪影響するレベルダ
ウンのバグでした。

 ということで、これはこれでバグということで修正させていただきます。大変
失礼しました。

[ ]
RE:38011 マクロ:SAVEASが開くフォルダNo.38014
Iranoan さん 10/03/08 15:29
 
 秀まるおさん今日は、一ユーザの Iranoan です。
> 「SAVEAS;」を実行した時にはファイル名が空っぽで
> ダイアログボックスが出てくる訳ですが、それでは寂しいので、Subject:ヘッダ
> からファイル名相当の物を自動生成して、それをダイアログボックスにセットす
> るような処理をしています。
 この事を知りませんでした(^^;。
 回答有り難うございます。

[ ]
RE:38013 マクロ:SAVEASが開くフォルダNo.38015
秀まるお2 さん 10/03/08 15:41
 
>  それと、レジストリの"ExportDir"を書き換えて

 "ExpDir"の間違いでした。


 言い訳になりますが…

 "ExpDir"の内容が壊れてることが原因で「ファイル・エクスポート...」を実
行した時に何度でも繰り返し落ちてしまう、というバグが以前あって、それに対
処するために入れた処理が原因でレベルダウンとなってしまったのでした。

[ ]
RE:38015 マクロ:SAVEASが開くフォルダNo.38016
秀まるお2 さん 10/03/08 18:36
 
 先ほどアップロードしたV5.34β9を使っていただければ、最初のマクロのまま
でうまくいくんじゃないかと思います。

 なんだかんだで秀丸メールのバグだったということで…。お手数かけてすみま
せん。

32bit版:
http://hide.maruo.co.jp/software/bin/hmmail534b9_signed.exe

[ ]
RE:38016 マクロ:SAVEASが開くフォルダNo.38017
hirahira さん 10/03/08 19:25
 
> 先ほどアップロードしたV5.34β9を使っていただければ

秀まるお2様、いつもお世話になっております。

V5.34β9使用しました。

これまでも、上手く行くときと行かないときがあり、

上手く行かなかったときは、そのあと何度試しても、

ダメだったのですが、V5.34β9では、これまでのところ、100%OKです。

ただし、マクロの実行速度が極端に落ちたような気がします。

わたしのマクロだけでしょうか??


[ ]
RE:38017 マクロ:SAVEASが開くフォルダNo.38018
秀まるお2 さん 10/03/08 20:20
 
> ただし、マクロの実行速度が極端に落ちたような気がします。

 これは、今回のSAVEAS;をするマクロの話じゃなくて、何かもっと高速にルー
プするようなマクロでの話ですかね。

 何か具体的に遅くなったマクロの例か、あるいはそのマクロがどんな関数呼び
出ししてるかなんか教えていただけるとこちらでも再現出来るかもしれませんけ
ども…。

 あと、具体的にどのバージョンと比べて遅くなったのかも教えて欲しいです。

 こちらで簡単にテストする例として、例えば

    loaddll "tkinfo.dll";
    #c = dllfunc("MailCount");
    #i = 0;
    while( #i < #c ) {
         #n = dllfunc("SetMailIndex", #i);
         #i = #i + 1;
    }

 ってマクロをメールが1000通くらいあるフォルダで実行したら、V5.33と
V5.34β9とで特に速度が違うということは無いようでした。

 一度Windowsを再起動して試していただくと、速度が違ったりするかもしれな
いです。

[ ]
RE:38018 マクロ:SAVEASが開くフォルダNo.38020
hirahira さん 10/03/08 21:30
 
> あと、具体的にどのバージョンと比べて遅くなったのかも教えて欲しいです。

V5.34β8を動かした後に、V5.34β9を動かして、

極端に遅くなったような気がしましたが、

一度Windowsを再起動して試したところ、あまり変わりませんでした。

お騒がせして大変申し訳ありません。m(_ _)m


[ ]