![]() |
erkennen wenn anderes Control ausgewält wird
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich möchte in einem Control erkennen, wenn der Focus auf ein anderes Control wechselt. Dazu benutze ich die vererbten Methoden DoEnter und DoExit. Funzt auch super. Nun ist es aber so, dass eins meiner Controls (Panel) den Container für andere Controls darstellt. Der Focus wechselt aber nur, wenn ein Control in einem anderen Container den Focus enthält. Clicke ich auf meinen Container, so verliert das darin enthaltene Element jedoch nicht den Focus; zumindest wird nicht OnExit (DoExit) aufgerufen. Da ich dies aber zum selektieren meiner Controls benutze, hab ich hier ein Problem. Bei meinem Beispiel im anhang soll also folgendes passieren: - Klicke ich mein Panel an, so soll das Panel selectiert sein und das Label nicht. - Klicke ich mein Label an, so soll mein Label selektiert sein und mein Panel nicht. Im MouseDown meiner Controls wird self.SetFocus aufgerufen. Das ganze klappt nur, wenn ich z.B. zwichen zwei Panels hin und her clicke (steht so auch korrekt in der Hilfe). Also es macht schon das richtige. Das ist aber nicht das was ich will. Kennt hier jemand eine andere Lösung? |
Re: erkennen wenn anderes Control ausgewält wird
Hallo!
Habe da etwas in meinen fundus gefunden(woher? - keine ahnung). { (Beispiel) Hier die allgemein gültige Procedure für OnMouseUp. Die Behandlung von OnClick bleibt dabei erhalten: die Funktionalität aus OnMouseUp kommt dazu. }
Delphi-Quellcode:
Denke mit diesen code kannst du weitermachen...
procedure TForm1.GenericMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var TWC: TWinControl; begin TWC := FindControlAtPos; //what for a class ! Showmessage('Here we are: ' + TWC.ClassName); //Let it blink... TWC.Visible := False; Sleep(150); TWC.Visible := True; end; |
Re: erkennen wenn anderes Control ausgewält wird
Hi FritzAT,
erstmal Dank für die Antwort. Leider ist es nun so, dass das nicht mein Problem ist. Meine Controls implementieren die Procedure MouseDown. Somit kann ich die Auswahl meines Controls problemlos erkennen. Die Frage ist, wie kann ich alle anderen Controls davon benachrichtigen, dass sie deselektiert sind? Gruß Oki |
Re: erkennen wenn anderes Control ausgewält wird
Hi Leute,
habe jetzt eine Lösung gefunden. Ich denke, die ist auch recht elegant. Erstens: eigene Botschaft erstellen:
Delphi-Quellcode:
Zweitens: Botschaftsbehandhandlung implementieren
const wm_Deselect = wm_User + 1;
Delphi-Quellcode:
Drittens: aufrufen des Ereignisses für Container und alles entaltenen Controls
TBaseCustomControl = class(TCustomControl)
private procedure WMDESELECT(var AMsg: TMessage); message WM_DESELECT; .... // setzt eigene Eigenschaft und zeichnet deselektiertes Control procedure TBaseCustomControl.WMDESELECT(var AMsg: TMessage); begin if Pointer(AMsg.LParam) <> self then self.Selected := False; end;
Delphi-Quellcode:
Jo, das klappt bei mir super.
procedure TBaseCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); begin if not FSelected then begin self.SetFocus; Selected := True; // wenn Shift-Tase nicht gedrückt ist, dann alle anderen Controls deselectieren if not (ssShift in Shift) then DeselectControls; end; inherited; end; procedure TBaseCustomControl.DeselectControls; var Msg: TMessage; begin Msg.Msg := wm_Deselect; Msg.LParam := Longint(self); Msg.WParam := 0; Msg.Result := 0; // Container deselekteieren wenn selektiert Parent.Broadcast(Msg); // alle anderen Controls deselektieren Parent.Perform(wm_Deselect, Msg.LParam, Msg.WParam); end; Gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 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 by Thomas Breitkreuz