ComboBox OnSelect

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

ComboBox OnSelect

Beitrag von flashkid »

Hallo.

Ich habe eine Frage zur ComboBox und ihrem Ereignis OnSelect.
Ich möchte, dass man in dem DropDown der ComboBox einen Eintrag (in diesem Fall Var1) auswählen kann und dann in das Editfeld der ComboBox nicht Var1 eingetragen wird, sondern eine Zahl, die im Programm für Var1 hinterlegt wurde.

Ich habe versucht es so zu lösen:

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  If ComboBox1.Text = 'Var1' then ComboBox1.Text := '123,45';
end;
Leider wird dann der Text in der ComboBox gelöscht :( Wenn ich direkt hinter meinen Aufruf ein

Code: Alles auswählen

ShowMessage('Test')
schreibe steht die Zahl allerdings noch im Feld, nach OK klicken wird sie aber gelöscht.

Wie kann ich das verhindern, bzw. woran liegt das?

Grüße, flashkid

Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: ComboBox OnSelect

Beitrag von Live »

Das Edit-Feld beinhaltet nicht die Items der Combobox. Um eine Selektion ausführen zu können musst du ein Item der Box ansprechen.

Probier es doch mal mit den Items der Combobox.

Z.b. so:

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
if (ComboBox1.Items[0]= 'Var1') then
begin
ComboBox1.Text:='2323';
ShowMessage(ComboBox1.Text);
end;
end;
Grüße Live

Benutzeravatar
didi
Beiträge: 46
Registriert: Mo 10. Mai 2010, 20:43
OS, Lazarus, FPC: Linux / Windows
CPU-Target: AMD 64-Bit
Wohnort: Plauen im Vogtland
Kontaktdaten:

Re: ComboBox OnSelect

Beitrag von didi »

Halle ein ähnliches Problem mit der Eigenschaft "Text" der ComboBox:
http://www.lazarusforum.de/viewtopic.php?f=55&t=4035
Hilft Dir vielleicht auch bissel weiter. ><>

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: ComboBox OnSelect

Beitrag von flashkid »

Live hat geschrieben:Das Edit-Feld beinhaltet nicht die Items der Combobox. Um eine Selektion ausführen zu können musst du ein Item der Box ansprechen.
Danke, aber das funktioniert leider auch nicht :(

@didi:
Hilft mir leider auch nicht weiter.

Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: ComboBox OnSelect

Beitrag von Live »

flashkid hat geschrieben:
Live hat geschrieben:Das Edit-Feld beinhaltet nicht die Items der Combobox. Um eine Selektion ausführen zu können musst du ein Item der Box ansprechen.
Danke, aber das funktioniert leider auch nicht :(

@didi:
Hilft mir leider auch nicht weiter.
Beschreib doch bitte nochmal genau dein Problem. Soweit ich das verstanden habe, wird das Textfeld nach dem Klick auf "OK" gelöscht.

Das Problem tritt bei mir aber nicht auf:

Ich habe per IDE Items in die ComboBox gefügt: Var1 und Var2 und den Itemindex auf Var2 gestellt.
Wenn ich Var1 auswähle und "Ok" klicke (Button1) dann zeigt er mir im Textfeld die Zahl 2323 an.
Auch nach mehrmaligen klicken des Buttons erhalte ich keine Probleme.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
if (ComboBox1.Items[0]= 'Var1') then
begin
ComboBox1.Text:='2323';
ShowMessage(ComboBox1.Text);
end;
end;
Grüße Live

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: ComboBox OnSelect

Beitrag von flashkid »

So funktioniert es bei mir auch, ich möchte aber nicht den Weg über einen Button gehen, sondern die Auswahl direkt beim Auswählen verändern.
Wenn ich deinen Code also genau so kopiere und in die Procedure OnSelect einbaue, funktioniert es nicht mehr, kannst du das bestätigen?

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
if (ComboBox1.Items[0]= 'Var1') then
begin
ComboBox1.Text:='2323';
ShowMessage(ComboBox1.Text);
end;
end;

Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: ComboBox OnSelect

Beitrag von Live »

flashkid hat geschrieben:So funktioniert es bei mir auch, ich möchte aber nicht den Weg über einen Button gehen, sondern die Auswahl direkt beim Auswählen verändern.
Wenn ich deinen Code also genau so kopiere und in die Procedure OnSelect einbaue, funktioniert es nicht mehr, kannst du das bestätigen?

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
if (ComboBox1.Items[0]= 'Var1') then
begin
ComboBox1.Text:='2323';
ShowMessage(ComboBox1.Text);
end;
end;
Ich denke das liegt einfach am OnSelect Ereignis. Wie wäre es denn, wenn du das ComboBox Item zu einer Zahl änderst?
Mit einer Hilfsvariable habe ich es auch probiert, ändert nichts am Resultat.

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
if (ComboBox1.Items[0]= 'Var 1') then
begin
ComboBox1.Text:='2323';
ComboBox1.Items[0]:=ComboBox1.Text;
ShowMessage(ComboBox1.Text);
ComboBox1.ItemIndex:=0;
end;
end;

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: ComboBox OnSelect

Beitrag von flashkid »

Das funktioniert soweit, nur jetzt besteht das Problem, dass in der ComboBox die Items als Nummern dort stehen, das ist natürlich nicht gewollt :(

Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: ComboBox OnSelect

Beitrag von Live »

flashkid hat geschrieben:Das funktioniert soweit, nur jetzt besteht das Problem, dass in der ComboBox die Items als Nummern dort stehen, das ist natürlich nicht gewollt :(
Ich verstehe nicht ganz was du überhaupt bezwecken willst. Also jemand sucht einen Eintrag aus. Dieser Eintrag wird dann als Zahl angezeigt im Edit-Feld der Combobox. Der ursprüngliche Item[]-Wert soll aber behalten werden?!

Dann nimm eine Hilfsvariable und mach es über eine Dreiecks-Beziehung?

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
var
cbstring:string;
begin
  if (ComboBox1.Items[0]= 'Var 1') then
    begin
      ComboBox1.Text:='2323';
      cbstring:=ComboBox1.Items[0];
      ComboBox1.Items[0]:=ComboBox1.Text;
      ShowMessage(ComboBox1.Text);
      ComboBox1.ItemIndex:=0;
      ComboBox1.Items[0]:=cbstring;
    end;
end;
Oder versuchst du irgendwie jedem Item der Combobox eine Zahl und eine Beschreibung zuzuordnen? Was genau willst du bezwecken? Wäre gut zu wissen, damit man an einer Lösung arbeiten kann.

Grüße Live

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: ComboBox OnSelect

Beitrag von flashkid »

Dein Code funktioniert leider auch nicht, es wird nach der OnSelect procedure anscheinend noch etwas ausgeführt, was den jetzigen Wert des Items in den Text schreibt..

Mein Vorhaben ist:
Die ComboBox enthält verschieden Presets ( 1-5 ). Diese Presets bestehen aus Zahlen. Damit man beim Auswählen nicht überlegen muss, für was diese Zahlen nun stehen, schreibe ich deren Bedeutung als Preset in die ComboBox. Wenn ich dann Preset1 auswähle, soll die diesem Preset zugeordnete Zahl in das Text Attribut geschrieben werden.
Ich hoffe du verstehst, was ich erreichen möchte :)

flashkid

Live
Beiträge: 144
Registriert: So 22. Aug 2010, 16:06
OS, Lazarus, FPC: Backtrack 5 RC4 - 64bit Gnome
CPU-Target: 64bit
Wohnort: NRW
Kontaktdaten:

Re: ComboBox OnSelect

Beitrag von Live »

flashkid hat geschrieben:Dein Code funktioniert leider auch nicht, es wird nach der OnSelect procedure anscheinend noch etwas ausgeführt, was den jetzigen Wert des Items in den Text schreibt..

Mein Vorhaben ist:
Die ComboBox enthält verschieden Presets ( 1-5 ). Diese Presets bestehen aus Zahlen. Damit man beim Auswählen nicht überlegen muss, für was diese Zahlen nun stehen, schreibe ich deren Bedeutung als Preset in die ComboBox. Wenn ich dann Preset1 auswähle, soll die diesem Preset zugeordnete Zahl in das Text Attribut geschrieben werden.
Ich hoffe du verstehst, was ich erreichen möchte :)

flashkid
Hm ich habe mal ein bisschen rumprobiert und mich hat es irritiert, dass die ComboBox quasi ein Event zum Ändern des Edit-Feldes benötigt.
Bei folgendem Quellcode:

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
var cs:string;
begin
  if (ComboBox1.Items[0]= 'Var1') then
    begin
      cs:=ComboBox1.Items[0]+' (1)';
      ComboBox1.Text:=ComboBox1.Items[0]+' (1)';
      ComboBox1.Update;
    end;
  end;

.. passiert bei mir z.B. garnichts mit dem Edit-Feld. Erst das ShowMessage(); ändert den ComboBox Text:

Code: Alles auswählen

procedure TForm1.ComboBox1Select(Sender: TObject);
var cs:string;
begin
  if (ComboBox1.Items[0]= 'Var1') then
    begin
      cs:=ComboBox1.Items[0]+' (1)';
      ComboBox1.Text:=ComboBox1.Items[0]+' (1)';
      ShowMessage(cs);
    end;
  end;
Edit: Bin ratlos :D Also mit der ComboBox, so wie du es vorhast, wird es wohl nicht gehen.

Antworten