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 In den ListView SubItems Beträge addieren (https://www.delphipraxis.net/103122-den-listview-subitems-betraege-addieren.html)

iron 10. Nov 2007 12:20


In den ListView SubItems Beträge addieren
 
Habe im Forum nix dazu gefunden, also möcht ich Euch wiedermal nerven.

Es gaht darum das ich in einer ListView in den SubItems Beträge zu stehen habe, wie kann ich nun alle Beträge addieren und in z.B. in einem Label die Gesamtsumme anzeigen lassen?

mkinzler 10. Nov 2007 12:21

Re: In den ListView SubItems Beträge addieren
 
Manuell durchgehen, Werte auslesen, addieren, ausgeben.

DeddyH 10. Nov 2007 12:26

Re: In den ListView SubItems Beträge addieren
 
Wenn die Werte im ersten SubItem stehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i, gesamt: integer;
begin
  gesamt := 0 ;
  for i := 0 to ListView1.Items.Count - 1 do
    inc(gesamt, StrToInt(ListView1.Items[i].SubItems[0]));
  Label1.Caption := IntToStr(gesamt);
end;

iron 10. Nov 2007 12:49

Re: In den ListView SubItems Beträge addieren
 
Danke Euch beiden für die Antwort.

Nur möcht ich Beträge zusammenrechnen, d.h. ich muss eine Kommazahl addieren(hätt ich ja auch vorher angeben können, schäm). Das mit dem Code ist schon Klasse nur wie muss ich den mit StrToFloat verwenden?

mkinzler 10. Nov 2007 12:51

Re: In den ListView SubItems Beträge addieren
 
Einfache Lösung: StrToFloat statt StrToInt. Besser natürlich TryStrToFloat oder Val

iron 10. Nov 2007 21:14

Re: In den ListView SubItems Beträge addieren
 
Zitat:

Zitat von mkinzler
Einfache Lösung: StrToFloat statt StrToInt. Besser natürlich TryStrToFloat oder Val

Ja danke aber das hab ich mir schon gedacht und habe es versucht, nur komm ich mit der zusammenstellung im Code nicht klar. Ich weis deine bemühungen trotzdem zu schätzen.

hab jetz schon ne menge probiert, aber immer beklagt er sich z.B. bei

Delphi-Quellcode:
inc(gesamt, StrToFloat(ListView1.Items[i].SubItems[0]));
das er der linken Seite nicht zuweisen kann.

Wo liegt nur mein Fehler.

Und was ist eigendlich der unterschied zwischen StrToFloat und TryStrToFloat

mkinzler 10. Nov 2007 21:17

Re: In den ListView SubItems Beträge addieren
 
Delphi-Quellcode:
gesamt := gesamt + StrToFloat(ListView1.Items[i].SubItems[0]);
StrToFloat liefert eine Exception, wenn die Konvertierung nicht funktioniert. TryStrToFloat gibt dann nur false zurück.

DeddyH 10. Nov 2007 21:19

Re: In den ListView SubItems Beträge addieren
 
Zum Unterschied kannst Du die Hilfe bemühen ;).Und zu der Fehlermeldung: ändere die Zeile
Delphi-Quellcode:
inc(gesamt, StrToFloat(ListView1.Items[i].SubItems[0]));
mal ab in
Delphi-Quellcode:
gesamt := gesamt + StrToFloat(ListView1.Items[i].SubItems[0]);
Oder eben TryStrToFloat *gg*

[edit] Mal wieder zu spät :? [/edit]

iron 10. Nov 2007 21:34

Re: In den ListView SubItems Beträge addieren
 
Ohhhhhh gott ich beiß mir in den Schliessmuskel, ich bedanke mich rechtherzlich für Eure geduld.

Gehstock 10. Nov 2007 21:56

Re: In den ListView SubItems Beträge addieren
 
Ich häng mich mal rein weil ich ein Ähnliches Problem Hab

ich Habe im Listview bei Items[0] die Checkboxen
in Items[2] einen Preis

wenn ich die Checkboxen aktiviere dann soll in einem Editfeld die preise Addiert werden


ich versuch das grad so

Delphi-Quellcode:
procedure TForm4.ListView1Click(Sender: TObject);
begin
if Listview1.Items[0].Checked then
   Edit1.Text := InttoStr(StrtoInt(Edit1.Text) + StrtoInt(Listview1.items[2].Caption))
    else
     Edit1.Text := InttoStr(StrtoInt(Edit1.Text) - StrtoInt(Listview1.items[2].Caption));
end;

DeddyH 10. Nov 2007 21:58

Re: In den ListView SubItems Beträge addieren
 
Das kommt mir komisch vor, stell doch mal einen Screenshot rein.

mkinzler 10. Nov 2007 21:59

