Najlepszym sposobem, aby to zrobić, jest sprawdzenie, czy formularz, który chcesz otworzyć, faktycznie sprawdza, czy już istnieje. Aby to zrobić, formularz musi zadeklarować procedurę klasy. Deklarowana jako procedura klasy, proces może być wywołany bez względu na to, czy formularz istnieje, czy nie.
Dodaj do sekcji publicznej formularza za
class procedure OpenCheck;
wówczas procedura wygląda następująco
Class procedure TForm1.OpenCheck;
var
f: TForm1;
N: Integer;
begin
F := Nil;
With Application.MainForm do
begin
For N := 0 to MDIChildCount - 1 do
begin
If MDIChildren[N] is TForm1 then
F := MDIChildren[N] as TForm1;
end;
end;
if F = Nil then //we know the form doesn't exist
//open the form as the 1st instance/add a new constructor to open as 1st
else
//open form as subsequent instance/add new constructor to open as subsqt instance
end;
Dodaj jednostkę Form1 do swojej mdiframe używa klauzuli.
Aby otworzyć formularz, należy wywołać procedurę klasy, która z kolei wywoła konstruktor formularza.
TForm1.OpenCheck;
Jedno słowo ostrzeżenia z wykorzystaniem procedur klasowych, nie można uzyskać dostępu do żadnego z komponentów/właściwości formularza. Ponieważ formularz nie musi być faktycznie utworzony, dostęp do nich spowodowałby naruszenie zasad dostępu/to jest dopóki nie wiesz, że F nie jest zerowe. Następnie możesz użyć F., aby uzyskać dostęp do komponentów/właściwości formularza.
Dlaczego testujesz '> 0'? Z pewnością poprawna logika to '<> 0'. Nie żeby to był twój problem, tylko na bok. –
@ David, od Delphi 4, wraz z wprowadzeniem 32-bitowego typu całkowitego typu unsigned, obsługa Delphi jest niepodpisana, więc technicznie nie robi żadnej różnicy. –
@Rob Wiem, że nie ma to żadnego wpływu na zachowanie, ale logicznie jest zupełnie inaczej. '> 0' oznacza, że kolejność jest ważna. '<> 0' wskazuje, że' 0' jest wartością wartownika. –