Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Procedure zum befüllen von TComboBoxen


neuling321 - Sa 21.05.16 17:13
Titel: Procedure zum befüllen von TComboBoxen
Hallo

Ich möchte mittel dieser Procedure TComboBoxen befüllen.
Leider bekomme ich eine Fehlermeldung und weiss nicht genau warum.
Die Werte werden aus einer ini Datei geholt, das klappt soweit auch gut.
Es scheitert an den Namen der Comboboxen, die ich beim Aufruf der Procedure
mit übergebe.
Hier der Code:

Aufruf:

Delphi-Quelltext
1:
  fillcombo('combowertb''material''matwert');                    


Procdedure:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.fillcombo(ComboName, iniSection, iniKey : String);
var
  I : integer;
  strIniKey : String;
  strIniKeyALL : TStringList;

begin
  strIniKeyALL:= tstringlist.Create;

  ALLinOneIni := tinifile.Create('.\test.ini');
  try;
    for I := 1 to 50 do begin
      strIniKey := ALLinOneIni.ReadString(iniSection, iniKey + inttostr(I),'');
      if strIniKey <> '' then
      begin
        strIniKeyALL.Add(strIniKey);
      end;
    end;
  finally
    ALLinOneIni.Free;
  end;

    TComboBox(ComboName).Items.Assign(strIniKeyALL);  <--- Hier muss der Fehler liegen

end;


ini-Datei:

Delphi-Quelltext
1:
2:
3:
4:
5:
[material]
matname1=Eiche
matwert1=1
matname2=Buche
matwert2=2


Christian S. - Sa 21.05.16 17:43

Hallo,

Du kannst den String Comboname nicht einfach in eine TComboBox casten. Was Du brauchst, ist Suche in der Entwickler-Ecke FINDCOMPONENT.

Grüße
Christian


neuling321 - Sa 21.05.16 19:50

Danke schön, jetzt klappt es :-)


Nersgatt - Mo 23.05.16 08:55

Ich erlaube mir mal, Deine Procedure etwas umzuschreiben. Denn sie hat ein paar Probleme.
Vor alllem gibst Du strIniKeyAll nicht mehr frei, Du hast also ein Speicherleck.
Wenn Du den Aufruf etwas veränderst und nicht den Namen der Combobox übergibst, sondern eine Referenz auf die Combobox selber, würdest Du Dir auch FindComponent sparen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.fillcombo(AComboBox : TComboBox; iniSection, iniKey : String);
var
  I : integer;
  strIniKey : String;

begin

  ALLinOneIni := tinifile.Create('.\test.ini');
  try
    for I := 1 to 50 do begin
      strIniKey := ALLinOneIni.ReadString(iniSection, iniKey + inttostr(I),'');
      if strIniKey <> '' then
      begin
        AComboBox.Items.Add(strIniKey);
      end;
    end;
  finally
    ALLinOneIni.Free;
  end;

end;


Der Aufruf sähe dann so aus:

Delphi-Quelltext
1:
fillcombo(combowertb, 'material''matwert');                    


So ist es etwas hübscher.


neuling321 - So 29.05.16 13:31

Hallo Jens

Ich bekomme nun bei AComboBox undeklarierter Bezeichner.
Habe ich da irgendwas vergessen?


Nersgatt - So 29.05.16 18:18

Hast Du auch den Teil im Interfaceteil angepasst?