Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi erkennen wenn anderes Control ausgewält wird (https://www.delphipraxis.net/97802-erkennen-wenn-anderes-control-ausgewaelt-wird.html)

oki 16. Aug 2007 15:40


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?

FritzAT 26. Aug 2007 19:04

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:
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;
Denke mit diesen code kannst du weitermachen...

oki 26. Aug 2007 19:57

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

oki 18. Feb 2008 08:45

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:
const wm_Deselect = wm_User + 1;
Zweitens: Botschaftsbehandhandlung implementieren
Delphi-Quellcode:
  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;
Drittens: aufrufen des Ereignisses für Container und alles entaltenen Controls
Delphi-Quellcode:
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;
Jo, das klappt bei mir super.

Gruß oki


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