もくじ
秀まるおのマクロサーバ Version 1.2

概要	利用方法

共通サービス

ファイルサービス

ダイアログサービス

共通サービス

　ddeexecuteコマンド一覧：

exit	マクロサーバの終了

　dderequest項目一覧

result	結果コード

ファイルサービス（サービス名＝"FileService"）

　ddeexecuteコマンド一覧：

setcurdir	カレントディレクトリの設定

copy	ファイルのコピー

appendcopy	ファイルの連結

appendcopytext	テキストファイルの連結

rename	ファイル名の変更

delete	ファイルの削除

runなど	プログラムの起動

enumfile	ファイル一覧取得の開始

enumdir	サブディレクトリ一覧取得の開始

　dderequest項目一覧

isreadonly	書き換え禁止の問い合わせ

sizeof	サイズの問い合わせ

timestampof	ファイルの日付の問い合わせ

timecountof	ファイルの1980年1月1日から時間

existfile	ファイルの存在の問い合わせ

findnext	ファイル一覧の取得

　ddepoke項目一覧

なし

ダイアログサービス（サービス名＝"DlgService"）

　ダイアログ作成の概要

　サンプルマクロ

　ddeexecuteコマンド一覧：

dialog	ダイアログを出す

enddialog	ダイアログを消す

　dderequest項目一覧

getstate	コントロールの状態の問い合わせ

getstring	コントロールの文字を獲得

　ddepoke項目一覧

newdialog	新しいダイアログを配置

newcontrol	新しいコントロールを配置

item	コントロール内の項目を追加

height	コントロールの高さを変える

default	コントロールの初期状態

notify	通知コードを決める

newcolumn	新しい縦の列

newpage	新しい横の列

part	使用する幅を一時的に変える

　アドバイズ項目一覧

dlgresult	ダイアログの結果を受け取る


概要

　秀まるおのマクロサーバ（macserv.exe）は、秀丸や秀TermなどのＤＤＥクライアント機能も持ったマクロ言語から呼び出してファイルの操作、問い合わせなどを行うためのＤＤＥサーバアプリケーションです。マクロサーバ単体では何もすることはできません。

　マクロサーバの使い方については、秀丸マクロから呼び出して使う例を上げて説明します。


利用方法

　マクロサーバのサービスを利用するには、まずマクロサーバが起動されている必要があります。マクロサーバは二重に起動させようとしても１つしか起動できない仕組みになっているので、起動の際は単純にrunで起動すればいいです。

　例：

run "macserv.exe";

　マクロサーバが起動されるとアイコンになって画面に現れます。macserv.exe起動時のオプションとして/hというのがあります。これを指定すると、マクロサーバは見えない状態で起動されます。

　例：

run "macserv.exe /h";

　マクロサーバが起動したら、次に利用したいサービス名を指定してddeinitiateしてください。

　サービスとして現在提供されているのは"FileService"と"DlgService"です。アプリケーション名は"HideMacroServer"です。

　でも実はサービス名に"AllService"を指定すると、全てのサービスを利用することができるようになっています。

　例：

ddeinitiate "HideMacroServer", "FileService";

　マクロサーバ自体のカレントドライブ／カレントディレクトリは、クライアントアプリケーションと同じであるとは限らないので、一般にddeinitiate直後にddeexecuteでsetcurdirを実行させてください。

例：

ddeexecute "setcurdir " + directory;

　マクロサーバの利用が終わったら、ddeexecuteでexitを実行させて、マクロサーバを終了させてください。

　例：

ddeexecute "exit";

　クライアントアプリケーション側では特にddeterminateする必要はありません。（マクロサーバが終了する時にクライアント側にＤＤＥ打ち切りが通知されます）

　サポートされてないコマンドをexecuteしようとしたり、サポートされてない項目でrequestしようとしたりするとエラーになります。

　executeでの終了コードは、エラーが発生した場合はエラー、そうでない場合は正常終了となります。秀丸の場合だと、ddeexecuteの直後でresultで条件判定できます。

ddeexecute "copy abc.txt xyz.txt";

if( !result ) {

message "copy failed. error code = " + dderequest( "result" );

endmacro;

}


setcurdir（カレントディレクトリの設定, FileService, execute）
setcurdir （カレントドライブ／カレントディレクトリの設定）

FileService, execute

　setcurdirは、マクロサーバのカレントドライブ／カレントディレクトリを設定します。パラメタでパスを指定してください。ドライブ名を含むフルパスが指定されている必要があります。

　例：

ddeexecute "setcurdir c:\\";


copy（ファイルのコピー, FileService, exexute）
copy （ファイルのコピー）

FileService, execute

