Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fehler bei Messagehandler für WM_MOVE (https://www.delphipraxis.net/52737-fehler-bei-messagehandler-fuer-wm_move.html)

dbdeath74 2. Sep 2005 14:31


Fehler bei Messagehandler für WM_MOVE
 
Hi,

ich fange in meiner Anwendung WM_MOVE ab um ein zweites Form an dem ersten "kleben" zu lassen.
Funktioniert auch einwandfrei.

Delphi-Quellcode:
 
procedure WMMOVE(var Msg: TWMMove); message WM_MOVE;
...........
procedure TFrmPCMain.WMMOVE(var Msg: TWMMove);
begin
  inherited;
  FrmSuchen.FormShow(self); // <<<< Klebt das 2te Form an das aufrufende
end;
Nun habe ich das Problem das ich in einem anderen Form dieses "FrmSuchen" auch aufrufen, und auch an diesem Form soll es kleben.
Naiv wie ich bin habe ich dasselbe für die andere Form auch implementiert:
Delphi-Quellcode:
procedure WMMOVE(var Msg: TWMMove); message WM_MOVE;
...................
procedure TFrmNotebookMain.WMMOVE(var Msg: TWMMove);
begin
  inherited;
  FrmSuchen.FormShow(self);
end;
Nun kommt beim Starten des Programms eine Zugriffsverletzung.

Zitat:

Zugriffsverletzung bei Adresse 0052549A in Modul 'HTD.exe'. Lesen von Adresse 00000057.
Wenn ich diese Meldung wegklicke funktioniert das Programm trotzdem einwandfrei, auch klebt das FrmSuchen wie gewünscht an beiden Forms wenn ich diese verschiebe.

Hat jemand eine Idee was das sein könnte ?
Irgendwie kommen sich die 2 WMMOVE prozeduren in die quere, funktionieren aber trotzdem einwandfrei :shock:

Ich habe dann versucht das ganze zu lösen indem ich es allgemein in der application.onMessage löse(für beide):
Die benutze ich eh schon für einen "Idle Timer" (Das Programm schliesst sich nach 10min nichtaktivität)
Nur seltsamerweise tritt die Message WM_MOVE da NIE auf :( (im debugger gecheckt)

Delphi-Quellcode:
procedure TFrmMain.FormCreate(Sender: TObject);
begin
  application.OnMessage := checkMessage;
end;

procedure TFrmMain.checkMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_MOUSEMOVE then
  begin
    timer1.Enabled := false;
    NextTimer := GetTickCount + DWORD(timer1.Interval);
  end;
  if Msg.message = WM_KEYDOWN then
  begin
    timer1.Enabled := false;
    NextTimer := GetTickCount + DWORD(timer1.Interval);
  end;
  if Msg.message = WM_MOVE then // <<<< passiert nie
     FrmSuchen.FormShow(self);
end;
Stehe ich irgendwo völlig auf dem Schlauch ? Diese geschichte mit den Windows Messages ist neu für mich und vielleicht mache ich ja etwas grundsätzlich falsch :roll:

Vielen Dank schonmal für eure Antworten :)
Gruß

dbdeath74 5. Sep 2005 09:30

Re: Fehler bei Messagehandler für WM_MOVE
 
Hi,

hab den Fehler jetzt gefunden.
Ich create beim Start des Programmes die Formulare, und seltsamerweise wird beim erzeugen ein WM_MOVE gesendet den er sofort abfängt(Bevor alle Formulare erzeugt sind).

Und da er in der aufgerufenen Methode auf Eigenschaften noch nicht erzeugter Forms zugreift kommt dieser Fehler.
Hab das ganze jetzt mit "if assigned(xy)" abgefangen, aber ganz verstehen tu ich es nicht :roll:

Also warum er beim Createn ein WM_Move bekommt, bzw wieso er dieses dann sofort bearbeitet anstatt erstmal alle Forms zu createn.

Gruß

tigerman33 5. Sep 2005 09:37

Re: Fehler bei Messagehandler für WM_MOVE
 
Du könntest auch die Eigenschaft ComponentState abfragen. Da steht drin, ob die Komponente gerade erzeugt wird oder nicht (beim Freigeben übrigens auch).

//edit
Ich denke, WM_MOVE wird gesendet, sobald sich die Einträge des WindowRect ändern. Da dies beim neu-initialisieren des Fensters eindeutig der Fall ist, kommt halt die entsprechende Message.

Müssten eigentlich ne ganze Menge Messages kommen, oder? Ein WM_RESIZE doch eigentlich auch. Wär jedenfalls nur logisch.

Olli 5. Sep 2005 10:18

Re: Fehler bei Messagehandler für WM_MOVE
 
Zitat:

Zitat von dbdeath74
Hab das ganze jetzt mit "if assigned(xy)" abgefangen, aber ganz verstehen tu ich es nicht :roll:

Also warum er beim Createn ein WM_Move bekommt, bzw wieso er dieses dann sofort bearbeitet anstatt erstmal alle Forms zu createn.

Was ist daran so unverständlich? WM_MOVE wird gesendet, wenn das Form bewegt wird. Eine Bewegung von "nicht-vorhanden" zu Position x/y ist ja wohl ein solcher Fall. Es ist also völlig korrekt. Desweiteren wird natürlich zuerst das Elternfenster und dann die Kindfenster auf ihm erzeugt. Entsprechend kann man auf Kindfenster noch nicht immer während der Initialisierung zugreifen. Würdest du direkt nonVCL benutzen, würde das auch klarer und die Auswirkungen wären nicht so krass, weil du dann eben nur Nachrichten sendest. Und den Funktionen ist es im Prinzip egal, ob die Nachrichten an ein nichtvorhandenes Fensterhandle gehen oder nicht. Es würde eben dann zu diesem Zeitpunkt noch nichts passieren. Bei Objekten und deren Instanzenpointern ist das natürlich etwas anders ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 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