![]() |
Ab wann hat ein Fenster ein Handle?
Hi,
wie ist das ab wann besitzt ein Fenster ein handle? Eigentlich müsste das doch nach create vorhanden sein. ich versuche mit enumwindows an das entsprechende Handle zu kommen. Ich versuche an Fenster Botschaften zu schicken die noch nie sichtbar waren, also nie mit show oder showmodal aufgerufen wurden. Vielleicht ist die Frage blöd aber kann mir das jemand erklären! Grüsse rainer |
Re: Ab wann hat ein Fenster ein Handle?
Reagieren deine Fenster nicht auf die Nachrichten?
|
Re: Ab wann hat ein Fenster ein Handle?
Hi,
das Problem dass sie eigentlich reagieren sollen obwohl sie noch garnicht sichtbar sind. Create ist durchlaufen. Ich will dem Fensterobject eine Botschaft schicken, dass es sich etwas holen soll. Grüsse rainer |
Re: Ab wann hat ein Fenster ein Handle?
Und wie machst du das?
|
Re: Ab wann hat ein Fenster ein Handle?
Spätestens, wenn es angezeigt wird, wird ein Handle, bzw. das Windows-Control erstellt.
Du kannst aber auch schon vorher HandleNeeded der Form aufrufen und Eines anfordern oder einfach via .Handle dieses abfragen. .Handle erzeugt es genauso
Delphi-Quellcode:
function TWinControl.GetHandle: HWND;
begin HandleNeeded; Result := WindowHandle; end; |
Re: Ab wann hat ein Fenster ein Handle?
Versuch es einfach mal mit dem Event AfterConstruction statt im OnCreate, da sollte das Handle vorhanden sein.
Falls du sonst auch mal ein Handle brauchst, für ein Objekt das wirklich keines besitzt. Kannst du dies mit:
Delphi-Quellcode:
Edit: Jepp, HandleNeeded wäre auch eine Möglichkeit. Wobei ich das eigentlich meinem Fenster lieber selbst überlasse. ( Eigene Meinung )
var
TestHandle: HWND; // Erstellen TestHandle:= AllocateHWnd( GetMessages); // Übergeben wird die Methode zum Empfangen der Nachricht // Freigeben DeallocateHWnd( TestHandle); MfG Alaitoc |
Re: Ab wann hat ein Fenster ein Handle?
Zitat:
Das Handle wird erstellt, wenn es benötigt wird (also spätestens, wenn die Form angezeigt werden soll) und wenn der Programmierer das Handle schon vorher benötigt, dann erstellt/beantragt er es eben. |
Re: Ab wann hat ein Fenster ein Handle?
Hi,
so funktiert das. Form2 ist zwar erzeugt aber noch nicht dargestellt.
Delphi-Quellcode:
Jetzt reagiert das Fenster obwohl es noch nicht angezeigt wird.
procedure TForm1.Button4Click(Sender: TObject);
var TestHandle: HWND; begin // Erstellen TestHandle:= AllocateHWnd( form2.GetMessages); // Übergeben wird die Methode zum Empfangen der Nachricht SendMessage(TestHandle, SET_LNG_CMD, 0, 0 ); // Freigeben DeallocateHWnd( TestHandle); end; public { Public-Deklarationen } procedure GetMessages(var msg: Tmessage); message SET_LNG_CMD; procedure TForm2.GetMessages(var msg: Tmessage); begin if msg.msg = SET_LNG_CMD then begin ShowMessage('Fenster 2'); end; end; Zum Hintergrund: Wir hatten die Sprachabhängigen Texte usw immer im onactivate des entsprechenden Fensters geladen. Das ganze wurde aus Performancegründen so gemacht. Unsere Fenster sind all modal. Vorteil: Jedes Fenster ist dann wenn es gebraucht wird auf dem aktuellen Stand (siehe sprachwechsel oder so). Nachteil: Ich muss den Code (unnötigerweise) immer wieder durchlaufen (jedesemal wenn ich das fenster öffne) Ich plane das Ganze zentral über Botschaften zu initiieren und zwar dann wenn das Fenster erzeugt ist und auch wenn die Sprache gewechselt wird. Danke an alle Grüsse Rainer |
Re: Ab wann hat ein Fenster ein Handle?
@R2009
AllocateHWnd und DeAllocateHWnd nur benutzen wenn ein Objekt, das normalerweise kein Handle hat, eins bekommen soll! ( Bitte nächstes Mal genau lesen was ich schreibe ;) ) Ein Formular hat automatisch ein Handle, das im AfterConstruction-Event spätestens erstellt sein sollte oder du erstellst es wie Himitsu schon sagte über HandleNeeded. Also entweder im Create HandleNeeded() benutzen oder im Getter vom Handle es vorher ausführen. Oder deine Anweisungen statt im Create im AfterConstruction durchführen, da sollte das Handle erstellt sein. ( dazu procedure AfterConstruction; override; ); @Himitsu Naja wieso soll ich mir die Mühe machen und die Anfrage selbst stellen? Wenn es z.b. im AfterConstruction erstellt ist, dann kann ich doch einfach damit arbeiten. Ist halt meine eigene Meinung ;) HandleNeeded benutze ich halt für solche Fälle wo ich auf das Handle direkt zugreife, z.b. in solch einer Funktion:
Delphi-Quellcode:
Sozusagen eine Sicherheitsfunktion wie Assigned(), jedoch wenn ich halt direkt im Formular das Handle benutze dann kann ich z.b. beim AfterConstruction davon ausgehen das das Handle vorhanden ist ;)
//******************************************************************************
//* LockWindow //****************************************************************************** procedure LockWinControl( const oWinControl: TWinControl ); begin if Assigned ( oWinControl ) then begin // Handle erstellen, falls noch nicht vorhanden oWinControl.HandleNeeded; // Deaktivieren von Repaint SendMessage( oWinControl.Handle, WM_SETREDRAW, 0, 0 ); end; end; //****************************************************************************** //* UnLockWindow //****************************************************************************** procedure UnlockWinControl( const oWinControl: TWinControl ); begin if Assigned ( oWinControl ) then begin // Handle erstellen, falls noch nicht vorhanden oWinControl.HandleNeeded; // Aktivieren von Repaint SendMessage( oWinControl.Handle, WM_SETREDRAW, 1, 0 ); // Repaint ausführen RedrawWindow( oWinControl.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN ); end; end; Ist halt meine eigene Vorgehensweise. :) MfG Alaitoc |
Re: Ab wann hat ein Fenster ein Handle?
Hi
Zitat:
Zu AllocateHWnd und DeAllocateHWnd: Ich verwende das doch nur wenn ich absolut sicher bin, dass das Fenster noch nicht mittels show oder showmodal angezeigt wurde. Ausserdem ist das handle danach wieder weg. Wo also liegt dein Problem. Auch wenn ich deinen Beitrag "genau" gelesen habe bin ich doch durchaus in der Lage selbst Entscheidungen zu treffen und muss mich nicht unbedingt deiner Argumentation anschliessen. Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz