Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Frage zur Arbeit mit Combobox.


marcelrusi - Do 09.06.11 14:26
Titel: Frage zur Arbeit mit Combobox.
Hallo Leute,

Ich habe folgendes Problem:

Ich möchte bei Delphi ein Programm erstellen, bei dem man aus einer Combobox ( geht das ?? ) einen Begriff auswählt und eine Zahl angegeben bekommt.

Beispiel: Wenn ich 'Stein' auswähle kommt in ein Label die Zahl 1.

Kann mir bitte jemand erklären wie das geht ??


Moderiert von user profile iconMartok: Topic aus Sonstiges (Delphi) verschoben am Do 09.06.2011 um 14:51


Bergmann89 - Do 09.06.11 14:34

Hey,

mach dir ein Array mit den Zahlen die du ausgeben willst. In die ComboBox schreibst du in die "Items"-Eigenschaft die Wörter (in der gleichen Reihenfolge wie dazugehörigen Zahlen im Array. Dann brauchst du noch ein Label auf dem du die Zaheln ausgibst. Dann machst du einen DFoppelklick auf deine ComboBox, um so die OnChange-Methode zu erstellen, die wird aufgerufen, sobald due den Wert der Box änderst. In dieser Methode kannst du mit ComboBox.ItemIndex auf den Index des selektierten Items zugreifen. Mit diesem Index holst du deine Zahl aus dem Array und gibst sie auf dem Label aus.

MfG Bergmann.


zuma - Do 09.06.11 14:45

wozu noch extra ein Array ? in der ComboBox ist ja ne stringlist .... da kannste doch mit String und Object arbeiten?
Beim Reinfügen z.B.

String mit zugehöriger Zahl eintragen

Delphi-Quelltext
1:
ComboBox.Items.AddObject('EinString', TObject(1));                    

auslesen (aktuelle pos)

Delphi-Quelltext
1:
2:
EinString := ComboBox.Items.Strings[ComboBox.ItemIndex];
Zahl      := Integer(ComboBox.Items.Objects[ComboBox.ItemIndex]);

String zur Zahl geben

Delphi-Quelltext
1:
EinString := ComboBox.Items.Strings[ComboBox.Items.IndexOfObject(TObject(1))];                    


marcelrusi - Do 09.06.11 14:56

Also mein Quelltext sieht bis jetzt so aus :



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 ComboBox1.Items.AddObject ('Stein', TObject(1));
  ComboBox1.Items.AddObject ('Gras', TObject(2));
   ComboBox1.Items.AddObject ('Erde', TObject(3));
    ComboBox1.Items.AddObject ('Cobblestone', TObject(4));
     ComboBox1.Items.AddObject ('Holz', TObject(5));
      ComboBox1.Items.AddObject ('Baum', TObject(6));



ist wahrscheinlich nicht richtig, damit die Begriffe 'Stein' etc. in der Combobox erscheinen....

wie funktioniert das richtig ?

sorry für mein Unverständniss, aber ich arbeite erst seit kurzen mit Delphi ;)


mvollmer - Do 09.06.11 15:03

So wie du es jetzt machst, werden beim ändern des ComboBox Items diese 6 Items hinzugefügt.

Nimm Sie dort raus und schreib sie in den FormCreate Methode.

Im OnChange Ereignis sollte nur das ändern des Labels drinstehen.

btw: sieht stark nach Minecraft aus^^


marcelrusi - Do 09.06.11 15:12

Ah ok und wo schreibe ich das :

1:EinString := ComboBox.Items.Strings[ComboBox.ItemIndex];
2:Zahl := Integer(ComboBox.Items.Objects[ComboBox.ItemIndex]);

und das :

1:EinString := ComboBox.Items.Strings[ComboBox.Items.IndexOfObject(TObject(1))];

rein ?

Mit Minecraft hast du recht ;) :P


whitef - Do 09.06.11 15:50

wie wärs damit?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Add('Stein');
ComboBox1.Items.Add('Gras');
ComboBox1.Items.Add('Erde');
ComboBox1.Items.Add('Cobblestone');
ComboBox1.Items.Add('Holz');
ComboBox1.Items.Add('Baum');
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
label1.Caption := InttoStr(ComboBox1.ItemIndex + 1);
if ComboBox1.ItemIndex + 1 = 0 then
label1.Caption := 'Bitte wählen...';
end;


marcelrusi - Do 09.06.11 15:56

Perfekt , Danke ;)

Hats mir sehr geholfen ;))


Bergmann89 - Do 09.06.11 16:47

Hey,

dazu müssen die Zahlen zu den Strings aber aufsteigend sortiert und lückenlos sein. Und da bei Minecraft manche IDs nich belegt sind wird er da früher oder später wieder Probleme haben. Deshalb ist die Verknüpfung mit den Objekten hier die richtige Lösung. Dein Code war ja auch richtig, nur an der falschen Stelle!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.AddObject('Stein', TObject(1));
  ComboBox1.Items.AddObject('Gras', TObject(2));
  ComboBox1.Items.AddObject('Erde', TObject(3));
  ComboBox1.Items.AddObject('Cobblestone', TObject(4));
  ComboBox1.Items.AddObject('Holz', TObject(5));
  ComboBox1.Items.AddObject('Baum', TObject(6));
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  ID: Integer;
begin
  ID := ComboBox.ItemIndex;
  if (ID >= 0and (ID < ComboBox.Items.Count) then
    Label1.Caption := IntToStr(Integer(ComboBox.Items.Objects[ID]))
  else
    Label1.Caption := 'Kein Item gewählt!';
end;


user profile iconwhitef hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
label1.Caption := InttoStr(ComboBox1.ItemIndex + 1);
if ComboBox1.ItemIndex + 1 = 0 then
label1.Caption := 'Bitte wählen...';
end;

Warum erst rechnen? Prüf doch gleich auf -1.

€: vlt hilft dir DAS [http://www.christian-stelzmann.de/artikel/crashkurs.htm] auch weiter. Denn so wie es aussieht hast du große Probleme Code selber zu schreiben, und einfach Copy&Paste is nich Sinn der Sache. Vorallem nich wenn man den kopierten Code nicht versteht un dann irgendwo im Programm einfügt und sich wundert warum nix geht ;)

MfG Bergmann.


whitef - Do 09.06.11 19:06

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Hey,
user profile iconwhitef hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
label1.Caption := InttoStr(ComboBox1.ItemIndex + 1);
if ComboBox1.ItemIndex + 1 = 0 then
label1.Caption := 'Bitte wählen...';
end;

Warum erst rechnen? Prüf doch gleich auf -1.


hast recht, war wohl ein wenig zu schnell^^