AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ab wann hat ein Fenster ein Handle?

Ein Thema von R2009 · begonnen am 8. Jan 2010 · letzter Beitrag vom 11. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:21
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:23
Reagieren deine Fenster nicht auf die Nachrichten?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:27
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:28
Und wie machst du das?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#5

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:31
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:34
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#7

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:41
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:49
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 10:52
@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
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Ab wann hat ein Fenster ein Handle?

  Alt 8. Jan 2010, 11:05
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr.
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