Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Comboboxen Summieren bei onChange (https://www.delphipraxis.net/147469-comboboxen-summieren-bei-onchange.html)

cobus_tschulz 9. Feb 2010 13:26


Comboboxen Summieren bei onChange
 
Hallo zusammen,

ich habe folgendes vor:

Ich habe eine Form mit 4 Comboboxen und einem TEdit Feld wo die Summe angezeigt werden sollt.
So nun sind diverse Einträge in den Comboboxen wie z.B.

Delphi-Quellcode:
Dieser Beitrag ist interessant (10)
Dieser Beitrag ist weniger interessant (20)
Das eben für 4 Boxen mit unterschiedlichen werden in den Klammern.

Nun sollt man von oben nach unten die ComboBoxen auswählen und nach jeder auswahl der ComboBox wird im TEdit Feld das Summiert.

Ich gehe mal davon aus das das ganze mit onChange auf dem Combobox Feld geht ?! Nur wie lade ich zur Laufzeit die Zahlen in den Klammern aus (10), (20) wie auch immer ...
Die Feldinhalte werden von einer Datenbank gesetzt. Es soll natürlich auch so sein das wenn ich ein Feld in der Datenbank z.B. von (20) auf (30) ändere, nicht das Programm neu Compilieren muss

Vielen dank für eure Vorschläge schonmal ...

DeddyH 9. Feb 2010 13:38

Re: Comboboxen Summieren bei onChange
 
Du könntest die Zahlen als Objekte in den Items der Comboboxen hinterlegen und jeder Combobox dasselbe OnChange-Ereignis zuweisen. Schnelles Beispiel (DoOnChange ist die Ereignisbehandlungsroutine aller Comboboxen):
Delphi-Quellcode:
//wird im OnChange der Comboboxen ausgeführt
procedure TFormBla.DoOnChange(Sender: TObject);
var Summe: integer;
begin
  Summe := 0;
  if ComboBox1.ItemIndex > -1 then
    Summe := Summe + integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
  if ComboBox2.ItemIndex > -1 then
    Summe := Summe + integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]);
  if ComboBox3.ItemIndex > -1 then
    Summe := Summe + integer(ComboBox3.Items.Objects[ComboBox3.ItemIndex]);
  if ComboBox4.ItemIndex > -1 then
    Summe := Summe + integer(ComboBox4.Items.Objects[ComboBox4.ItemIndex]);
  Edit1.Text := inttostr(Summe);
end;

procedure TFormBla.FormCreate(Sender: TObject);
var i: integer;
begin
  //Zahlen als Objekte in den Items speichern
  for i := 1 to 4 do
    begin
      ComboBox1.Items.AddObject(Format('%d',[i * 10]),TObject(i*10));
      ComboBox2.Items.AddObject(Format('%d',[i * 10]),TObject(i*10));
      ComboBox3.Items.AddObject(Format('%d',[i * 10]),TObject(i*10));
      ComboBox4.Items.AddObject(Format('%d',[i * 10]),TObject(i*10));
    end;
end;

patti 9. Feb 2010 13:42

Re: Comboboxen Summieren bei onChange
 
Wenn du die Daten eh aus einer Datenbank liest, dann könntest du dir für jede Combobox ein array definieren, in dem die Werte gespeichert werden, z.B. so:

Delphi-Quellcode:
Werte1 : array[0..3] of integer;
Werte2 : array[0..3] of integer;
//...
Wobei die Länge jedes Arrays natürlich der Anzahl der verschiedenen Werte entsprechen muss (kann sich die Anzahl verändern, müsstest du auf dynamische Arrays zurückgreifen). Beim Lesen aus der Datenbank musst du dann halt neben den strings für für die Comboboxen auch die Werte in den Arrays setzen.

Beim OnChange-Ereignis der Comboboxen machst du dann noch folgendes:

Delphi-Quellcode:
Edit.Text := Werte1[ComboBox1.ItemIndex] + Werte2[ComboBox2.ItemIndex] + //...
mfg

cobus_tschulz 9. Feb 2010 14:01

Re: Comboboxen Summieren bei onChange
 
Danke euch schonmal.

Problem dabei ist nur das ich NUR die Feldwerte in Laufzeit sprich mit Combobox1.Text auslesen kann und nicht manipulieren oder setzte kann.

Das ist ein SDK mit dem ich arbeite von dem Programm was verändert werden muss.

Also hier nochmal kurz:
Ich sezt in einer art Verwaltungskonsole die Feldwerde, diese werden in der Datenbank gespeichert.
Öffnet man die Form werden diese dagestellt.

Ich habe nur die MKöglichkeit dort den Feldwert wie oben gesagt mit xxx.Text auszulesen und dort dann nach '(' zu suchen die kommenden 2 Zahlen zu nehmen und zu summieren.

Etwas schwierig damit so ....

patti 9. Feb 2010 14:05

Re: Comboboxen Summieren bei onChange
 
Dann solltest du dir mal die Funktion Hier im Forum suchenpos anschauen. Diese liefert die Stelle des ersten Vorkommens einen Substrings innerhalb eines anderen Strings. Mit Hilfe der Funktion kannst du also herausfinden, wo im String der Combobox die runde Klammer "(" auftaucht.

cobus_tschulz 9. Feb 2010 18:40

Re: Comboboxen Summieren bei onChange
 
öhm ist zwar gerade dumm aber ich bekomme nen Fehler wenn ich auf

Delphi-Quellcode:
strg := combobox1.text
gehe

hier der Code ....

Delphi-Quellcode:
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  Pos1 :string;
  SubStr :string;
  Summe: integer;
  Str: integer;
begin
Str := combobox1.Text;
Pos1 := Pos('(',Str);
SubStr := Copy(combobox1.Text,Pos1,2);
ShowMessage(SubStr);
end;

Klaus01 9. Feb 2010 19:58

Re: Comboboxen Summieren bei onChange
 
Zitat:

Zitat von cobus_tschulz
öhm ist zwar gerade dumm aber ich bekomme nen Fehler wenn ich auf

Delphi-Quellcode:
strg := combobox1.text
gehe

hier der Code ....

Delphi-Quellcode:
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  Pos1 :string;
  SubStr :string;
  Summe: integer;
  Str: integer;
begin
Str := combobox1.Text;
Pos1 := Pos('(',Str);
SubStr := Copy(combobox1.Text,Pos1,2);
ShowMessage(SubStr);
end;

Ein Text ist kein Integer, kann aber eine Zahl enhalten.

Delphi-Referenz durchsuchenStrToInt

Ich finde es auch ein wenig ungeschickt eine Integervariable str zu nennen.
Grüße
Klaus

mkinzler 9. Feb 2010 20:03

Re: Comboboxen Summieren bei onChange
 
Wobei TryStrToInt() oder StrToIntDef() vorzuziehen wären


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz