![]() |
OnMouseEnter/-Over/-Leave für beliebige Komponente?
Hallo Leute,
ich such nun schon etwas länger, finde aber irgendwie nichts brauchbares. Und zwar Suche ich etwas, was mir die Funktionen für ein OnMouseEnter, OnMouseOver und OnMouseLeave Event für eine beliebige Komponente (in meinem Fall eine TVirtualStringTree) bereitstellt... ...hat da jemand eine Idee oder ähnliches? :( Danke, MCXSC |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Ja, ich habe ja folgendes getestet:
Delphi-Quellcode:
Hier sagt mir Delphi aber bei:
private
{ Private-Deklarationen } ControlOnMousePos: TControl; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; public { Public-Deklarationen } end; var DemoForm: TDemoForm; implementation {$R *.dfm} procedure TDemoForm.CMMouseEnter(var Message: TMessage); var ptWork: TPoint; begin GetCursorPos(ptWork); ControlOnMousePos := FindDragTarget(ptWork, TRUE); if Assigned(ControlOnMousePos) then begin Label1.Caption := ControlOnMousePos.Name; end; end; procedure TDemoForm.CMMouseLeave(var Message: TMessage); begin ControlOnMousePos := NIL; end;
Delphi-Quellcode:
{ Private-Deklarationen }
ControlOnMousePos: TControl; Zitat:
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Das ganze etwas allegemeiner gehalten in einer Komponente hängt unten an. Dabei wird aber nicht die interne CM-xxx-nachricht verwendet, sondern die Kompenente achtet selber auf die Mouse (mit Mousecapture).
type
TForm1 = class(TForm) vst: TVirtualStringTree; Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } FoldVSTWndProc:TWndMethod; procedure VSTwndproc(var msg:TMessage); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FoldVstWndProc:=vst.WindowProc; vst.WindowProc:=vstwndproc; end; procedure TForm1.VSTwndproc(var msg: TMessage); begin FoldVSTWndProc(msG); case msg.Msg of cm_mouseleave: memo1.lines.add('bye'); cm_mouseenter: memo1.lines.add('hello'); end; end; |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, funktioniert soweit auch. Allerdings: Wenn ich ein Panel wechsel, wird die ganze Aktion wohl dauerhaft ausgeführt (siehe Demo-Projekt). Eine Idee?
(Kurze Erklärung: Ein VST, das fest auf einem "festen" Panel liegt, soll so vergrößert werden, dass es eben über "Panel 1" liegt - und auch wieder verkleinert wird.) |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Liste der Anhänge anzeigen (Anzahl: 1)
Hmmm???
Wenn ich deine Exe starte erkenne/sehe ich das Problem. Wenn ich aber den Code in Delphi 7 lade und starte, dann sieht alles ok aus (Exe im Anhang), denke ich zumindest. Ich hab zwar noch folgendes geändert (zwecks OOP), hat aber auch ohne die Änderung funktioniert:
Delphi-Quellcode:
type ...
... private ... //Die Funktionen habe ich mal in Methoden umgewandelt.. procedure VST_Expand; procedure VST_Minimize; public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.VST_Expand; begin //..Dadurch brauchst du dich hier nicht auf TForm2 zu beziehen VST.Align := alNone; VST.Width := 400; VST.Height := Panel2.Height -10; VST.Parent := Form2; end; procedure TForm2.VST_Minimize; begin VST.Parent := Panel2; VST.Align := alClient; end; |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm, also bei mir schaut es so aus (siehe Video).
Komischerweise funktioniert deine EXE - liegt das vielleicht an Turbo Delphi? :( |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Beim Laden des Projektes kommen noch ein paar Warnungend. Mein delphi kennt die Größen "ExplicitXXX" bei Panel1 und VST nicht. Aber ich kann mir nicht vorstellen, dass es daran liegt. Vielleicht wurde ja etwas anderes noch verändert. Ich habe bloß heute grad keine Zeit darüber nachzudenken.
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Hmmm.... Sonst hat keiner eine Idee? :(
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Also, das Problem scheint irgendwo daran zu liegen, dass ich die VST auf ein anderes Panel übertrage. Wenn ich die mit "---> xyz <---" markierten Zeilen herausnehme, klappt es; aber das ist ja nicht Sinn der Sache (bzw. so funktioniert es nicht so, wie es soll, nämlich das die VST über das "feste" Panel hinausragt...
Delphi-Quellcode:
type ...
... private ... procedure VST_Expand; procedure VST_Minimize; public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.VST_Expand; begin VST.Align := alNone; VST.Width := 400; VST.Height := Panel2.Height -10; ---> VST.Parent := Form2; <--- end; procedure TForm2.VST_Minimize; begin ---> VST.Parent := Panel2; <--- VST.Align := alClient; end; |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Du kannst ja während des Veränderns des VST durch/über eine Variable ein weiteres "Verändern" blocken.
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Hm und wie z.B.? Ich hab schon versucht, in dad "VST_Minimize" eine Bedingung einzubauen (z.B. if width = 400), aber auch das klappt nicht...
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Weiß auch nicht genau. Vielleicht in der Case-Anweisung:
Delphi-Quellcode:
vielleicht kommen zu viele Messages hintereinander. Aber ich vermute grad fast, dass dies das Problem nicht löst.
if not MouseMsgOnWork then //Feld der Klasse
begin MouseMsgOnWork:=true; try case msg.msg of ... end; finally MouseMsgOnWork:=false; end; end; |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Zitat:
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Dann würde mir noch einfallen, einen Timer zu benutzen (ist nicht so schön, verhindert aber gleich generell ein Flackern) Damit schaffst du dir eine Art zeitliche Hysterese.
Delphi-Quellcode:
Edit: Ahh, das ist auch noch nicht vollständig. Du musst dir trotzdem bei jeder MEssage merken, welcher Zustand gerade aktuell ist, und den dann im Timer-Ereignis schließlich einstellen.
type ...
... Timer:TTimer; private ... MsgMouseOnWork:Boolean; //mit false initialisieren ... procedure VST_Expand; procedure VST_Minimize; procedure VST_StartTimer; public { Public-Deklarationen } end; ... procedure TForm2.VST_StartTimer; begin MsgMouseOnWork:=true; Timer.enabled:=true; end; procedure TForm2.TimeronTimer(...); //Timerereignis begin MsgMouseOnWork:=false; Timer.enabled:=false; end; procedure TForm2.VST_Expand; begin if not MsgMouseOnWork then begin VST.Align := alNone; VST.Width := 400; VST.Height := Panel2.Height -10; ---> VST.Parent := Form2; <--- VST_startTimer; end; end; procedure TForm2.VST_Minimize; begin if not MsgMouseOnWork then begin ---> VST.Parent := Panel2; <--- VST.Align := alClient; VST_starttimer; end; end; |
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Ja, so habe ich es ja bisher auch... Aber die Sache mit einem direkten MouseOver wäre ja etwas sauberer^^
|
Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
Für mich ist halt grad schwer das Problem zu entdecken, weil es ja in D7 funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz