Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem: Panel.OnMouseLeave wenn Chldcomponente bemaust wird (https://www.delphipraxis.net/174570-problem-panel-onmouseleave-wenn-chldcomponente-bemaust-wird.html)

erich.wanker 29. Apr 2013 15:28

Problem: Panel.OnMouseLeave wenn Chldcomponente bemaust wird
 
Hallo Leute,

hab mal wieder eine Basisfrage ;-)

Auf vielen Panels ist jeweils ein Editfeld..

Die Panel´s besitzt:
Delphi-Quellcode:
procedure TMainForm.PanelMouseEnter(Sender: TObject);
begin
(sender as Tpanel).Color:=clgray;
end;

procedure TMainForm.PanelMouseLeave(Sender: TObject);
begin
(sender as Tpanel).Color:=clsilver;
end;
Die Editfelder mit "Parent= Panel XY" besitzen keine Ereignisse..

Wenn ich nun mit der Maus über die Panels fahre, wird die Farbe wie gewünscht geändert.
Wenn ich aber über die Editfelder fahre, blinkt das darunterliegende Panel kurz clsilver auf, und schaltet dann wieder auf clGray ..

Ich vermute, weil der Event "onMouseleave" vom Panel gesendet wird, wenn die Mausspitze aus dem Bereich "Panelfläche" in den bereich "editfläche" wechselt - aber gleich wieder umschaltet, weil das edit dem panel meldet, das die maus über ihm ist... ?

Wie kann ich dieses "Blinkverhalten" unterbinden?

Vielen Dank
Erich

stahli 29. Apr 2013 16:19

AW: Problem: Panel.OnMouseLeave wenn Chldcomponente bemaust wird
 
Wenn das Panel das Edit kennt, dann wäre das ein Ansatz:
Delphi-Quellcode:
procedure TodPanelCourt.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  ...
  BitBtnCancel.Visible := True;
  BitBtnCancel.Left := Width - BitBtnCancel.Width;
  BitBtnCancel.Top := 0;
end;

procedure TodPanelCourt.CMMouseLeave(var Message: TMessage);
var
  pt: TPoint;
  H: hwnd;
begin
  inherited;
  ...
  GetCursorPos(pt);
  H := WindowFromPoint(pt);
  if (H = Handle) or (H = BitBtnCancel.Handle) then
    Exit;
  BitBtnCancel.Visible := False;
end;
Ansonsten kann man noch prüfen, ob sich die Maus noch über dem Panel befindet:
Delphi-Quellcode:
function IsMouseOverControl(const ctrl: TControl): boolean;
var
  sr: TRect;
begin
  sr := Rect(ctrl.ClientToScreen(Point(0, 0)), ctrl.ClientToScreen(Point(ctrl.Width, ctrl.Height)));
  result := PtInRect(sr, Mouse.CursorPos);
end;

Bummi 29. Apr 2013 16:27

AW: Problem: Panel.OnMouseLeave wenn Chldcomponente bemaust wird
 
Da Du Delphi7 verwendest wirst Du CMMouseEnter und CMMouseLeave verwenden.
Hier bekommst Du in LParam einen Zeiger auf den eigentlichen Empfänger der Message übermittelt, sofern vorhanden.

Delphi-Quellcode:
procedure TMyComp.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  if (Message.LParam = 0) then
    Color:=clgray
//  else if TComponent(Message.LParam) = FEdit then Showmessage('Edit überfahren')
end;

procedure TMyComp.CMMouseLeave(var Message: TMessage);
begin
  inherited;
  if (Message.LParam = 0) then
      Color:=clsilver;
end;


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