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 Componenten Container feststellen (https://www.delphipraxis.net/136691-componenten-container-feststellen.html)

Optiplex 6. Jul 2009 09:23


Componenten Container feststellen
 
Hallo DP'ler,
ich habe eine Komponente auf dieser befinden sich mehrere andere Komponenten TCheckbox,TEdit,TButton, da sich mehrere dieser Komponente auf dem Formular befinden ist es schwer zu erkennen in welcher Kombo welches Control gerade den Focus hat. Gibt es eine Möglichkeit zu erfahren welcher Container(meine Kompo) gerade benutzt wird(aktives Control welches den Focus hat), damit ich den Container hervorheben kann?
Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.

Gruß
Dieter

Satty67 6. Jul 2009 09:45

Re: Componenten Container feststellen
 
Also für's Formular gibt es ja TForm.ActiveControl um das zu ermitteln.

Für deinen Container einzeln (wenn er eine Eigenschaft Focused liefern soll), die Controls darauf durchtesten, ob einer Focused ist. Also bei GetFocused des Containers, die 4-5 Controls schnell testen.

himitsu 6. Jul 2009 09:52

Re: Componenten Container feststellen
 
ich glaub da ist es einfacher, von Form.ActiveControl auszugehn und die Parents abzufragen

Delphi-Quellcode:
var C: TComponent;

C := ActiveControl;
while Assigned(C) do begin
  if C is TYourContainerClass then hervorheben(C);
  C := C.Parent;
end;

Satty67 6. Jul 2009 09:58

Re: Componenten Container feststellen
 
Zitat:

Zitat von himitsu
ich glaub da ist es einfacher, von Form.ActiveControl auszugehn und die Parents abzufragen

Ja, ich dachte nur für eine Eigenschaft des Containers wäre es sinnvoll, das unabhängig vom Parent zu lösen.

himitsu 6. Jul 2009 10:18

Re: Componenten Container feststellen
 
Die Eigenschaft ActiveControl kennt nicht nur TForm, sondern auch TScreen und davon gibt es ja eine aktive Instanz. :angel:

man kann so auch eine Eigenschaft draus machen
Delphi-Quellcode:
Function TMyContainer.BinIchOderEinesMeinerKomponentenAktiv: Boolean;
  Var C: TComponent;

  Begin
    C := Screen.ActiveControl;
    While Assigned(C) do Begin
      If C = Self Then Begin
        Result := True;
        Exit;
      End;
      C := C.Parent;
    end;
    Result := False;
  End;
So klettert man nur mal schnell den "Baum" runter und muß nicht erst in jeden "Zweig" schauen, ob da etwas aktiv ist.

Optiplex 6. Jul 2009 11:57

Re: Componenten Container feststellen
 
Danke für die Antworten,

mein Problem liegt eigentlich darin das Ereignis mitzubekommen für die eigentliche Komponente kann ich das mit WM_Setfocus / MW_Killfocus erreichen aber wie erhalte ich das bei den Subkomponenten. Danach kann ich den Parent irgendwie hervorheben.

Gruss Dieter

himitsu 6. Jul 2009 12:02

Re: Componenten Container feststellen
 
du könntest die OnEnter- und OnExit-Ereignisse der Subkomponenten zuseisen und auf eine Prozedur deiner "Containerklasse" verweisen.

Optiplex 6. Jul 2009 12:28

Re: Componenten Container feststellen
 
Zitat:

Zitat von himitsu
du könntest die OnEnter- und OnExit-Ereignisse der Subkomponenten zuseisen und auf eine Prozedur deiner "Containerklasse" verweisen.

ja das wäre eine Idee es umzusetzen, danke Himitsu. Dass ich da nicht selbst draufgekommen bin? :wall:

dennoch die Frage gigt es Möglichkeiten messages wie WM_ oder CM_ von den Subcomponenten abzufangen und darauf zu reagieren.
Als bestes Beispiel die das Abfangen der VK_up oder VK_down Tasten, in der eigendlichen Komponenten kein Problem in den Subkomponten bekomme ich das einfach nicht hin.

Gruß Dieter

fajac 6. Jul 2009 12:47

Re: Componenten Container feststellen
 
Man könnte für die Applikation einen Keyboard-Hook einsetzen.
Siehe SetWindowsHookEx

Optiplex 7. Jul 2009 09:01

Re: Componenten Container feststellen
 
Einen Keyboard-Hook dafür einzusetzen halte ich persönlich für übertrieben, gibt es denn keine andere Möglichkeit auf Messages von Subkomponenten zuzugreifen ?


Gruß Dieter


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