Re: In den ListView SubItems Beträge addieren
 
Und was geht nicht? Bzw. wie können wir dir Helfen?

DeddyH 10. Nov 2007 22:02

Re: In den ListView SubItems Beträge addieren
 
Ich vermute stark, dass er versehentlich Items und SubItems verwechselt hat, deshalb meine Bitte um einen Screenshot.

Gehstock 10. Nov 2007 22:04

Re: In den ListView SubItems Beträge addieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier

mkinzler 10. Nov 2007 22:05

Re: In den ListView SubItems Beträge addieren
 
Zitat:

Zitat von DeddyH
Ich vermute stark, dass er versehentlich Items und SubItems verwechselt hat, deshalb meine Bitte um einen Screenshot.

So siehts aus.

DeddyH 10. Nov 2007 22:06

Re: In den ListView SubItems Beträge addieren
 
@Gehstock: der Preis steht nicht in Items[2], sondern in SubItems[1].

Gehstock 10. Nov 2007 22:08

Re: In den ListView SubItems Beträge addieren
 
Danke

und nochmal Danke hatte ich grad auch

Gehstock 10. Nov 2007 22:40

Re: In den ListView SubItems Beträge addieren
 
Delphi-Quellcode:
procedure TForm4.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
var
i: Integer;
begin
i:=0;
//i :=Listview1.Selected.Index;
if Listview1.Items[i].Checked then
 begin
   Ergebnis := StrtoFloat(Edit1.Text) + StrtoFloat(Listview1.Items[i].SubItems[1]);
    end else
     begin
      Ergebnis := StrtoFloat(Edit1.Text) - StrtoFloat(Listview1.Items[i].SubItems[1]);
     end;
     Edit1.Text :=Floattostr(Ergebnis)
end;
die zuweisung von i klappt nicht da ja nichts selected wird also wie sag ich i das es
das 2. oder 3. item ist wenn ich in die 2. zeile klicke

Gehstock 11. Nov 2007 13:46

Re: In den ListView SubItems Beträge addieren
 
Delphi-Quellcode:
procedure TForm4.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
var
i: integer;
gesamt : Extended;
begin
 gesamt := 5.99 ; // Grundpreis
  for i := 0 to ListView1.Items.Count - 1 do
   if Listview1.Items[i].Checked then
      gesamt := gesamt + StrToFloat(ListView1.Items[i].SubItems[1]);
       if gesamt = 5.99 then gesamt := 0; wenn nichts gewählt auch kein grundpreis
      Edit1.Text := FloatToStr(gesamt);
end;
habs selbst erledigt

Sharky 11. Nov 2007 14:54

Re: In den ListView SubItems Beträge addieren
 
Hai Gehstock,

als Tip für zukünftigen Code habe ich das ganze mal etwas umgebaut.
Delphi-Quellcode:
uses
  SysUtils;

procedure RealInc(var x: Extended; const aValue: Extended = 1.0); overload;
begin
  x := x + aValue;
end;


function RealInc(var x: Extended; const aValue: string = '';
  errohandling: Boolean = True): Boolean; overload;
var
  realvalue: Extended;
begin
  result := False;
  if TryStrToFloat(aValue, realvalue) then
  begin
    RealInc(x, realvalue);
    result := True;
  end
  else
  begin
    if (errohandling) then
    begin
      raise Exception.create(Format(
        'Der Inhalt von aValue ("%s") ist kein gültiger Gleitkommawert', [aValue]));
    end;
  end;
end;

function AddValuesFromLV(aLV: TListView; var aValue: Extended): Integer;
var
  i: Integer;
  checkcount: Integer;
begin
  checkcount := 0;
  with aLV do
  begin
    for i := 0 to Pred(Items.Count) do
    begin
      if (Items[i].Checked) then
      begin
        if (RealInc(aValue, Items[i].SubItems[1], False)) then
        begin
          Inc(checkcount);
        end;
      end;
    end;
  end;
  result := checkcount;
end;

procedure TDemo_Form.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
const
  grundpreis = 5.99;
var
  gesamt: Extended;
begin
  gesamt := 0;
  if (AddValuesFromLV((Sender as TListView), gesamt) > 0) then
  begin
    RealInc(gesamt, grundpreis);
  end;
  Edit1.Text := FloatToStr(gesamt);
end;

Deep-Sea 12. Nov 2007 10:40

Re: In den ListView SubItems Beträge addieren
 
Vlt. sollte man nicht immer fix "SubItems[1]" etc. nutzen. Wenn man eine Spalte hinzufügen, löschen oder verschieben muss oder will, müsste man jede fixe Index-Angabe im ganzen Programm ändern - was wahrlich kein Spaß ist. Also lieber Konstanten etc. nutzen :-D
*davon schleich* ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 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