【質問】素人ですが、dllfuncstrの仕様なNo.03071
TATE2 さん 11/11/14 15:00
 
秀まるおさん

TATEです。

以前、Toアドレスをアドレス帳に登録された並びでソートする
マクロをご提供いただいたと思うのですが、Toアドレスが大量
にある場合に、うまくソートされません。
これは、$to = dllfuncstr("CurrentHeader","To");の文字数に
制限があるためでしょうか?
ちなみに、Toアドレスの文字数は140人で4370文字あり
ました。
素人な質問で恐縮ですが、よろしくお願いします。


このマクロは重宝しているので大量にToアドレスがある場合も
使いたいところです。

以下が使用しているマクロになります。
-------------------------------------------------------------
    loaddll "tkinfo.dll";
    $to = dllfuncstr("CurrentHeader","To");
    #c = dllfunc("CountEmailList", $to);
    #i = 0;
    while( #i < #c ) {
        $email[#i] = dllfuncstr("GetEmailList", $to, #i);
        #x[#i] = dllfunc("FindBookX", dllfuncstr("SetEmailOnly",$email[#i]));
        if( #x[#i] == 0 ) {
            #x[#i] = 99999;
        }
        #i = #i + 1;
    }
    #i = 0;
    while( #i < #c - 1 ) {
        #j = #i + 1;
        while( #j < #c ) {
            if( #x[#i] > #x[#j] ) {
                $temp = $email[#i];
                $email[#i] = $email[#j];
                $email[#j] = $temp;
                #temp = #x[#i];
                #x[#i] = #x[#j];
                #x[#j] = #temp;
            }
            #j = #j + 1;
        }
        #i = #i + 1;
    }
    $to = $email[0];
    #i = 1;
    while( #i < #c ) {
        $to = $to + ", " + $email[#i];
        #i = #i + 1;
    }
    #n = dllfunc("SetHeader", "To", $to);

[ ]
RE:03071 【質問】素人ですが、dllfuncstrNo.03072
秀まるお さん 11/11/14 16:51
 
 たしかにdllfuncstrで受け渡し出来る文字列には長さ制限があって、なんまり
長いと勝手にカットされてしまいます。

 長さ的には8キロバイト程度(半角文字で8000文字程度)まではいけるはずで
はあります。4370文字というのが半角文字だけでの文字数だとしたら、普通は大
丈夫じゃないかと思います。

 全角文字とか、あとShift-JIS範囲外の文字(ユニコード文字)があると、も
っと極端に文字数が減ったりします。

 この制限はどうしようも無いので、しいてなんとかするとしたら、

    $to = dllfuncstr("CurrentHeader","To");

 の後に、

   if( strlen($to) >= 8000 ) {
       message "To:ヘッダの内容が長すぎて処理出来ません。";
       endmacro;
   }

 の処理を入れてマクロを止めるしか無いかと思います。

 dllfuncstrやdllfuncでのパラメータ/返り値の長さ制限については、一応秀
丸担当にもっと緩和してもらうようにだけ要望してみます。

[ ]
RE:03072 【質問】素人ですが、dllfuncstrNo.03073
秀まるお さん 11/11/14 23:12
 
 もう一度マクロを見直してみたんですが、文字列の長さが長すぎて処理しきれ
なかった場合には、To:ヘッダが途中で切れてしまうような結果になってしまう
と思います。

 「ソートされない」というだけであれば、一応、文字列の長さ制限的には問題
ないんじゃないかと思います。

 ソートされない原因(あるいはソートされるけど期待した順序じゃない?)と
いうのは、FindBookX関数の返り値がおかしいってことなのかもしれませんけど
も、そうだとして、それはTo:ヘッダの長さが非常に長いこととは関係無いよう
な気もします。(とりあえず8キロバイト未満なら)

 ということで、ちょっと分からなくなりました。

[ ]
RE:03073 【質問】素人ですが、dllfuncstrNo.03074
秀まるお さん 11/11/15 10:38
 
 dllfuncstrでCurrentHeader関数呼び出しをすると8キロバイトで切れてしま
う件についてですが、よくよく調べてみたら、これは秀丸エディタ相当部分の制
限ではなくて、tkinfo.dll側が勝手に8キロバイトで切ってしまってるという制
限でした。

 ということで、これについては簡単に直せるので、さっそく修正させていただ
きます。

 今回のうまくいかない件がそれで直るかどうか分からないのですが、とりあえ
ず次のβ版でもダメかどうかテストしていただけると、たしかに文字列長さの制
限のせいでダメだったのかどうかが見極められていいかなぁという気がします。

[ ]
RE:03074 【質問】素人ですが、dllfuncstrNo.03075
TATE2 さん 11/11/15 15:09
 
秀まるおさん

TATEです。

いろいろとお手数をお掛けして恐縮です。
よく調べてみたら、ソートする前に、以下のマクロでヘッダを
整形する処理を入れていましたが、このマクロでヘッダが切れ
るようでした。
こちらの確認不足で大変申し訳ありません。


ただ、素人なのでこのマクロを見ても、なぜヘッダが切れるか
はわかりませんでしたので、他の同様のマクロをライブラリか
ら探して確認中です。

あと、マクロの関数の中に、文字列の先頭と末尾にある空白を
削除するものはないものでしょうか?
ヘルプを探したのですが見つかりませんでした。
EXCELのtrimのような関数があれば助かります。





--------------------------------------------------------
//
//   鶴亀メール メアド名前付加マクロ   ver 0.02β
//
// このマクロは、(サイトー企画)鶴亀メール専用です!!
//
// 注1:ふり〜だけど無断転載は禁ず
// 注2:バグっても責任は取りません(^^ゞ
//
//          2001/10/16 y.iida
//

// 鶴亀の決まり
call Turukame;
if  ( !##return ) { endmacro; }

// エディタじゃないとダメ
if( dllfunc("IsTuruKameMain") ){
 message "エディタから起動してください";
 freedll;
 endmacro;
}

$Head[0] = "To: ";
$Head[1] = "Cc: ";
$Head[2] = "Bcc:";

#i = 0;
while( #i < 3){
 call GoTo_cursor $Head[#i];
 if (##return == 1){
  call Email_Only;
 }
 #i = #i + 1;
}

moveto 0,0;
#ret = dllfunc("ClearUpdated");  //更新フラグ解除
freedll;
endmacro;

// ------------------------- //
//
// 鶴亀用DLLをロードする
//
// 引数 : なし
// 戻り :  0=エラー  1=正常
//
Turukame:
 // DLL を Load する
 openreg "CURRENTUSER","Software\\Hidemaruo\\TuruKame\\Config";
 if( !result ) {
  message "鶴亀がインストールされてないにょ";
  return 0;
 }
 closereg;

 loaddll "tkinfo.dll";
 if( !result ) {
  message "DLLロードに失敗";
  return 0;
 }
return 1;

// ------------------------- //
//
// 指定行の10ColumnへCursorを移動する
//
// 引数 : To: / Cc: / Bcc: の文字列
// 戻り :  0:指定ヘッダー無し   1:有り    -1:???
//
//GoTo_cursor:
// moveto 0, -999;
// golinetop;
// while(true){
//  if (( x == 0 ) && (code == 0x0d)){
//   return 0;
//  }
//  if ( dllfuncstr( "ToUpper", gettext( 0, y, 4, y))
//    == dllfuncstr( "ToUpper", $$1 )){
//   moveto 10,y;
//   return 1;
//  }
//  golineend2;
//  down;
//  golinetop2;
// }
//return -1;
//
// ------------------------- //
//
// 宛先文字列を取り出しアドレスだけにして貼り付まで行う
//
// 引数 : なし
// 戻り :  なし
//
Email_Only:
 beginsel;
 golineend2;
 cut;
 beginclipboardread;
 $$adr = getclipboard;
 ##n =dllfunc("CountEmailList", $$adr);
 if (##n == 0){
  insert $$adr;
  return;
 }

 ##i = 1;
 while( ##i <= ##n ) {
  ##j = ##i - 1;
  $$tmp = dllfuncstr( "GetEmailList", $$adr , ##j );
  $$adr_tbl[##i] = "";
//
//メールアドレスだけにするのは中止
//  $$adr_tbl[##i] = dllfuncstr("SetEmailOnly",$$tmp );
//
//メールアドレスにアドレス帳の名前を付加する。
  $$adr_tbl[##i] = dllfuncstr("FindBookNote",$$tmp ) + " " + dllfuncstr("Fin
dBook3",$$tmp );

  ##i = ##i + 1;
 }

 $$adr1 = "";
 ##i = 1;
 while( ##i <= ##n ) {
  if ( ##i != ##n ){
   $$adr1= $$adr1 + $$adr_tbl[##i] + "\, ";
  }
  else {
   $$adr1= $$adr1 + $$adr_tbl[##i];
  }
  ##i = ##i + 1;
 }

insert $$adr1;
return;

[ ]
RE:03075 【質問】素人ですが、dllfuncstrNo.03076
TATE2 さん 11/11/15 15:15
 
すいません。
添付するマクロを間違っていました。
GoTo_cursorをコメントアウトしていないのが正しいです。



//
//   鶴亀メール メアド名前付加マクロ   ver 0.02β
//
// このマクロは、(サイトー企画)鶴亀メール専用です!!
//
// 注1:ふり〜だけど無断転載は禁ず
// 注2:バグっても責任は取りません(^^ゞ
//
//          2001/10/16 y.iida
//

// 鶴亀の決まり
call Turukame;
if  ( !##return ) { endmacro; }

// エディタじゃないとダメ
if( dllfunc("IsTuruKameMain") ){
 message "エディタから起動してください";
 freedll;
 endmacro;
}

$Head[0] = "To: ";
$Head[1] = "Cc: ";
$Head[2] = "Bcc:";

#i = 0;
while( #i < 3){
 call GoTo_cursor $Head[#i];
 if (##return == 1){
  call Email_Only;
 }
 #i = #i + 1;
}

moveto 0,0;
#ret = dllfunc("ClearUpdated");  //更新フラグ解除
freedll;
endmacro;

// ------------------------- //
//
// 鶴亀用DLLをロードする
//
// 引数 : なし
// 戻り :  0=エラー  1=正常
//
Turukame:
 // DLL を Load する
 openreg "CURRENTUSER","Software\\Hidemaruo\\TuruKame\\Config";
 if( !result ) {
  message "鶴亀がインストールされてないにょ";
  return 0;
 }
 closereg;

 loaddll "tkinfo.dll";
 if( !result ) {
  message "DLLロードに失敗";
  return 0;
 }
return 1;

// ------------------------- //
//
// 指定行の10ColumnへCursorを移動する
//
// 引数 : To: / Cc: / Bcc: の文字列
// 戻り :  0:指定ヘッダー無し   1:有り    -1:???
//
GoTo_cursor:
 moveto 0, -999;
 golinetop;
 while(true){
  if (( x == 0 ) && (code == 0x0d)){
   return 0;
  }
  if ( dllfuncstr( "ToUpper", gettext( 0, y, 4, y))
    == dllfuncstr( "ToUpper", $$1 )){
   moveto 10,y;
   return 1;
  }
  golineend2;
  down;
  golinetop2;
 }
return -1;
//
// ------------------------- //
//
// 宛先文字列を取り出しアドレスだけにして貼り付まで行う
//
// 引数 : なし
// 戻り :  なし
//
Email_Only:
 beginsel;
 golineend2;
 cut;
 beginclipboardread;
 $$adr = getclipboard;
 ##n =dllfunc("CountEmailList", $$adr);
 if (##n == 0){
  insert $$adr;
  return;
 }

 ##i = 1;
 while( ##i <= ##n ) {
  ##j = ##i - 1;
  $$tmp = dllfuncstr( "GetEmailList", $$adr , ##j );
  $$adr_tbl[##i] = "";
//
//メールアドレスだけにするのは中止
//  $$adr_tbl[##i] = dllfuncstr("SetEmailOnly",$$tmp );
//
//メールアドレスにアドレス帳の名前を付加する。
  $$adr_tbl[##i] = dllfuncstr("FindBookNote",$$tmp ) + " " + dllfuncstr("Fin
dBook3",$$tmp );

  ##i = ##i + 1;
 }

 $$adr1 = "";
 ##i = 1;
 while( ##i <= ##n ) {
  if ( ##i != ##n ){
   $$adr1= $$adr1 + $$adr_tbl[##i] + "\, ";
  }
  else {
   $$adr1= $$adr1 + $$adr_tbl[##i];
  }
  ##i = ##i + 1;
 }

insert $$adr1;
return;

[ ]
RE:03076 【質問】素人ですが、dllfuncstrNo.03077
秀まるお さん 11/11/15 15:49
 
 たぶんメールアドレスに名前を付ける処理の関係で、どこかのタイミングで文
字列の長さが8キロバイトを超えて、それでヘッダが切れたんだと思います。

 CurrentHeader関数の返値が8キロバイトで切られてしまうのを直したついで
にdllfunc/dllfuncstrパラメータの長さ制限ももっと大きくしてから次のβ版を
アップロードさせていただきます。

 ちょっと今日は無理そうなんで、少々お待ちください。

[ ]
RE:03077 【質問】素人ですが、dllfuncstrNo.03078
TATE2 さん 11/11/15 17:34
 
TATEです。

ご確認ありがとうございました。
急ぎませんので、そちらのペースでお願いします。


[ ]
RE:03077 【質問】素人ですが、dllfuncstrNo.03079
TATE2 さん 11/11/16 09:49
 
TATEです。

ちょっと気になったので確認させてください。

使用させていただいてマクロは、クリップボードを
利用してToCcBccアドレスを書き換えていま
したが、マクロからクリップボードへの操作上には
文字数の制限とかないのでしょうか?

クリップボードを使用されていたので、undoが
効いて便利ではあったのですが。



[ ]
RE:03079 【質問】素人ですが、dllfuncstrNo.03080
秀まるお さん 11/11/16 12:08
 
 クリップボードへのcopyとかpasteとか、あとaddclipboard命令とかの類では
文字数制限は無いです。

[ ]
RE:03080 【質問】素人ですが、dllfuncstrNo.03081
TATE2 さん 11/11/17 09:41
 
TATEです。

ご教示ありがとうございました。



[ ]
RE:03074 【質問】素人ですが、dllfuncstrNo.03082
TATE2 さん 11/11/18 09:22
 
TATEです。

秀丸メールの5.72β20で、以下の対応をいただき、ありがとう
ございました。
別のアドレス処理マクロでも切れていたのが正常に動作するよう
になりました。
ただ、ここにアップさせていただいたマクロは、文字が切れる
問題は解消しなかったので、別の問題のようです。

あと、制限を解除いただいていますが、文字数の制限チェックは
しなくてもよいものでしょうか?
--------------------------------------
・CurrentHeader関数の返り値が8キロバイトで切られてしまっていた制限解除。
・ToUpper/ToLower/RootBodyLine関数の返り値も8キロバイトで切られていた制限解
除。
・秀丸マクロでのdllfunc/dllfuncstr関数でのパラメータの長さが32キロバイト以
下までしか扱えなかった制限解除。
--------------------------------------

[ ]
RE:03082 【質問】素人ですが、dllfuncstrNo.03083
秀まるお さん 11/11/18 15:16
 
> ただ、ここにアップさせていただいたマクロは、文字が切れる
> 問題は解消しなかったので、別の問題のようです。

 何かこちらでも再現るようなサンプルがあると助かりますけども…。特定の
メールアドレスの所だけ切れるのか、最終的なTo:ヘッダの後半途中から切れる
のか…。あるいはアドレス帳に登録してある名前を拾ってこようとして、その名
前の途中が切れるのか…。いろいろありますけども。

> あと、制限を解除いただいていますが、文字数の制限チェックは
> しなくてもよいものでしょうか?

 今回のバージョンからは一切チェックはいらないです。

 ということでお願いします。

[ ]