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:
| TSpinEdit(ActiveControl).Value := 2; (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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!