Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: MouseWheel-Messages in Child-Komponente empfangen

  Alt 13. Jun 2007, 09:57
Danke!
Der Fokus lag nicht auf form1 sondern auf der Listbox
Wenn ich also keine Listbox, kein Memo ... kein sonstiges Wincontrol, was sich den Fokus schnappt benutze funktioniert das Subcalssing. ansonsten reicht es auch aus als "Focusedwindow einfach die Listbox zu übergeben:
  panel1:=tmypanel.Create(self,self.listbox1); Da ich aber nie weis, was auf dem Formular alles so drauf ist, bzw, was grad den Fokus hat, wäre ja das subclassen umständlicher als ein Hook. Und den Fokus immer auf mein Panel zu lenken ist auch nicht die Lösung.

Jetzt ist mir auch klar (und meine Welt ist wieder in Ordnung) warum in der Abarbeitung der Msg ständig diese CustomListbox auftaucht. Die Reihenfolge ging so:
Zitat:
user32.dll
stdwndProc (in Unit Classes)
TWincontrol.MainWndProc
TCustomListbox.WndProc
TWincontrol.WndProc
TControl.WndProc
TControl.WMMouseWheel
Und dann wurde das Mausrad bearbeitet. Und ich habe mich immer gefragt, wenn ich doch vor der StdWndProc sitze, müsste ich die Message auch bekommen. Aber nix kam an. Jetzt ist es klar. Ich saß vor der Falschen.
Also, das Subclassing führt nicht zum Ziel, da ich nie weis, wo ich grad subclassen muss. Und dafür ist ein Hook besser geeignet.

Aber jetzt kommt der Clou
Mich hat ja schon die ganze Zeit gewundert, dass die VCL sowas nicht anbietet. Bzw. ich habe es einfach nicht gefunden. TApplication.onMessage hat mich auf die Spur gebracht. TApplication.onMessage selber geht allerdings nicht. Da ich ja nur eine autarke Komponente schreiben will und nicht weis, was sonst noch so in der Anwendung passiert. Nicht das das Programm woanders noch Tapplication.OnMessage benutzt und ich es dann mit meiner Komponente netterweise überschreibe. Oder die Kompoente wird zweimal benutzt, weswegen ich ja auch umständlich versucht habe globale Variablen in der Unit zu vermeiden und diese Assemblerzeilen etc. entstanden. Deswegen ist Tapplication ungeeignet.

==> Solution
TApplicationEvents.OnMessage
So Simpel kann es sein.
Hier noch kurz der relevante Ausschnitt, er ist deutlich kürzer geworden
Delphi-Quellcode:
onstructor Tmypanel.create(AOwner:Tcomponent);
begin
  inherited create(Aowner);
  Appevent:=TApplicationEvents.Create(self);
  appevent.OnMessage:=DoOnMessage;
  label1:=tlabel.Create(self);
  label1.parent:=self;
  label1.top:=10;
  label1.Left:=10;
end;

procedure TmyPanel.DoOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if msg.message=wm_mousewheel then begin
    label1.Caption:='Wheel: '+inttostr(smallint(hiword(msg.wParam)));
    form1.ListBox1.Items.Add('Wheel: '+inttostr(smallint(hiword(msg.wParam))));
  end;
end;
Danke bitsetter! Manchmal brauch man halt jemanden, der einem das Brett vorm Kopf entfernt
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat