Delphi Tips 
-----------------------------

0267  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/19 おばQ rev 1.1.1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/20 K.Takaoka 編集
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 されるファイルは一つだとしか考慮していません。
参照: [Delphi-ML:42587] [Tips:268] [Tips:269] <その他Windows関連> <アプリケーション> <Windows>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp