Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponente über Index ansprechen


rushifell - Sa 22.12.12 10:49
Titel: Komponente über Index ansprechen
Hallo,

ich habe ein Formular mit etwa 20 SpinEdits. Nun möchte ich über die Eigenschaft Focused herausfinden, welche dieser Komponenten den Fokus hat und verschiedene Eigenschaften dieser Komponente am besten über den Index auslesen.

Wie kann ich über eine For-Schleife herausfinden, welche dieser Komponenten den Fokus hat?

Vielen Dank schonmal :-)


bummi - Sa 22.12.12 11:03

Do benötigst keine For Schleife:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm6.Timer1Timer(Sender: TObject);
begin
      if Assigned(ActiveControl) then
        Caption := ActiveControl.name else Caption :='<>';
end;


rushifell - Sa 22.12.12 13:57

Danke bummi. Super, das funktioniert einwandfrei. Ich überprüfe das übrigens im OnChanging-Ereignis einer PageControl-Komponenten (also beim Wechseln des Tabsheets).

Ist das folgendermaßen korrekt/sauber, wenn ich die Werte der Komponente lesen/ändern möchte?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if Assigned(ActiveControl) then
   BEGIN
    IF ActiveControl is TSpinEdit then
       BEGIN
        (ActiveControl as TSpinEdit).Value:=2;
       END;
   END;


bummi - Sa 22.12.12 15:03

Ob es das ist was Du willst kannst nur Du beurteilen, technisch ist es einwandfrei.


rushifell - Sa 22.12.12 15:20

Danke, wobei ich den Namen der Komponenten natürlich doch brauche, einfach um zu wissen, um welches SpinEdit es sich letztendlich handelt. Das oben war nur als Beispiel gedacht, bringt mir in der Form nichts ;-)


WasWeißDennIch - Sa 22.12.12 17:41

Mir ist zwar nicht klar, wozu Du den Namen brauchst, aber wieso nicht einfach so?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if Assigned(ActiveControl) then
  if ActiveControl is TSpinEdit then
    begin
      ShowMessage(ActiveControl.Name);
      TSpinEdit(ActiveControl).Value := 2;
    end;


rushifell - Sa 22.12.12 18:43

WasWeißDennIch hat folgendes geschrieben:
Mir ist zwar nicht klar, wozu Du den Namen brauchst, aber wieso nicht einfach so?

Es geht um den Leveleditor für ein Spiel (siehe Freeware-Bereich). Für jedes Level können bestimmte Eigenschaften festgelegt werden, wie z.B. Zeit, die zur Verfügung steht, Anzahl der Diamanten, die gesammelt werden muss, Spielgeschwindigkeit etc.. Da es sich bei den Eigenschaften meist um Zahlenwerte handelt, verwende ich zum Großteil Spinedits. SpinEdits finde ich dafür sehr komfortabel.

Manchmal bietet es sich an, dass man einen bestimmten Wert für alle Level gleich setzen möchte: Als Beispiel, immer die gleiche Spielgeschwindigkeit. Nun ist es sehr zeitaufwendig und umständlich, für jedes Level einzeln die neue Spielgeschwindigkeit per Hand einzugeben. Nun biete ich einfach die Möglichkeit, dass man auf das SpinEdit mit der Spielgeschwindigkeit den Fokus setzt und anschließend für alle gewünschten Level diesen Wert automatisch ändern lässt. Letztendlich wird der Wert dann nicht im SpinEdit selbst sondern in den Leveldaten (MemoryStream) gespeichert. Um zu wissen, dass in meinem Beispiel die Spielgeschwindigkeit geändert werden soll, brauche ich dann doch den Namen des Spinedits. Ansonsten bräuchte ich den Namen natürlich nicht, da hast Du vollkommen recht.

Eine Frage auf Deine Antwort:

Delphi-Quelltext
1:
2:
3:
4:
5:
//Was ist der Unterschied zwischen...
TSpinEdit(ActiveControl).Value := 2;
//und
(ActiveControl as TSpinEdit).Value:=2;
//?


WasWeißDennIch - Sa 22.12.12 19:01

As prüft, ob es sich bei dem Objekt um die angegebene Klasse bzw. einen Nachfahren davon handelt (also eine Is-Abfrage). Falls nicht, wird eine Exception geworfen. Da Du das aber bereits direkt vorher mit is abgeprüft hast, kann die erneute Prüfung entfallen, da tut es auch ein harter Typecast, ansonsten wäre das doppelt gemoppelt.