![]() |
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:
Die Editfelder mit "Parent= Panel XY" besitzen keine Ereignisse..
procedure TMainForm.PanelMouseEnter(Sender: TObject);
begin (sender as Tpanel).Color:=clgray; end; procedure TMainForm.PanelMouseLeave(Sender: TObject); begin (sender as Tpanel).Color:=clsilver; end; 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 |
AW: Problem: Panel.OnMouseLeave wenn Chldcomponente bemaust wird
Wenn das Panel das Edit kennt, dann wäre das ein Ansatz:
Delphi-Quellcode:
Ansonsten kann man noch prüfen, ob sich die Maus noch über dem Panel befindet:
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;
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; |
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 23:19 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