Delphiアプリケーションをチェックし、フォームのインスタンスは既にこの道を開いている場合:開かれたフォームインスタンスがデザイナーからのものかどうかを確認する方法は?
form := FindWindow(PAnsiChar(FormClassName), nil);
if form > 0 then
begin
SendMessage(form, WM_ACTIVATEAPP, 0, 0);
Result := True;
end else
Result := False
問題は、フォームがDelphiのデザイナーウィンドウとして開いているとき、それは、フォームが開いていると言うことです。フォームを開いてメソッドをブレークポイントにすると、アプリケーションが動作しなくなったので、私はちょうど勤務時間を失った:-(
フォームクラスインスタンスが?デザイナー
回答:以下
opc0deの提案は良い解決策に私を加鉛ので、私は答えとしての彼のコメントを受け付けています、私はすべての開いているフォームを反復処理するためにコードを変更する必要がここに。世界のコピーアンドパターの幸福のためのコードの最終版です:
function VerifyFormIsOpen(formClass: String): Boolean;
var
windowHndl, windowOld: HWND;
processId: Cardinal;
begin
windowOld := 0;
windowHndl := 0;
Result := False;
repeat
windowHndl := Windows.FindWindowEx(0, windowOld,
PAnsiChar(formClass), nil);
if (windowHndl > 0) then
begin
Windows.GetWindowThreadProcessId(windowHndl, processId);
if processId = Windows.GetCurrentProcessId() then
begin
Windows.SendMessage(windowHndl, Messages.WM_ACTIVATEAPP, 0, 0);
Result := True;
break;
end;
end;
windowOld := windowHndl;
until windowHndl = 0;
end;
これは現在のアプリケーションまたは別のアプリケーションのフォームですか?別の場合:あなたが本当に@ Cosmin Prundのようなあなたのアプリケーションのための "シングルトン"ソリューションを探しているのですか? – NGLN
@NGLN:別のアプリケーションであるIDEです。 FindWindowは、システムで開いているすべてのウィンドウをチェックします。解決策は、フォームがチェック中のプロセスと同じであるかどうかをチェックします。 – neves