AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Fehler bei Messagehandler für WM_MOVE
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei Messagehandler für WM_MOVE

Ein Thema von dbdeath74 · begonnen am 2. Sep 2005 · letzter Beitrag vom 5. Sep 2005
Antwort Antwort
dbdeath74

Registriert seit: 30. Aug 2005
53 Beiträge
 
#1

Fehler bei Messagehandler für WM_MOVE

  Alt 2. Sep 2005, 15:31
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

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

Vielen Dank schonmal für eure Antworten
Gruß
  Mit Zitat antworten Zitat
dbdeath74

Registriert seit: 30. Aug 2005
53 Beiträge
 
#2

Re: Fehler bei Messagehandler für WM_MOVE

  Alt 5. Sep 2005, 10:30
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

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

Gruß
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Fehler bei Messagehandler für WM_MOVE

  Alt 5. Sep 2005, 10:37
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.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: Fehler bei Messagehandler für WM_MOVE

  Alt 5. Sep 2005, 11:18
Zitat von dbdeath74:
Hab das ganze jetzt mit "if assigned(xy)" abgefangen, aber ganz verstehen tu ich es nicht

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 ...
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:30 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