Autor Beitrag
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Sa 22.12.12 10:49 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Sa 22.12.12 11:03 
Do benötigst keine For Schleife:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm6.Timer1Timer(Sender: TObject);
begin
      if Assigned(ActiveControl) then
        Caption := ActiveControl.name else Caption :='<>';
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: rushifell
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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?

ausblenden 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;


Zuletzt bearbeitet von rushifell am Sa 22.12.12 15:11, insgesamt 2-mal bearbeitet
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Sa 22.12.12 15:03 
Ob es das ist was Du willst kannst nur Du beurteilen, technisch ist es einwandfrei.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Sa 22.12.12 17:41 
Mir ist zwar nicht klar, wozu Du den Namen brauchst, aber wieso nicht einfach so?
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
//Was ist der Unterschied zwischen...
TSpinEdit(ActiveControl).Value := 2;
//und
(ActiveControl as TSpinEdit).Value:=2;
//?
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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.