ComboBox auslesen und reagieren

Für Fragen rund um die Ide und zum Debugger
Hog
Beiträge: 6
Registriert: Di 18. Aug 2020, 19:45

ComboBox auslesen und reagieren

Beitrag von Hog »

Hallo zusammen,
ich habe eine Kombobox mit mehreren Einträgen und will bei Auswahl eines ein Bild sichtbar werden lassen:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
case ComboBox1.ItemIndex of
0: Image2.Visible:=true;
1: Image2.Visible:=true;
2: Image2.Visible:=true;
3: Image2.Visible:=true;
end;
end;

Keine Fehlermeldung, allerdings auch kein Resultat.
Was mache ich falsch?
Danke für Hinweise.

Hog

wennerer
Beiträge: 198
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: ComboBox auslesen und reagieren

Beitrag von wennerer »

Hallo Hog,
du machst in der Case Auswahl immer Image2 sichtbar.
Schau dir mal das angehängte Beispiel an. Eventuell bringt dich das weiter.

Viele Grüße
Bernd
Dateianhänge
Combo.zip
(125.25 KiB) 15-mal heruntergeladen

Mathias
Beiträge: 5060
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ComboBox auslesen und reagieren

Beitrag von Mathias »

Schau dir mal das angehängte Beispiel an. Eventuell bringt dich das weiter.
Diese hat noch einen kleine Schönheitsfehler.
Die nicht gebrauchten Images müssen wieder unsichtbar werden.

Besser so:

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  i: Integer;
begin
 for i := 0 to Length(Images) - 1 do Images[i].Visible := False;
 case ComboBox1.ItemIndex of
  0: Images[0].Visible:=true;
  1: Images[1].Visible:=true;
  2: Images[2].Visible:=true;
  3: Images[3].Visible:=true;
 end;
end;  
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Hog
Beiträge: 6
Registriert: Di 18. Aug 2020, 19:45

Re: ComboBox auslesen und reagieren

Beitrag von Hog »

Danke für die Tipps. Jetzt funktioniert alles.

Winni
Beiträge: 395
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: ComboBox auslesen und reagieren

Beitrag von Winni »

Hallo!

Die ComboBox.items und die Images laufen parallel.
Also geht's auch kürzer:

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  i: Integer;
begin
 for i := 0 to Length(Images) - 1 do Images[i].Visible := False;
 if ComboBox1.ItemIndex >= 0 then
        Images[ComboBox1.ItemIndex].Visible:=true;
end; 

Grüsse Winni

Socke
Lazarusforum e. V.
Beiträge: 2790
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ComboBox auslesen und reagieren

Beitrag von Socke »

Wenn es noch kürzer als kürzer sein soll:

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to Length(Images) - 1 do
    Images[i].Visible := (i = ComboBox1.ItemIndex);
end; 
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Winni
Beiträge: 395
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: ComboBox auslesen und reagieren

Beitrag von Winni »

Hi!

Crashed aber wenn der ItemIndex = -1 (nix ausgewählt) ist.

Winni

Socke
Lazarusforum e. V.
Beiträge: 2790
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ComboBox auslesen und reagieren

Beitrag von Socke »

Winni hat geschrieben:
Mo 24. Aug 2020, 00:50
Crashed aber wenn der ItemIndex = -1 (nix ausgewählt) ist.
Warum denn das? ComboBox1.ItemIndex wird nur verglichen und nicht als Arrayelement verwendet.

In einem kurz zusammengeklickten Test hat es bei mir wunderbar funktioniert. Schwieriger fand ich nur, dass bei mSetzen des ItemIndex per Code das OnChange-Ereignis nicht aufgerufen wird und ich dann dieses manuell auslösen musste.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Winni
Beiträge: 395
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: ComboBox auslesen und reagieren

Beitrag von Winni »

Hi!
Sorry - Du hast recht.

Das Auslösen des events onChange beim Setzen des Index per Code ist ein lästiges Thema:

Manche Komponenten lösen aus, andere nicht und bei den dritten kann man das per Option an- und ausschalten (TPageControl). Hier wäre ein konsistentes Verhalten wirklich nötig.

Winni

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 649
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: ComboBox auslesen und reagieren

Beitrag von fliegermichl »

Wünschenswert wäre ausserdem, daß man ermitteln kann ob der Event durch eine Benutzeraktion oder durch Programmcode gefeuert wurde. Aber hier muss man sich dann auch irgendwie an die eigene Nase fassen. Lazarus ist quelloffen und jeder hat prinzipiell die Möglichkeit, solche Dinge zu implementieren und dann der Gemeinschaft zur Verfügung zu stellen.

Grüße
Michael

Mathias
Beiträge: 5060
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ComboBox auslesen und reagieren

Beitrag von Mathias »

Wünschenswert wäre ausserdem, daß man ermitteln kann ob der Event durch eine Benutzeraktion oder durch Programmcode gefeuert wurde.
Meinst du so was ?

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if Sender=Button1 then
    WriteLn('Button1')
  else
    WriteLn('sonstige');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ComboBox1Change(Button1);
end; 
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 649
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: ComboBox auslesen und reagieren

Beitrag von fliegermichl »

Mathias hat geschrieben:
Mo 24. Aug 2020, 13:30
Wünschenswert wäre ausserdem, daß man ermitteln kann ob der Event durch eine Benutzeraktion oder durch Programmcode gefeuert wurde.
Meinst du so was ?

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if Sender=Button1 then
    WriteLn('Button1')
  else
    WriteLn('sonstige');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ComboBox1Change(Button1);
end; 
Nein, wenn man z.B. ComboBox1.ItemIndex := ComboBox1.ItemIndex + 1 macht, dann sollte der OnChange Event automatisch gefeuert werden mit ComboBox1 als Sender.
Ich würde dann aber trotzdem gerne wissen, ob der Anwender den selektierten Eintrag eins weitergesetzt hat oder ob das per Programmcode geschehen ist.

Winni
Beiträge: 395
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: ComboBox auslesen und reagieren

Beitrag von Winni »

Hi!
Das wäre alles machbar.

Aber die "Lazarus-Götter" sind dagegen.
Wenn man hier und da bei einer Komponente im Internationalen Forum fragt,
warum irgendwelcher Blödsinn nicht abgestellt wird, kommt die Antwort:

"Delphi-Kompatibilität"

Hat mich schon oft genug geärgert.

Winni

PS.: Und wenn Delphi mal was richtig macht, wehren sie sich auch dagegen.
Z.B. den Wert von $FFFFFFFFFFFFFFFF als MaxQWord zu interpretieren - und nicht als Integer.

Mathias
Beiträge: 5060
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ComboBox auslesen und reagieren

Beitrag von Mathias »

"Delphi-Kompatibilität"
Für was gibt es dann dieser Schalter ?

Code: Alles auswählen

{$mode delphi}   
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Winni
Beiträge: 395
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: ComboBox auslesen und reagieren

Beitrag von Winni »

"Hey Lord don't ask me questions"

Graham Parker, 1976

Antworten