Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ab wann hat ein Fenster ein Handle? (https://www.delphipraxis.net/145785-ab-wann-hat-ein-fenster-ein-handle.html)

R2009 8. Jan 2010 10:21


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

s.h.a.r.k 8. Jan 2010 10:23

Re: Ab wann hat ein Fenster ein Handle?
 
Reagieren deine Fenster nicht auf die Nachrichten?

R2009 8. Jan 2010 10:27

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

Luckie 8. Jan 2010 10:28

Re: Ab wann hat ein Fenster ein Handle?
 
Und wie machst du das?

himitsu 8. Jan 2010 10:31

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;

Alaitoc 8. Jan 2010 10:34

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:
var
  TestHandle: HWND;

  // Erstellen
  TestHandle:= AllocateHWnd( GetMessages); // Übergeben wird die Methode zum Empfangen der Nachricht

  // Freigeben
  DeallocateHWnd( TestHandle);
Edit: Jepp, HandleNeeded wäre auch eine Möglichkeit. Wobei ich das eigentlich meinem Fenster lieber selbst überlasse. ( Eigene Meinung )

MfG Alaitoc

himitsu 8. Jan 2010 10:41

Re: Ab wann hat ein Fenster ein Handle?
 
Zitat:

Zitat von Alaitoc
Edit: Jepp, HandleNeeded wäre auch eine Möglichkeit. Wobei ich das eigentlich meinem Fenster lieber selbst überlasse. ( Eigene Meinung )

Wieso?
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.

R2009 8. Jan 2010 10:49

Re: Ab wann hat ein Fenster ein Handle?
 
Hi,
so funktiert das. Form2 ist zwar erzeugt aber noch nicht dargestellt.

Delphi-Quellcode:
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;
Jetzt reagiert das Fenster obwohl es noch nicht angezeigt wird.

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

Alaitoc 8. Jan 2010 10:52

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:
//******************************************************************************
//* 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;
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 ;)
Ist halt meine eigene Vorgehensweise. :)

MfG Alaitoc

R2009 8. Jan 2010 11:05

Re: Ab wann hat ein Fenster ein Handle?
 
Hi

Zitat:

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.
Vielleicht solltest du mir mal auf die Sprünge helfen, wo zum Teufel gibts denn einen AfterConstruction event. Bei mir in meinen Formularen nicht. Also wo soll ich hin mit Handleneeded?

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 18:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz