2011-07-27 11 views
6

Mam formularz główny (MainForm) i okno potomne MDI (TFormChild). Chcę utworzyć wiele formularzy TFormChild, ale pierwsza musi zachowywać się w określony sposób, więc muszę wykryć, czy okno TFormChild już istnieje.Jak sprawdzić, czy okno podrzędne istnieje?

używam tego kodu, ale to nie działa:

function FindChildWindowByClass(CONST aParent: HWnd; CONST aClass: string): THandle; 
begin 
    Result:= FindWindowEx(aParent, 0, PChar(aClass), NIL); 
end; 

nazywam go tak:

Found:= FindChildWindowByClass(MainForm.Handle, 'TFormChild')> 0; 
+0

Dlaczego testujesz '> 0'? Z pewnością poprawna logika to '<> 0'. Nie żeby to był twój problem, tylko na bok. –

+0

@ 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. –

+2

@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. –

Odpowiedz

7

nazwać to jak

Found:= FindChildWindowByClass(MainForm.ClientHandle, 'TFormChild')> 0; 

okien MDI dzieci są dziećmi 'MDICLIENT', ClientHandle własnością TCustomFrom posiada uchwyt.

+0

Przyjąłem twoją odpowiedź, ponieważ odpowiada ona konkretnie na moje pytanie. Chciałbym jednak również przyznać Hasanowi, że użyję jego bardziej podobnego do Delphi rozwiązania. – Ampere

+2

@Altar - Zadałeś jasne pytanie, które zarówno odpowiedź ta, jak i Hasana, stanowi rozwiązanie. Możesz zaakceptować w zależności od tego, który z nich jest bardziej odpowiedni. Nie mam nic przeciwko głosowi, które oddałeś w tej odpowiedzi. :) –

13

w formie, można odwołać się do właściwości MDIChildCount i MDIChildren.

na przykład:

var 
    i: integer; 
begin 
    for i:= 0 to MainForm.MDIChildCount-1 do 
    begin 
    if MainForm.MDIChildren[i] is TFormChild then 
    ... 
    end; 
    ... 
end; 
+0

+1; ale nie wystarczy, aby sprawdzić 'if MainForm.MDIChildCount> 0 then', czy OP chce czekać na pierwsze utworzenie formularza? –

+0

@daemon_x mogą istnieć dzieci MDI innej klasy –

+0

@David - Mam zdanie "Chcę utworzyć wiele formularzy TFormChild, ale pierwszy musi zachowywać się w określony sposób, więc muszę wykryć, czy okno TFormChild już istnieje 'ponieważ OP tworzy tylko okna TFormChild i chce sprawdzić, czy pierwszy został utworzony, ale kto wie .. –

3

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.

Powiązane problemy