Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Comboboxen und co.


check_it_now - Mi 18.12.02 16:33
Titel: Comboboxen und co.
guten tag,

wenn ich mir die eigenschaften von comboboxen, label, textboxen usw. ansehe kann ich keine moeglichkeit einer idizierung entdecken. ist das bei delphi so?

bsp vb6.

Quelltext
1:
2:
3:
4:
5:
6:
for i = 1 to 4
     combobox(i).text="123"
next i
for i = 5 to 8 
     combobox(i).text="xyz"
next i

damit fuelle ich gezielt z.b default infos in combobox 1-4
und andere infos in combobox 5-8 ohne diese separat ansprechen zu muessen.

was muss ich dafuer bei delphi tuen.

note: comboboxen sind nur ein beispiel.


Keldorn - Mi 18.12.02 16:44

Hallo

such mal im Forum und in der hilfe nach Findcomponent.

Mfg Frank


DeCodeGuru - Mi 18.12.02 16:44

Hi,

versuchs mal damit:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  i: Integer;
begin
  for i := 1 to 99 do
  begin
    TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Caption := 'Testnummer'+IntToStr(i);
  end;
end;


Ich denke, dass das Beispiel gut zeigt, wie man per Name auf ne Kompo zugreifen kann.


Klabautermann - Mi 18.12.02 17:09

Hallo,

das dir aus Visual-Basic bekannte Konzept der Komponentenarrays gibt es im Delphi nicht. Das wird für dich wahrscheinlich genau so störent sein, wie es für mich war, das VB meine Copy/Paste Komponenten immer in so'n Ding gehängt hat.

Die Lösung von DeCodeGuru ist das, was am dichtesten rankommt. Aber du solltest das ganze noch ein wenig absichern, um keine Exceptions zu verursachen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  i: Integer;
  Compo : tComponent;
begin
  for i := 1 to 99 do begin
    Compo := FindComponent('CheckBox'+IntToStr(i));
    IF (Compo <> NIL) THEN // Komponente wurde gefungen
      IF (Compo IS tCheckBox) THEN // Wenn es sich um eine Checkbox handelt
        TCheckBox(Compo).Caption := 'Testnummer'+IntToStr(i)
      ELSE IF (Compo IS tEdit) THEN // Wenn es ein Edit ist
        TEdit(Compo).Text := 'Testnummer'+IntToStr(i);
  end;
end;


Gruß
Klabautermann


check_it_now - Do 19.12.02 09:01

ok dann muss ich umdenken

danke @all


Andreas.Schmid - Do 19.12.02 17:34

Hallo @All,

ich hätte da vielleicht eine noch bessere Lösung zu bieten!

Wenn du nämlich die Namen der Komponenten nicht kennst, sondern nur den Typ und diese trotzdem ansprechen willst, dann könnte meine Lösung dir weiter helfen.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  i: integer;
begin
  for i := 0 to (self.ComponentCount - 1) do begin
    if (self.Components[i] is TComboBox) then begin
      TComboBox(self.Components[i]).{hier können alle Eigenschaften der ComboBox angesprochen werden}
    end;
  end;
end;

TComboBox kannst du durch jede beliebige visuelle Komponente ersetzten.

Besonders wichtig ist aber, dass die Sicherheit gegeben ist und du keine Komponente finden kannst, die es nicht gibt. :D

Ist das, das was du wolltest oder hab ich da etwas falsch verstanden?


Klabautermann - Do 19.12.02 17:48

Nachtrag: Wenn du viele Komponenten Dynamisch erzeugst (und das ist meiner bescheidenen Meinung nach der Einzige sinnvolle einsatz der Indizierten Komponenten) Kannst du übrigens ein Array OF MyCompo definieren und über deren Indizies drauf zudreifen.
Ein (ungetestetes) Beispiel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private
  fLabels : ARRAY[1..100] OF tLabel;
[...]

procedure MkLabels;
  VAR
     i : Byte;
begin
  FOR i := 1 TO 100 DO BEGIN
    fLabels[i] := tLabel.Create(MainForm);
    fLabels[i].Left := 25;
    fLabels[i].Top := i * 30;
  END;
end;

procedure SetText(lbl : Byte; TXT : STRING);
begin
  fLabels[lbl].Caption := TXT;
end;


Gruß
Klabautermann