　copyは、ファイルをコピーします。第一パラメタでコピー元のファイル名を指定して、第二パラメタでコピー先のファイル名を指定してください。

　例：

ddeexecute "copy " + $filename1 + " " + $filename2;


appendcopy（ファイルの連結, FileService, exexute）
appendcopy （ファイルの連結）

FileService, execute

　appendcopyは、第１パラメタで指定されたファイルに第２パラメタで指定されたファイルを連結します。第２パラメタで指定したファイルはそのまま残ります。

　例：

ddeexecute "appendcopy " + $filename1 + " " + $filename2;


appendcopytext（テキストファイルの連結, FileService, exexute）
appendcopytext （テキストファイルの連結）

FileService, execute

　appendcopytextは、第１パラメタで指定されたファイルに第２パラメタで指定されたファイルを連結します。第２パラメタで指定したファイルはそのまま残ります。

　ファイルの連結はEOF制御文字を意識して行われます。

　例：

ddeexecute "appendcopytext " + $filename1 + " " + $filename2;


rename（ファイル名の変更, FileService, exexute）
rename （ファイル名の変更）

FileService, execute

　renameは、ファイル名を変更します。第一パラメタでコピー元のファイル名を指定して、第二パラメタで新しいファイル名を指定してください。

　renameは、ドライブ内のディレクトリ間の移動に使うこともできます。

　例：

ddeexecute "rename " + $filename1 + " " + $filename2;


delete（ファイルの削除, FileService, execute）
delete（ファイルの削除）

FileService, execute

　deleteは、ファイルを削除します。パラメタでファイル名を指定してください。

例：

ddeexecute "delete abc.txt";


runなど（プログラムの起動）

FileService, execute

　run, iconrun, maxrun, hiderunは、パラメタで指定されたプログラムを起動します。

run	普通にプログラムを起動

iconrun	アイコン状態で起動

maxrun	最大化して起動

hiderun	見えない状態で起動

例：

ddeexecute "iconrun winfile.exe";


exit（マクロサーバの終了, 共通サービス, execute）
exit（マクロサーバの終了）

共通サービス, execute

　exitは、マクロサーバを終了させます。DDEの対話も自動的に中断させられるので、クライアント側ではこのあと特にddeterminateの処理をする必要はありません。

　このexitは、マクロサーバが提供するすべてのサービスのどこでも利用することができます。（といっても今の所FileServiceしかないですが）

例：

ddeexecute "exit";


enumfile（ファイル名一覧取得の開始, FileService, execute）
enumfile（ファイル名一覧取得の開始）

FileService, execute

　enumfileは、パラメタで指定したワイルドカードにマッチするファイル名一覧取得の開始を行います。実際にファイル名を受け取るにはdderequestのfindnextを使います。ファイル名以外の情報についてはfindnextした後にtimestampofやsizeofでファイル名を指定しないで使えばそのファイルについての情報を得ることができます。

　ワイルドカードはセミコロンで区切って複数指定することもできます。

例：

ddeexecute "enumfile *.*"

#i = 0

while(1) {

$name[#i] = dderequest( "findnext" );

if( $name[#i] == "" ) breakloop;

#size[#i] = dderequest( "sizeof" );

#i = #i + 1;

}

参照：findnext, isreadonly, sizeof, timestampof, timecountof, enumdir


enumdir（サブディレクトリ名一覧取得の開始, FileService, execute）
enumdir（サブディレクトリ名一覧取得の開始）

FileService, execute

　enumdirは、パラメタで指定したワイルドカードにマッチするサブレィレクトリ名一覧取得の開始を行います。実際にサブディレクトリ名を受け取るにはdderequestのfindnextを使います。

　通常のディレクトリの場合は必ず"."と".."が見つかります。

例：

ddeexecute "enumdir *.*"

#i = 0

while(1) {

$name[#i] = dderequest( "findnext" );

if( $name[#i] == "" ) breakloop;

#i = #i + 1;

}

参照：findnext,  enumfile


result（結果コード, 共通サービス, request）
result（結果コード）

共通サービス, request

　resultは、直前に実行したコマンド（executeで実行したもの）の結果を返します。

　成功している場合は""、失敗している場合は""以外の何らかの数値（の文字列）を返します。

例：

ddeexecute "copy abc.txt xyz.txt";

if( dderequest( "result" ) != "" ) {

message "ファイルのコピーが失敗しました。";

}


isreadonly（書き換え禁止かどうかの問い合わせ, FileService, execute）
isreadonly（書き換え禁止かどうかの問い合わせ）

FileService, request

　isreadonlyは、パラメタで指定されたファイルが書き換え禁止（read only）かどうかを調べて、その結果を返します。

　書き換え禁止の場合は"!"、そうでない場合は""を返します。ファイルが見つからなかった場合も""を返します。

　findnextをリクエストした後でファイル名を指定しないでリクエストするとfindnextしたファイルについての情報を返します。

例：

if( dderequest( "isreadonly abc.txt" ) != "" ) {

message "書き換え禁止です";

}


sizeof（ファイルのサイズの問い合わせ, FileService, request）
sizeof（ファイルのサイズの問い合わせ）

FileService, request

　sizeofは、パラメタで指定されたファイルのサイズを返します。findnextをリクエストした後でファイル名を指定しないでリクエストするとfindnextしたファイルについての情報を返します。

例：

#a = val( dderequest( "sizeof abc.txt" ) );

　ファイルが存在しない場合は""を返します。


timestampof（ファイルの日付の問い合わせ, FileService, request）
timestampof（ファイルの日付の問い合わせ）

FileService, request

　timestampofは、パラメタで指定されたファイルの日付と時刻を返します。

　日付と時刻は、以下のような形式で返されます。

  "94/09/11 11:23:30"　　（９４年９月１１日１１時２３分３０秒の場合）

　findnextをリクエストした後でファイル名を指定しないでリクエストするとfindnextしたファイルについての情報を返します。

例：

message dderequest( "timestampof abc.txt" );

　ファイルが見つからない場合は""を返します。


timecountof（ファイルの1980年1月1日から時間, FileService, request）
timecountof（ファイルの1980年1月1日から時間）

FileService, request

　timecountofは、ファイルのタイムスタンプを1980年1月1日0時0分0秒から、何秒経過しているかという値を２で割った値で返します。findnextをリクエストした後でファイル名を指定しないでリクエストするとfindnextしたファイルについての情報を返します。

　例：

#a = val( dderequest( "timecountof abc.txt" ) );


existfile（ファイルの存在の問い合わせ, FileService, request）
existfile（ファイルの存在の問い合わせ）

FileService, request

　existfileは、パラメタで指定されたファイルが存在するかどうかを返します。

　存在する場合は""以外の文字列、存在しない場合は""を返します。

例：

if( dderequest( "existfile abc.txt" ) != "" ) {

message "abc.txtは存在します";

}


findnext（ファイル名一覧の取得, FileService, request）
findnext（ファイル名一覧の取得）

FileService, request

　enumfileまたはenumdirで開始されたファイル取得処理をを１回行い、その結果を取り出します。ファイル名以外の情報についてはfindnextの後にsizeofやtimestampofをリクエストすると得ることができます。

参照：enumfile, enumdir


dialog（ダイアログを出す, DlgService, execute）
dialog（ダイアログを出す）

DlgService, execute

　ddepoke項目で設定されたダイアログの配置情報に基づき、ダイアログボックスを作成して表示します。

　パラメタにウィンドウハンドルを指定すると、親ウィンドウを指定することができます。ウィンドウハンドルは、１０進数の文字列で表記してください。パラメタを省略すると、親ウィンドウは指定されません。

　配置のしかたについては、ダイアログ作成の概要を参照してください。

　例：

//親ウィンドウなし

ddeexecute "dialog";

　例２：

//親ウィンドウあり

#hwnd = hidemaruhandle(0);

ddeexecute "dialog " + str(#hwnd);


enddialog（ダイアログを消す, DlgService, execute）
enddialog（ダイアログを消す）

DlgService, execute

　dialogコマンドで表示したダイアログボックスを消去します。


getstate（コントロールの状態の問い合わせ, DlgService, request）
getstate（コントロールの状態の問い合わせ）

DlgService, request

　コントロールの状態を問い合わせます。パラメタにコントロール名を指定して呼び出してください。コントロール名とは、newcontrolで指定したコントロールに名付けられた固有の名前です。

　この項目は、dialogコマンドが呼ばれた後でないと有効でありません。

　返す値は、コントロールの種類によって異なります。

　　リストボックス　　選択されている項目の番号（１から数えた値）

　　チェックボックス　"0"がチェックされていない、"1"がチェックされている

　　ラジオボタン　　　選択されている項目の番号（１から数えた値）

　　プッシュボタン　　無効

　　エディット　　　　数値が入力されていれば、その値

　例：

$a = dderequest("getstate MyCheckbox");


getstring（コントロールの文字を獲得, DlgService, request）
getstring（コントロールの文字を獲得）

DlgService, request

　コントロールの文字の状態を問い合わせます。パラメタにコントロール名を指定して呼び出してください。コントロール名とは、newcontrolで指定したコントロールに名付けられた固有の名前です。

　この項目は、dialogコマンドが呼ばれた後でないと有効でありません。

　返す文字は、コントロールの種類によって異なります。

　　リストボックス　　選択されている項目の内容

　　チェックボックス　無効

　　ラジオボタン　　　無効

　　プッシュボタン　　無効

　　エディット　　　　入力されている文字列

　例：

$a = dderequest("getstring MyEdit");


newdialog（新しいダイアログを配置, DlgService, poke）
newdialog（新しいダイアログを配置）

DlgService, poke

　　構文：ddepoke "newdialog", "[width],[title]";

　ダイアログ配置バッファを全て消去し、配置バッファ内に新しいダイアログを作ります。

　dialogコマンドを呼ぶ前に、必ずこの項目を設定しなくてはいけません。

　項目内容は、ダイアログの幅とタイトルをカンマで区切ります。幅は半角文字単位です。

　例：

ddepoke "newdialog", "40,ダイアログタイトル";


newcontrol（新しいコントロールを配置, DlgService, poke）
newcontrol（新しいコントロールを配置）

DlgService, poke

　　構文：ddepoke "newcontrol", "type,[controlname],[text]";

　ダイアログ配置バッファに新しいコントロールを配置します。newdialogを設定した後でないと有効ではありません。通常、コントロールの配置は、上から順番に、newdialogで指定された一定の幅で配置していきます。配置の流れを変えるには、newcolumn,newpage,partなどを指定すればできます。

　「type」は以下のものを指定できます。

　　list	リストボックスを配置

　　check	チェックボックスを配置

　　radio	ラジオボタンを配置（グループボックス付き）

　　button	プッシュボタンを配置

　　defbutton	プッシュボタンを配置（デフォルトプッシュボタン）

　　edit	エディットコントロールを配置

　　text	スタティックテキストを配置

　　okcancel	「OK」ボタンと「ｷｬﾝｾﾙ」ボタンを配置。

「OK」ボタンと「ｷｬﾝｾﾙ」ボタンは、それぞれ通知コードに１と０を返します。

　「controlname」は、そのコントロールに名付ける任意の名前です。この名前は、getstateまたはgetstringで問い合わせるときに使います。必要なければ省略可能です。

　「text」は、そのコントロールのテキスト（内容）です。リストボックスでは意味がありません。

　リストボックスとラジオボタンは、newcontrolの後にitemを設定してやらなくてはいけません。

　文字の前に'&'を付けると、Alt+文字で移動できるコントロールにすることができます。

　例：

ddepoke "newcontrol", "check,MyCheckbox1,チェックボックス１(&C)";


item（コントロール内の項目を追加, DlgService, poke）
item（コントロール内の項目を追加）

DlgService, poke

　　構文：ddepoke "item", "text";

　ダイアログ配置バッファの最新のコントロールに、コントロール内の項目を追加します。リストボックスとラジオボタンでしか意味がありません。

　複数の項目を追加する場合は何度でもやってください。

　例：

ddepoke "newcontrol", "list,MyList,";

ddepoke "item", "リストの項目１";

ddepoke "item", "リストの項目２";

ddepoke "item", "リストの項目３";


height（コントロールの高さを変える, DlgService, poke）
height（コントロールの高さを変える）

DlgService, poke

　　構文：ddepoke "height", "num";

　ダイアログ配置バッファの最新のコントロールの、高さを決めます。文字単位です。

　通常はこの項目を設定しなくても、適当な高さが選ばれます。リストボックスの高さを決めるときなどに使用してください。他のコントロールの高さを変えてもあまり意味がありません。

　例：

ddepoke "newcontrol", "list,MyList,";

ddepoke "height", "8";


default（コントロールの初期状態, DlgService, poke）
default（コントロールの初期状態）

DlgService, poke

　　構文：ddepoke "default", "num";

　ダイアログ配置バッファの最新のコントロールの、デフォルトの状態を決めます。コントロールの種類によって意味が異なります。

　　リストボックス　　最初に選択する項目の番号（１から数えた値）

　　チェックボックス　"0"がチェックされていない、"1"がチェックされている

　　ラジオボタン　　　最初に選択する項目の番号（１から数えた値）

　　プッシュボタン　　無効

　　エディット　　　　無効（初期状態はnewcontrolのtext で設定します）

　例：

ddepoke "newcontrol", "check,MyChecobox,チェックボックス１(&C)";

ddepoke "default", "1";


notify（通知コードを決める, DlgService, poke）
notify（通知コードを決める）

DlgService, poke

　　構文：ddepoke "notify", "num";

　ダイアログ配置バッファの最新のコントロールの、通知コードを決めます。

　通知コードは、コントロールが押されたときなど、DDEクライアントに通知されます。DDEクライアントが通知を受け取るときはアドバイズループに入っていなければなりません。通知が発生するとdlgresult項目が変更されます。dialogコマンドが呼ばれた後でないと通知されません。

　「num 」は１０進数の数値でなければいけません。（例："123"や"3000"）

　通知されるタイミングはコントロールの種類によって異なります。

　　リストボックス　　ダブルクリックされたとき

　　チェックボックス　押されたとき

　　ラジオボタン　　　押されたとき

　　プッシュボタン　　押されたとき

　　エディット　　　　無効

　例：

//ダイアログを作る

ddepoke "newcontrol", "button,,ボタン１";

ddepoke "notify", "1";

ddepoke "newcontrol", "button,,ボタン２";

ddepoke "notify", "2";

//アドバイズループ

ddeexecute "dialog";

ddestartadvice "dlgresult", $a;

while( strlen($a) == 0 ) {

ddewaitadvice $a, 100;

}

ddestopadvice "dlgresult";

ddeexecute "enddialog";

if( $a == "1" ) {

//ボタン１が押された

} else if( $a == "2" ) {

//ボタン２が押された

}


newcolumn（新しい縦の列, DlgService, poke）
newcolumn（新しい縦の列）

DlgService, poke

　　構文：ddepoke "newcolumn", "num";

　通常、コントロールの配置は上から順番に配置されていきますが、newcolumn項目を設定すると、次に配置するコントロールを新しい縦の列に配置するようにします。

　新しい縦の列は、いままでの縦列の右側にできます。

　次から配置されるコントロールの幅は「num 」で指定された幅になります。単位は半角文字単位です。

　例：

ddepoke "newcolumn", "40";


newpage（新しい横の列, DlgService, poke）
newpage（新しい横の列）

DlgService, poke

　　構文：ddepoke "newpage", "num";

　この項目は、newcolumnと併せて使用します。

　通常、newcolumnを何度かやると次々に縦列が横に広がっていきますが、newpage項目を設定すると、また一番左側から縦列を作成していくようになります。（いままでに出来た配置の全体の下に新たに作成するようになります。）

　次から配置されるコントロールの幅は「num 」で指定された幅になります。単位は半角文字単位です。

　例：

ddepoke "newpage", "40";


part（使用する幅を一時的に変える, DlgService, poke）
part（使用する幅を一時的に変える）

DlgService, poke

　　構文：ddepoke "part", "( num | half )";

　ダイアログ配置バッファの最新のコントロールの、幅を変えます。「num 」で指定された幅になります。単位は半角文字単位です。halfという文字列を指定すると、現在の幅の半分の幅になります。

　変えた幅が元の幅よりも小さい場合、次に配置されるコントロールは、いま配置したコントロールの右側の空いた所に配置されます。

　幅は一時的に変わるだけで、次の次から配置するコントロールは元の幅に戻ります。

　例：

ddepoke "newdialog", "40,タイトル";

ddepoke "newcontrol", "button,,右側のボタン";

ddepoke "part", "20";

ddepoke "newcontrol", "button,,左側のボタン";


dlgresult（ダイアログの結果を受け取る, DlgService, advise）
dlgresult（ダイアログの結果を受け取る）

DlgService, advise

　ダイアログの結果を受け取ります。dialogコマンドを呼んだ後でないと有効でありません。

　DDEクライアントは、アドバイズループでこの項目を監視しなければいけません。

　この項目は、ダイアログでESCキーが押されたときか、notifyが指定されたコントロールが押されたときに変更を通知します。

　「OK」ボタンと「ｷｬﾝｾﾙ」ボタンについては、あらかじめnotifyで１と０が指定されているので、「OK」が押されたときは１が、「ｷｬﾝｾﾙ」が押されたときは０が通知されます。

　例：

$a = "";

ddestartadvice "dlgresult", $a;

while( strlen($a) == 0 ) {

ddewaitadvice $a, 100;

}

ddestopadvice "dlgresult";


ダイアログ作成の概要

利用手順

　ダイアログボックスを扱うには、ddeinitiateで"DlgService"を指定してください。

　例：

ddeinitiate "HideMacroServer", "DlgService";

　ダイアログを出すには、ddeexecuteで"dialog"コマンドを実行します。が、このコマンドを実行する前にダイアログの配置情報を設定してやらなくてはダイアログを出すことはできません。

　配置情報を設定するには、ddepokeで以下の手順で設定します。

１．newdialogで配置バッファを初期化する。

２．newcontrolでコントロールを配置バッファに追加する。

３．必要であれば、item, default, notifyなどで、「２」で配置したコントロールを修飾する。

４．さらにコントロールを配置したければ、「２」に戻る。

５．ddeexecuteでdialogコマンドを実行する。

　dialogコマンドを実行した後は、結果を受け取るため、アドバイズループに入ってdlgresult項目が変更されるのを待機しなくてはいけません。

　最後にdialogの表示をやめるときは、enddialogコマンドを実行します。

　実際に秀丸のマクロで書いた場合は以下のようになります。

//配置情報を設定する

ddepoke "newdialog", "40,タイトル";

ddepoke "newcontrol", "list,,";

ddepoke "item", "リストの項目１";

ddepoke "item", "リストの項目２";

ddepoke "item", "リストの項目３";

ddepoke "newcontrol", "check,,チェックボックス１";

ddepoke "newcontrol", "check,,チェックボックス２";

//表示

ddeexecute "dialog";

//アドバイズループ

ddestartadvice "dlgresult", $a;

while( strlen($a) == 0 ) {

ddewaitadvice $a, 100;

}

ddestopadvice "dlgresult";

//消去

ddeexecute "enddialog";


ダイアログ作成のサンプルマクロ

　ダイアログサービスを使ったサンプルマクロです。上から順番に一つ一つ見ていくと解りやすいです。

　サンプルでは、ddeinitiateなど初期化の部分を省いています。初期化の部分は利用方法を参照してください。

　このサンプルは、添付ファイルのdlgtest.macに書かれています。

基本編

　チェックボックス

　リストボックス

　ラジオボタン

　エディットコントロール

　プッシュボタン

　デフォルト値の設定

　ニーモニックの指定

応用編

　height使用の例

　part使用の例

　newcolumn使用の例

　newpage使用の例


チェックボックスのサンプルマクロ

　幅４０文字分のダイアログを作成し、その中にチェックボックスを３つ作っています。

一番下には「OK」ボタンと「ｷｬﾝｾﾙ」ボタンを配置しています。

　３つのチェックボックスは、それぞれ「MyCheck1」「MyCheck2」「MyCheck3」と命名されており、ダイアログ終了後にgetstateでそれぞれの状態を問い合わせています。

//***** チェックボックスのテスト *****

ddepoke "newdialog", "40,チェックボックスのテスト";

ddepoke "newcontrol", "check,MyCheck1,チェックボックス１";

ddepoke "newcontrol", "check,MyCheck2,チェックボックス２";

ddepoke "newcontrol", "check,MyCheck3,チェックボックス３";

ddepoke "newcontrol", "okcancel";

call MakeDialog;

message "チェック１の状態 = " + dderequest("getstate MyCheck1") + "\n" +

"チェック２の状態 = " + dderequest("getstate MyCheck2") + "\n" +

"チェック３の状態 = " + dderequest("getstate MyCheck3");


リストボックスのサンプルマクロ

　リストボックスを配置した後、item項目を使ってリストボックスの内容を設定しています。

　ダイアログ終了後にgetstateで選択されている項目を問い合わせています。getstringで問い合わせると、項目の番号ではなく、項目の内容（たとえば「リストの項目１」という文字列」）を問い合わせることができます。

//***** リストボックスのテスト *****

ddepoke "newdialog", "40,リストボックスのテスト";

ddepoke "newcontrol", "list,MyListbox,";

ddepoke "item", "リストの項目１";

ddepoke "item", "リストの項目２";

ddepoke "item", "リストの項目３";

ddepoke "item", "リストの項目４";

ddepoke "newcontrol", "okcancel";

call MakeDialog;

message dderequest("getstate MyListbox") + " 番目が選ばれました\n" +

"選ばれた項目の内容 = 「" + dderequest("getstring MyListBox") + "」";


ラジオボタンのサンプルマクロ

　ラジオボタンを配置しています。実際は、newcontrolしただけではラジオボタンを配置するための枠しかできません。リストボックスと同様に、item項目を設定してやると、ラジオボタンが枠の中に配置されます。

//***** ラジオボタンのテスト *****

ddepoke "newdialog", "40,ラジオボタンのテスト";

ddepoke "newcontrol", "radio,MyRadio,グループ";

ddepoke "item", "ラジオボタン１";

ddepoke "item", "ラジオボタン２";

ddepoke "item", "ラジオボタン３";

ddepoke "newcontrol", "okcancel";

call MakeDialog;

message dderequest("getstate MyRadio") + " 番目のボタンが選ばれました";


エディットのサンプルマクロ
エディットコントロールのサンプルマクロ

　エディットコントロールを配置しています。

　ダイアログ終了後、getstateとgetstringで問い合わせています。数値が入力されている場合は、getstateの結果は数値になります。数値じゃない文字列が入力されている場合は、getstateの結果は０になります。getstringの結果は、とにかく入力されていた文字列になります。

//***** エディットのテスト *****

ddepoke "newdialog", "40,エディットのテスト";

ddepoke "newcontrol", "edit,MyEdit,";

ddepoke "newcontrol", "okcancel";

call MakeDialog;

message "数値が入力された場合 = " + dderequest("getstate MyEdit") + "\n" +

"数値か文字が入力された場合 = " + dderequest("getstring MyEdit");


プッシュボタンのサンプルマクロ

　プッシュボタンを配置したあと、notify項目を設定して、通知コードを決めています。

　通知コードは、dlgresultの変更として通知されます。DDEクライアントはアドバイズループを作ってdlgresultの変更が通知されるのを待機しなければなりません。（call MakeDialog; の部分）

　「OK」ボタンと「ｷｬﾝｾﾙ」ボタンは、あらかじめnotifyで１と０が指定されているので、「OK」が押されたときは１が、「ｷｬﾝｾﾙ」が押されたときは０が通知されます。

//***** プッシュボタンのテスト *****

ddepoke "newdialog", "40,プッシュボタンのテスト";

ddepoke "newcontrol", "button,,ボタン１";

ddepoke "notify", "123";

ddepoke "newcontrol", "button,,ボタン２";

ddepoke "notify", "456";

ddepoke "newcontrol", "okcancel";

call MakeDialog;

if( $$return == "0" ) {

message "ｷｬﾝｾﾙが押されました";

} else if( $$return == "1" ) {

message "OKが押されました";

} else if( $$return == "123" ) {

message "ボタン１が押されました";

} else if( $$return == "456" ) {

message "ボタン２が押されました";

}


デフォルト値の設定のサンプルマクロ

　コントロールを配置したあと、default項目を設定して初期状態を決めています。

　エディットコントロールについては、初期状態はdefaultで決めずに、newcontrolのパラメタで指定します。

//***** デフォルト値の設定のテスト *****

ddepoke "newdialog", "40,デフォルト値の設定のテスト";

ddepoke "newcontrol", "check,MyCheck,チェックボックス";

ddepoke "default", "1";

ddepoke "newcontrol", "list,MyListbox,";

ddepoke "item", "リストの項目１";

ddepoke "item", "リストの項目２";

ddepoke "item", "リストの項目３";

ddepoke "default", "3";

ddepoke "newcontrol", "radio,MyRadio,グループ";

ddepoke "item", "ラジオボタン１";

ddepoke "item", "ラジオボタン２";

ddepoke "item", "ラジオボタン３";

ddepoke "default", "2";

ddepoke "newcontrol", "edit,MyEdit,初期化文字";

ddepoke "newcontrol", "okcancel";

call MakeDialog;


ニーモニックの指定のサンプルマクロ

　ニーモニックとは、ダイアログをキーボード操作するとき、Alt+キー で操作するキーのことです。コントロールのテキストに、ニーモニックにしたい文字の前に「&」をつけてやることで、ニーモニックを決めることができます。

　リストボックスやエディットコントロールについては、コントロールのテキストで決めることはできないので、配置する前にtext（スタティックテキスト）を配置するとできます。

//***** ニーモニックのテスト *****

ddepoke "newdialog", "40,ニーモニックのテスト";

ddepoke "newcontrol", "check,MyCheck,チェックボックス(&C)";

ddepoke "newcontrol", "text,,リストボックス(&L)";

ddepoke "newcontrol", "list,MyListbox,";

ddepoke "item", "リストの項目１";

ddepoke "item", "リストの項目２";

ddepoke "item", "リストの項目３";

ddepoke "newcontrol", "radio,MyRadio1,グループ１(&G)";

ddepoke "item", "ラジオボタン１";

ddepoke "item", "ラジオボタン２";

ddepoke "item", "ラジオボタン３";

ddepoke "newcontrol", "radio,MyRadio2,グループ２";

ddepoke "item", "ラジオボタン１(&1)";

ddepoke "item", "ラジオボタン２(&2)";

ddepoke "item", "ラジオボタン３(&3)";

ddepoke "newcontrol", "text,,エディット(&E)";

ddepoke "newcontrol", "edit,MyEdit,";

ddepoke "newcontrol", "okcancel";

call MakeDialog;


height使用の例

　リストボックスを配置したあとにheight項目を設定すると、リストボックスの高さを決めることができます。サンプルでは、高さが２文字分のリストボックスと８文字分のリストボックスを作成しています。

//***** heightのテスト *****

ddepoke "newdialog", "40,heightのテスト";

ddepoke "newcontrol", "text,,低いリストボックス";

ddepoke "newcontrol", "list,MyListbox1,";

ddepoke "item", "リストの項目１";

ddepoke "item", "リストの項目２";

ddepoke "item", "リストの項目３";

ddepoke "height", "2";

ddepoke "newcontrol", "text,,高いリストボックス";

ddepoke "newcontrol", "list,MyListbox2,";

ddepoke "item", "リストの項目１";

ddepoke "item", "リストの項目２";

ddepoke "item", "リストの項目３";

ddepoke "height", "8";

ddepoke "newcontrol", "okcancel";

call MakeDialog;


part使用の例

　コントロールを配置したあと、part項目を設定すると、いま配置したコントロールの幅を変えることができます。次に配置するコントロールは、下に配置されず、右の空いた部分に配置されます。空いた部分になにも配置したくない場合は、文字列なしのtext（スタティックテキスト）を配置すればいいです。

　partを連続して使用することも可能です。

//***** partのテスト *****

ddepoke "newdialog", "40,partのテスト";

ddepoke "newcontrol", "text,,エディット(&E)：";

ddepoke "part", "16";

ddepoke "newcontrol", "edit,MyEdit,";

ddepoke "part", "10";

ddepoke "newcontrol", "text,,";	//(ダミー)

ddepoke "newcontrol", "radio,MyRadio,グループ１(&G)";

ddepoke "item", "ラジオ１";

ddepoke "item", "ラジオ２";

ddepoke "item", "ラジオ３";

ddepoke "part", "30";

ddepoke "newcontrol", "text,,";	//(ダミー)

ddepoke "newcontrol", "button,,左";

ddepoke "part", "13";

ddepoke "newcontrol", "button,,中";

ddepoke "part", "13";

ddepoke "newcontrol", "button,,右";

ddepoke "newcontrol", "okcancel";

call MakeDialog;


newcolumn使用の例

　newcolumn項目を設定すると、次から配置するコントロールは新しい列になります。

　実際にやってみればわかります。

//***** newcolumnのテスト *****

ddepoke "newdialog", "20,newcolumnのテスト";

ddepoke "newcontrol", "check,,チェック１(１行目)";

ddepoke "newcontrol", "check,,チェック２(１行目)";

ddepoke "newcontrol", "check,,チェック３(１行目)";

ddepoke "newcolumn", "30";

ddepoke "newcontrol", "button,,ボタン１(２行目)";

ddepoke "newcontrol", "button,,ボタン２(２行目)";

ddepoke "newcolumn", "30";

ddepoke "newcontrol", "radio,,３行目";

ddepoke "item", "ラジオ１";

ddepoke "item", "ラジオ２";

ddepoke "item", "ラジオ３";

ddepoke "item", "ラジオ４";

ddepoke "item", "ラジオ５";

ddepoke "newcontrol", "okcancel";

call MakeDialog;


newpage使用の例

　newpage項目を設定すると、次から配置する「列」が新しい「段」になります。

　これも実際にやってみればわかります。

//***** newpageのテスト *****

ddepoke "newdialog", "20,newpageのテスト";

ddepoke "newcontrol", "check,,チェック１(１行目)";

ddepoke "newcontrol", "check,,チェック２(１行目)";

ddepoke "newcontrol", "check,,チェック３(１行目)";

ddepoke "newcolumn", "30";

ddepoke "newcontrol", "button,,ボタン１(２行目)";

ddepoke "newcontrol", "button,,ボタン２(２行目)";

ddepoke "newcolumn", "30";

ddepoke "newcontrol", "radio,,３行目";

ddepoke "item", "ラジオ１";

ddepoke "item", "ラジオ２";

ddepoke "item", "ラジオ３";

ddepoke "item", "ラジオ４";

ddepoke "item", "ラジオ５";

ddepoke "newpage", "40";

ddepoke "newcontrol", "text,,↓ここからnewpage";

ddepoke "newcontrol", "list,,";

ddepoke "newcolumn", "30";

ddepoke "newcontrol", "text,,↓newpageのあとnewcolumn";

ddepoke "newcontrol", "check,,チェック３(２段目の２行目)";

ddepoke "newcontrol", "check,,チェック４(２段目の２行目)";

ddepoke "newcontrol", "okcancel";

call MakeDialog;


サンプルマクロで使用しているサブルーチンです。

ダイアログを出して、ダイアログの結果待ちをしています。

MakeDialog:

#hwnd = hidemaruhandle(0);

ddeexecute "dialog " + str(#hwnd);

$$a = "";

ddestartadvice "dlgresult", $$a;

while( strlen($$a) == 0 ) {

ddewaitadvice $$a, 100;

}

ddestopadvice "dlgresult";

ddeexecute "enddialog";

return $$a;