![]() |
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 |
Re: Ab wann hat ein Fenster ein Handle?
Naja wozu sollst du ein Handle erstellen, wenn dir das Formular eines bereit stellt?
Und ich will dir nicht meine Meinung aufzwingen, jedoch halte "ich" das halt für sinnvoller und gebe es nur kund ;) Also hier mal deine Möglichkeiten die ich dir hier nun biete: 1. Im Public Teil deines Formulars einfügen:
Delphi-Quellcode:
Und dort die Anweisungen ausführen, die du sonst im Konstruktor ausgeführt hättest.procedure AfterConstruction; override; Da ab dann das Handle erstellt sein sollte. 2. HandleNeeded im Konstruktor ausführen und danach deine Anweisungen ausführen. HandleNeeded überprüft halt ob das Handle erstellt ist und wenn nicht wird es erstellt. 3. HandleNeeded im Getter des Handels implementieren, also den Getter überschreiben und das Handle dann zurückgeben. ( siehe Beispiel von Himitsu ). Also jedes Mal wenn du auf das Handle-Property zugreifst, wird überprüft ob das Handle existiert. ( per HandleNeeded ) Edit: Achja wichtig ist beim AfterConstruction das du dort inherited; aufrufst, da laut DelphiHilfe dort ein Flag gesetzt wird. MfG Alaitoc |
Re: Ab wann hat ein Fenster ein Handle?
OK,
AfterConstruction ist eine Methode von tobject, hatte ich übersehen. Danke Alaitoc! Grüsse Rainer |
Re: Ab wann hat ein Fenster ein Handle?
Zitat:
Nee, mal im Ernst. Wo ist der Vorteil von 'Ich lade alles x-Mal' zu 'ich lade alles einmal'? Das interessiert mich wirklich. |
Re: Ab wann hat ein Fenster ein Handle?
Hi Mario,
Delphi-Quellcode:
Unsere Tools sind so von anderen Dingen belastet, dass es unbedingt nötig ist Zeit zu sparen.
Nee, mal im Ernst. Wo ist der Vorteil von 'Ich lade alles x-Mal' zu 'ich lade alles einmal'?
Sei es wo es wolle. So müssen, z.B. in Echtzeit (sofern das Windoof zulässt), Statusdaten aus den Zählern und Empfängern geholt werden. Ich kann es mir einfach nicht leisten Zeit durch unnötiges laden von Sprachinformationen zu vertrödeln. Alle Daten sind mit Zeitstempeln versehen (werden im PC hinzugefügt). Der Kunde meckert schon wenn wir 200ms hinter seinem Protokoll hinterhinken. Aus diesem Grunde wird an jeder Ecke Zeit gespart. Das ist auch der Grund für die zentral gesteuerte Botschaftsverarbeitung (uuuh was für ein Wort) die wir einführen wollen. Ob das was bringt ist eine andere Sache. Mehr muss ich dazu wohl nicht sagen. Grüsse Rainer |
Re: Ab wann hat ein Fenster ein Handle?
Hallo Rainer,
danke für die Info. Das Thema hört sich sehr interessant an. Darf ich fragen, in welcher Branche Du arbeitest? Schreibt Ihr Software für Hardware (Zähler)? Wenn ja, um was für Zähler handelt es sich da? Gruß Mario |
Re: Ab wann hat ein Fenster ein Handle?
Hi Mario,
ich arbeite bei der Elster GmbH. Wir stellen Gas, Wasser und Stromzähler her. Ausserdem sind wir im Bereich der Rundsteuertechnik tätig. Ich persönlich arbeite in der Entwicklungsabteilung für Stromzähler und Rundsteuertechnik. Wir beschäftigen uns im wesentlichen mit Hitec Zählern für die Industrie und den Haushalt. Wir sind im Moment dabei, Sichwort "Smart metering", uns mit Zählerfernauslesung zu profilieren. Meine Tools: Lcrset, Rtsset, LTSset, TTSset, RCRset usw. Alles Tools mit einem Sourcecode zwischen 300000 und 400000 Zeilen. Ich arbeite bevorzugt mit D7 und RAD Studio 2007 aber auch mit den ATmel Tools für ATmega88 usw. Dort habe ich z.B. eine Dali Schnittstelle für einen Runststeuerempfänger realisiert. (hard und Software) Wenn du dich weiter informieren willst: ![]() Grüsse Rainer Unger |
Re: Ab wann hat ein Fenster ein Handle?
Wenn es so zeitkritisch ist, dann würde ich nicht alles an eine Stelle verlagern,
wo es sich eventuell noch gegenseitig behindern kann. Das Empfangen und mit Zeitstempel versehen in einen eigenständigen Thread auslagern (notfalls auch noch mit höherer Priorität) und sobald der Zeitstempel erstmal dran ist, ist der Rest dann doch nicht mehr ganz so zeitkritisch? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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