Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OnMouseEnter/-Over/-Leave für beliebige Komponente? (https://www.delphipraxis.net/121068-onmouseenter-over-leave-fuer-beliebige-komponente.html)

MCXSC 21. Sep 2008 23:31


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

toms 22. Sep 2008 05:41

Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
 
Hallo Marcel

Probier's mal mit Hier im Forum suchenCM_MOUSEENTER resp. Hier im Forum suchenCM_MOUSELEAVE etc.

MCXSC 22. Sep 2008 07:47

Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
 
Ja, ich habe ja folgendes getestet:

Delphi-Quellcode:
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;
Hier sagt mir Delphi aber bei:

Delphi-Quellcode:
{ Private-Deklarationen }
ControlOnMousePos: TControl;
Zitat:

Feld DemoForm.ControlOnMousePos besitzt keine entsprechende Komponente. Soll die Deklaration entfernt werden?

sirius 22. Sep 2008 10:24

Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
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;
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).

MCXSC 23. Sep 2008 02:50

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.)

sirius 23. Sep 2008 08:00

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;

MCXSC 23. Sep 2008 10:11

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? :(

sirius 23. Sep 2008 10:16

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.

MCXSC 23. Sep 2008 21:48

Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
 
Hmmm.... Sonst hat keiner eine Idee? :(

MCXSC 24. Sep 2008 19:07

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;

sirius 24. Sep 2008 19:48

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.

MCXSC 24. Sep 2008 20:01

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...

sirius 24. Sep 2008 20:10

Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
 
Weiß auch nicht genau. Vielleicht in der Case-Anweisung:
Delphi-Quellcode:
if not MouseMsgOnWork then //Feld der Klasse
begin
  MouseMsgOnWork:=true;
  try
    case msg.msg of
    ...
    end;
  finally
    MouseMsgOnWork:=false;
  end;
end;
vielleicht kommen zu viele Messages hintereinander. Aber ich vermute grad fast, dass dies das Problem nicht löst.

MCXSC 24. Sep 2008 20:17

Re: OnMouseEnter/-Over/-Leave für beliebige Komponente?
 
Zitat:

Zitat von sirius
Aber ich vermute grad fast, dass dies das Problem nicht löst.

Richtig. :(

sirius 25. Sep 2008 09:22

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:
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;
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.

MCXSC 26. Sep 2008 03:21

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^^

sirius 26. Sep 2008 09:22

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