MDI等で二重起動を防止して新しいファイルを開く
|
なんか変なタイトルですいません。
Exe本体やExeのショートカットにファイルをドラッグ&ドロップ(以下D&D)した時にアプリケーションが起動してファイルが開く処理を実現したとします。
アプリケーションが起動している最中にもう一度、Exe本体やショートカットにファイルを D&D するともう一つアプリケーションが起動しませんか?あまり素敵じゃないですよね?
貴方がお望みの動作は、たぶんアプリケーションは一つだけ立ち上がっていて MDI 子ウィンドウで新しく D&D されたファイルを開きたいというものでしょう?そこで以下のTipsを利用します。
・二重起動の判定(t269)
・簡易アプリケーション間通信(t268)
t269 のままでは Halt 手続きによってアプリケーションが終了してしまうので、引数に渡されたファイル名を t268 を利用して送信します.
halt 手続きの変わりに呼び出される CopyDataToOld 手続きを作成します.
procedure CopyDataToOld;
var
wnd: HWND;
begin
{ 既に存在している TForm1 を探す }
Wnd := FindWindow('TForm1', nil);
if Wnd<>0 then
begin
// SIGNATURE_FILEOPEN 定数で ParamStr の内容を送信するとする
// SendMessage(wnd, WM_COPYDATA, ...); // t268 参照
end;
end;
そして、送信された WM_COPYDATA を受け取るメッセージハンドラを実装します。
インターフェス部
type
TForm1 = class(TForm)
// …省略…
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
public
end;
実装部
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
ArriveStr: String;
begin
if Msg.CopyDataStruct.dwData=SIGNATURE_FILEOPEN then
begin
// 受信処理 : t268 参照
// ArriveStr に受け取った文字列が入るとする
// ※ 受け取ったファイル名で開く
FileOpen(String(pcData)); //例です
end;
end;
以上のソースでは※印部分では D&D されるファイルは一つだとしか考慮していません。
|
|