ボタンを押した時にフォームが表示するプログラムがあります。
今までは2重起動を禁止してましたが、これをコメントにして、一度表示されたフォームに「更新」という形で新情報(新フォーム)を表示させたいのですが、何か良きアドバイスあればお願いします。
最悪、古フォームを消して新フォームを表示という流れもありです
単純に最新のフォーム状態を再描画すればいいのでは?
はずしていたらごめんなさい
アプリA,アプリBと同じEXEで起動させ
アプリAからアプリBのフォームを最新表示させたいということなのですか?
アイデアとしては
WM_USER+Xのメッセージを作成し
メッセージポストで画面描画を最新にするとか
どうでしょうか?
返答ありがとうございます
巷でよく見掛けるプログラムだと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;
*****************************************************************
フォームの表示とアプリケーションの起動をごっちゃにしているので質問の意味が
分かりづらいです。
> 巷でよく見掛けるプログラムだと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.
コード部分が化けましたのでもう一回
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.
りおりおさん、解決しました!
ありがとうございました
ツイート | ![]() |