なぜか削除できないNo.04591
CXYZ さん 05/02/23 17:52
 
 皆さん今晩は、CXYZです。
 以前こちらで相談させていただいた広告捜索用正規表現

http://www.maruo.co.jp/hidesoft/4/x04252_.html#4252

を、拙いマクロに取り込んで動かせるようになってからずいぶん時間がたってし
まいました。
 ずっと、その広告部分を選択し削除させることができず、うなり続けていまし
た。しかし、最近やっと「検索での表示:範囲選択」にしなければならないとい
うのを見過ごしていたことに気づき、そのように設定を変更して、以下のマクロ
を下の広告に試しています。

-------------- ここから --------------
loaddll"tkinfo.dll"; //dllをロード
// メール一覧上でしか動けません。
gofiletop; // メール先頭へ移動
#noa=0; // 広告の検出数。偶数で1件。
$sp1="^[^A-Za-z0-9ぁ-んァ-ヶ亜-\xFC\x4B]+(pr|ad)+[^A-Za-z0-9ぁ-んァ-ヶ亜
-\xFC\x4B]+$";
$sp2="^(?<=[\x20\x81\x40]?)[^A-Za-z0-9ぁ-んァ-ヶ亜-\xFC\x4B\x20\x81\x40]+[^A
-Za-z0-9ぁ-んァ-ヶ亜-
\xFC\x4B\x20\x81\x40]+$";
$URL="(http://|ww[w0-9]+|[0-9]{3}\.([0-9]+\.+))"; // トリガー文字 | IPア
ドレス

#n=dllfunc("BeginEditMail");
#ROS=readonly; // read onlyの現在の値
#BMS=browsemode; // browsemodeの現在の値
if (#ROS!=1) {
readonlyswitch;
}
if (#BMS!=1) {
browsemodeswitch;
}
if (#ROS!=0&&#BMS!=0) {
message "メールの書き換えを可能にしました。";
}

tsr: // top searching routine
message "PRからPRまでが異様に長くても今のところ対策を講じていません。";
searchdown2 $sp1 ,nocasesense, regular;
#ITSS=result; // Is top search successed
if (#ITSS==0)
{
if (#noa>0)
{
message "これ以上見つかりません。";
message str((#noa/2))+"件の広告が見つかりました。";
endmacro;
}
message "広告は見つかりませんでした。";
endmacro;
}

else // 以下は検索成功時の処理
{
#noa=#noa+1;
message "広告の先頭部を検出。";
moveto 0,y;
message "カーソルを"+str(y)+"行目の"+str(x)+"枡目に移動";
#asl=y; // ad start line
searchdown $sp1 ,nocasesense ,regular; // 同一の枠検索
#IESS=result; // is end search successed
if (#IESS==0)
{
message "同じ枠は見つかりませんでした。URL行に近い記号だけの行を検索しま
す。";
searchdown $URL ,nocasesense ,regular; // 下枠検索に備えてURL検索
#IUSS=result; // is URL search successed
if (#IUSS==0)
{
message "URL検出失敗。";
endmacro;
}
else // URLが見つかった場合は
{
moveto 0,y;
#URLp=y;
message str(#URLp)+"行目にURLが見つかりました。";
searchdown $sp2 ,nocasesense ,regular; // その次の記号だけの行を検索
#IESS2=result; // is end search successed
if (#IESS2==0)
{
message "記号だけの行は存在しませんでした。";
endmacro;
}
else
{
message "終了枠と思しき部分を発見しました。";
#noa=#noa+1;
}}}
else
{
#noa=#noa+1;
moveto 0,y+1;
#eal=y; // end ad line
$ad_content=gettext(0,#asl,0,#eal);
message str((#eal-#asl))+"行を広告と判断。";
message "内容は以下の通りです。\n"+$ad_content;
moveto 0,#asl;
beginsel;
moveto 0,#eal;
// endsel; // 在っても結果に影響なし
delete;
#SEM=dllfunc("SaveEditMail",1,1);
message "書き換え結果コードは"+str(#SEM)+"です。";
moveto 0,#eal; // 削除が働かないようなので、強引ながら今のところこれで凌

goto tsr;
}}
-------------- ここまで --------------

------------- 広告ここから ---------------
┏ ┏ ┏ ┏ ┏ ┏ ┏   [★]100歳まで長生きしても安心!
 保 障 は 一 生 涯 !  [★]保険料最大50%割引って?
  ┛ ┛ ┛ ┛ ┛ ┛ ┛ [★]1泊2日入院から保障!
■安田火災ひまわり生命がご提供する、終身医療保険のベストセラーです。
 資料のご請求は http://211.10.20.135/a/a.cgi?k03350Am00158

========================================================[ ▲PR ]====
------------- 広告ここまで ---------------

 まともにヒットしているように見え、かつ削除もできている(SaveEditMailの
返り値が1なので)と思うのですが、何度試してもメールに変更が加わりません。
 フォーラムからメール本文を削除するマクロを検索してみるのですが、自分の
物との違いが(ソースがきれいであるということの他に)見つけられません。
 大変見苦しいソースなのですが、よろしければ、なぜ削除できないのかをお教
えいただけないでしょうか。

## 初めからサブルーチンを使った方法で書いておけば、すっきりさせられてよ
かったんでしょうが、マクロらしいマクロへの初挑戦だったので挫折しました。
(苦笑)

[ ]
RE:04591 なぜか削除できないNo.04592
秀まるお2 さん 05/02/23 21:58
 
 readonlyswitchとbrowsemodeswitchする条件が逆みたいですけど。

   #readonly = readonly;
   if( #readonly ) {
       readonlyswitch;
   }
   #browsemode = browsemode;
   if( #browsemode ) {
       browsemodeswitch;
   }

 ってな処理になります。普通。

[ ]
RE:04592 なぜか削除できないNo.04593
CXYZ さん 05/02/23 23:13
 
秀まるおさん今晩は、いつもお世話になっていますCXYZです。
>  readonlyswitchとbrowsemodeswitchする条件が逆みたいですけど。
 は、はい。確かに逆みたいです。 SaveEditMailの値に気をとられてずっと気
づきませんでした。(苦笑)

>    #readonly = readonly;
>    if( #readonly ) {
>        readonlyswitch;
>    }
>    #browsemode = browsemode;
>    if( #browsemode ) {
>        browsemodeswitch;
>    }
>
>  ってな処理になります。普通。
 そのように書き換えてみたのですが、まだだめみたいです。これはこちらの
コーディングの問題として、もうちょっと冷静に見てみます。
 それと、これは相当初歩的なことだと思うのですが…。

>    if( #readonly )
>    if( #browsemode )
 このばあい、どちらか(あるいは両方)が期待と逆の値を持ち帰っても ...
switch が実行されるのではないかと思います。(もちろん、フォーラムなどで
はよく見かけますので、この書き方に問題がないことは分かります。)
 この手法には、なにか暗黙の了解的なものがあるのでしょうか。(たとえば
if文で式がなく変数だけの場合は肯定的にとらえるとか)
 一応、秀丸Q&Aとそれぞれのマクロヘルプには(初心者用にも)目を通したつ
もりなのですが、上記のような書き方の説明を見つけることができませんでした。

ーーーーーーーーーーーーーーーーーーーーーーーーー
loaddll"tkinfo.dll";
#wro=readonly;
message str(#wro)+"です。1なら読み取り専用、0なら書き込み可能を表しま
す。";
if (#wro) {
readonlyswitch;
message str(#wro)+"です。";
}
endmacro; 
ーーーーーーーーーーーーーーーーーーーーーーーーー

 メールを編集中にこのマクロを実行すると、メッセージは一度しか出ないので、
デフォルトでは1が入るということでよろしいでしょうか。

[ ]
RE:04593 なぜか削除できないNo.04594
秀まるお2 さん 05/02/24 10:21
 
 if文の中は、つまり、その中の値が0以外なら「真である」という扱いになり
ます。

 例えば、

   if( 0 ) messsage "A";

 というのは何もメッセージ表示されませんが、

   if( 1 ) messsage "A";
   if( 2 ) messsage "A";

 等はメッセージが出てきます。

 ちなみにですけど、「==」というのも実は「+」などの演算子の仲間でして、
つまり、

    #n = (#a == #b)

 と書いた場合には、#aと#bの値が一致してれば#nには1が入り、そうでない場
合は#nには0が入ります。&&や||もそういう演算子の1つです。

 C言語のif文と同じ仕組みなので、もしこの辺の仕組みが分からなければ、C言
語でのif文の説明とかを参考にして欲しいです。

[ ]
RE:04594 なぜか削除できないNo.04595
CXYZ さん 05/02/24 20:55
 
秀まるおさん今晩は、CXYZです。
 ご説明ありがとうございます。理解できました。
 C言語の書き方を勉強する、そうですよね。ヘルプにしっかり「C言語方式」っ
て書いてあるのに(苦笑)。
 これで、マクロが(今の状態から不要部分を削るだけでも)すっきりしそうで
す。本当にありがとうございます。
 質問の内容がいつも根源に関わるようなことばかりですみません。

[ ]