フォームの2重起動防止(?)について

解決


himurock  2004-12-21 00:35:29  No: 12405

ボタンを押した時にフォームが表示するプログラムがあります。
今までは2重起動を禁止してましたが、これをコメントにして、一度表示されたフォームに「更新」という形で新情報(新フォーム)を表示させたいのですが、何か良きアドバイスあればお願いします。
最悪、古フォームを消して新フォームを表示という流れもありです


puri  2004-12-21 19:59:59  No: 12406

単純に最新のフォーム状態を再描画すればいいのでは?


ふじっこ  2004-12-21 20:44:57  No: 12407

はずしていたらごめんなさい
アプリA,アプリBと同じEXEで起動させ
アプリAからアプリBのフォームを最新表示させたいということなのですか?

アイデアとしては
WM_USER+Xのメッセージを作成し
メッセージポストで画面描画を最新にするとか
どうでしょうか?


himurock  2004-12-21 22:29:07  No: 12408

返答ありがとうございます
巷でよく見掛けるプログラムだと2重起動が判明したら、
今回表示しようとしてるウィンドウを開かせない(閉じる)様にしてると思うんです
でも実際したいのは新ウィンドウを開いて古ウィンドウを閉じる事なのです
以下、現在のプログラムです

******************************************************************
  hMutex := OpenMutex( MUTEX_ALL_ACCESS, False, MutexName );
  if hMutex > 0 then
  begin
    //!既に起動中の場合メッセージ表示「既に起動中です。」
    MessageDlg('既に起動中です。', mtInformation, [mbOk], 0);

    //!アプリケーションがアイコン可されていた場合、元のサイズにする
    if (IsIconic(hMutex)) then
      OpenIcon(hMutex);
    //!前面に移動させる
    SetForegroundWindow(hMutex);

    CloseHandle( hMutex );
    Exit;
  end;
  hMutex := CreateMutex( nil, False, MutexName );

  try
    Application.Initialize;
    Application.Title := '○○○○○○○';
    Application.CreateForm(TFrmPinf, FrmPinf);
    Application.CreateForm(TDMPinf, DMPinf);
    Application.Run;
  finally
    //登録したMutexを破棄
    ReleaseMutex( hMutex );
  end;
*****************************************************************


りおりお  2004-12-22 08:50:24  No: 12409

フォームの表示とアプリケーションの起動をごっちゃにしているので質問の意味が
分かりづらいです。

> 巷でよく見掛けるプログラムだと2重起動が判明したら、
> 今回表示しようとしてるウィンドウを開かせない(閉じる)様にしてると思うんです

そうですね。ウィンドウを開かせないっていうより、アプリを終了するのですが。

> でも実際したいのは新ウィンドウを開いて古ウィンドウを閉じる事なのです

なるほど。おもしろいですね。プロジェクトファイルを以下のようにすると、
前に起動されていた同じアプリを必ず終了してから、自分を起動します。

program Project1;

uses
  Forms, Windows, Messages,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

function EnumWndProc(hWindow:HWND;lData:LPARAM):BOOL;stdcall;
begin
  result := true;
  if GetProp(hWindow,'HogeHogeHoge') = 98765 then begin
    SendMessage(hWindow,WM_SYSCOMMAND,SC_CLOSE,0);
    result := false;
  end;
end;

begin
  EnumWindows(@EnumWndProc,0);
  SetProp(Application.Handle,'HogeHogeHoge',98765);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  RemoveProp(Application.Handle,'HogeHogeHoge');
end.


りおりお  2004-12-22 08:51:24  No: 12410

コード部分が化けましたのでもう一回

program Project1;

uses
  Forms, Windows, Messages,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

function EnumWndProc(hWindow:HWND;lData:LPARAM):BOOL;stdcall;
begin
  result := true;
  if GetProp(hWindow,'HogeHogeHoge') = 98765 then begin
    SendMessage(hWindow,WM_SYSCOMMAND,SC_CLOSE,0);
    result := false;
  end;
end;

begin
  EnumWindows(@EnumWndProc,0);
  SetProp(Application.Handle,'HogeHogeHoge',98765);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  RemoveProp(Application.Handle,'HogeHogeHoge');
end.


himurock  2004-12-22 22:48:29  No: 12411

りおりおさん、解決しました!
ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加