Приложение Delphi проверяет, открыт ли экземпляр формы таким образом:
form := FindWindow(PAnsiChar(FormClassName), nil);
if form > 0 then
begin
SendMessage(form, WM_ACTIVATEAPP, 0, 0);
Result := True;
end else
Result := False
Проблема в том, что когда форма открыта как окна Delphi Designer, она говорит, что форма открыта. Я просто потерял несколько рабочих часов, потому что когда я открыл форму и щелкнул, чтобы точки останова метод, приложение перестало работать :-(
Как сделать так, чтобы эта функция возвращала false, если экземпляр класса формы создан в Designer?
Ответ:
Приведенное ниже предложение opc0de привело меня к хорошему решению, поэтому я принимаю его комментарий в качестве ответа. Мне нужно было изменить код, чтобы перебрать все открытые формы. Вот окончательный вариант кода для счастья copy'n pasters of the world:
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;