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 Listview spalten addieren (https://www.delphipraxis.net/138954-listview-spalten-addieren.html)

NaPsTeRforever 20. Aug 2009 13:44


Listview spalten addieren
 
Hallo,
ich stehe gerade etwas auf dem Schlauch und verstehe meine eigene produktion hier nicht mehr :D

Folgende Konstellation:
Ich habe eine Listview mit 4 Spalten!
Spalte 2 ist der Einkaufspreis (EP), Spalte 3 der Verkaufspreis (VP) und Spalte 4 der Umsatz (U), EP und VP stehen in der Liste, die Spalte 4 für den Umsatz ist zunächst leer.

Es soll der VP minus EP (Umsatz) in Spalte 4 angezeigt werden und der Gesamtumsatz (alle addiert) am Ende angezeigt werden!

Delphi-Quellcode:
procedure TForm1.but_umsatzClick(Sender: TObject);
var L, Li : TListItem;
    EP, VP, U : string;
    i,q, U, U_gesamt : integer;
begin
  U_gesamt := 0;
  for i := 0 to liv_transfers.Items.Count - 1 do
  begin
    for Q := 2 to liv_transfers.Items[I].SubItems.Count - 1 do
    begin
      EP := liv_transfers.Items[I].SubItems[0];
      VP := liv_transfers.Items[I].SubItems[1];
      EP:= ZahlohnePunkte(EP);
      VP := ZahlohnePunkte(VP);
      U := strtoint(VP) - strtoint(EP);
      U_gesamt := U + U_gesamt;
    end;
  end;
  L := liv_transfers.items.add;
  L.Caption := ('_______________');
  L.SubItems.Add('___________');
  L.SubItems.Add('___________');
  L.SubItems.Add('___________');
  Li := liv_transfers.items.add;
  Li.Caption := ('Gesamt');
  Li.SubItems.Add('');
  Li.SubItems.Add('');
  Li.SubItems.Add(ZahlmitPunkten(inttostr(U_gesamt)));
end;
So wie ich es jetzt zunächste gemacht habe, wird nur der Gesamtumsatz am Ende angezeigt und das ganze funktioniert nur
wenn manche Umsätze schon in Spalte 4 stehen, wenn Spalte 4 komplett leer ist geht es nicht (for Q := 2 to liv_transfers.Items[I].SubItems.Count - 1 do)???.
Ich blick da grad nicht mehr durch?!?!
Hoffe es kann jmd helfen!

DeddyH 20. Aug 2009 13:56

Re: Listview spalten addieren
 
Trenne die Logik von der Darstellung. Eine Listview ist zur Anzeige von Daten gedacht und nicht zur Datenhaltung.

NaPsTeRforever 20. Aug 2009 13:59

Re: Listview spalten addieren
 
Das ist mir egal, dann werde ich sie eben missbrauchen!

Fakt ist, dass es geht, Frage ist nur wie!

DeddyH 20. Aug 2009 14:40

Re: Listview spalten addieren
 
Wozu die innere Schleife? Du weißt doch, wo was steht.
Delphi-Quellcode:
var i,gesamt,Umsatz: integer;
begin
  gesamt := 0;
  for i := 0 to ListView.Items.Count - 1 do
    begin
      Umsatz := StrToInt(ListView.Items[i].SubItems[1]) - StrToInt(ListView.Items[i].SubItems[2]);
      ListView.Items[i].SubItems[3] := IntToStr(Umsatz);
      inc(gesamt,Umsatz);
    end;
Nun noch unten gesamt ausgeben und gut is. Auf Dauer wirst Du mit Deiner Einstellung aber nicht glücklich werden, das kann ich Dir prophezeien.

[edit] Addition in Subtraktion geändert, Denkfehler [/edit]

NaPsTeRforever 20. Aug 2009 15:12

Re: Listview spalten addieren
 
Zitat:

Zitat von DeddyH
Wozu die innere Schleife? Du weißt doch, wo was steht.
Delphi-Quellcode:
var i,gesamt,Umsatz: integer;
begin
  gesamt := 0;
  for i := 0 to ListView.Items.Count - 1 do
    begin
      Umsatz := StrToInt(ListView.Items[i].SubItems[1]) - StrToInt(ListView.Items[i].SubItems[2]);
      ListView.Items[i].SubItems[3] := IntToStr(Umsatz);
      inc(gesamt,Umsatz);
    end;
Nun noch unten gesamt ausgeben und gut is. Auf Dauer wirst Du mit Deiner Einstellung aber nicht glücklich werden, das kann ich Dir prophezeien.

[edit] Addition in Subtraktion geändert, Denkfehler [/edit]

Dann kommt die Fehlermeldung:
Listenindex überschreitet das Maximum(2);

DeddyH 20. Aug 2009 15:22

Re: Listview spalten addieren
 
Dann setz den Index hinter SubItems jeweils um 1 runter.

NaPsTeRforever 20. Aug 2009 15:26

Re: Listview spalten addieren
 
hab ich, kommt der gleiche Fehler

DeddyH 20. Aug 2009 15:28

Re: Listview spalten addieren
 
Zeig nochmal den aktuellen Code. Und Du hast auch ganz sicher 4 Spalten?

mkinzler 20. Aug 2009 15:29

Re: Listview spalten addieren
 
Achtung 4 Spalten = 3 SubItems

DeddyH 20. Aug 2009 15:30

Re: Listview spalten addieren
 
Das war mir später auch eingefallen, siehe #6. Aber dann sollte es jetzt eigentlich passen.

mkinzler 20. Aug 2009 15:31

Re: Listview spalten addieren
 
War auch nicht an dich, sondern den TE gerichtet

NaPsTeRforever 20. Aug 2009 15:38

Re: Listview spalten addieren
 
Zitat:

Zitat von mkinzler
Achtung 4 Spalten = 3 SubItems

Das weiß ich und habe ich auch berücksichtigt, auch bevor Deddy es korrigierte :D

der jetzige Code:

Delphi-Quellcode:
  Umsatz_gesamt := 0;
  for i := 0 to liv_transfersalltime.Items.Count - 1 do
  begin
    Umsatz := StrToInt(ZahlohnePunkte(liv_transfersalltime.Items[i].SubItems[1])) - StrToInt(ZahlohnePunkte(liv_transfersalltime.Items[i].SubItems[0]));
    liv_transfersalltime.Items[i].SubItems[2] := IntToStr(Umsatz);
    inc(Umsatz_gesamt,Umsatz);
    Umsatz_gesamt := Umsatz_gesamt + Umsatz;
  end;
Und ja ich habe 4 Spalten
Name, Einkaufspreis, Verkaufspreis, Umsatz

Die Listview wird mit Hilfe dieser procedure aus einer Datei gefüllt:

Delphi-Quellcode:
procedure ListViewLoadFromFile(Filename : String; ListView : TsListView);
{Copyright Christoph Duwald 2005}
var
   TextFile,TextFile2 : TStringList;
   NewListItem: TListItem;
   i,x: integer;
begin
try
  ListView.Clear;
  TextFile:= TStringList.Create;
  TextFile2:= TStringList.Create;

  TextFile.LoadFromFile(Filename); //ListView aus der Datei laden.
  TextFile2.Delimiter:='#';   //Trennzeichen, wie beim Speichern angegeben
 
  for i:=0 to TextFile.Count-1 do  // Geht alle Zeilen durch (ohne Überschriften)
  begin
    TextFile2.DelimitedText:=TextFile.Strings[i]; //Erste Zeile aus der gespeicherten Datei in die Richtigen Spalten schreiben
    NewListItem := ListView.Items.Add;       //Neues Item anlegen
    NewListItem.ImageIndex:=StrToInt(TextFile2.Strings[0]); //Index des Images für diese Zeile
    NewListItem.Caption :=TextFile2.Strings[1];     //Erste Spalte
    for x:=2 to TextFile2.Count-1 do       //Geht die restlichen Spalten durch
    begin
      NewListItem.SubItems.Add(TextFile2.Strings[x]);   //Spalten mit dem text aus der Datei füllen
    end;

  end;
finally
  TextFile.Free;
  TextFile2.Free;
end;
end;
Bsp-Datei:
Code:
0#Badstuber#940.000#2.223.600
0#Breno#310.000#676.200
Vlt hängt es damit zusammen?

EDIT: Die Subitems[0] und [1] stimmen, habe es mir in einem testmemo ausgeben lassen und eine Spalte 4 existiert auch definitiv!

DeddyH 20. Aug 2009 15:54

Re: Listview spalten addieren
 
Wo soll die 4. Spalte denn herkommen? Ich sehe da einen ImageIndex, einen Namen und 2 Zahlen, damit komme ich auf 3 Spalten.

[edit]Aber gut:
Delphi-Quellcode:
Umsatz_gesamt := 0;
  for i := 0 to liv_transfersalltime.Items.Count - 1 do
  begin
    Umsatz := StrToInt(ZahlohnePunkte(liv_transfersalltime.Items[i].SubItems[1])) - StrToInt(ZahlohnePunkte(liv_transfersalltime.Items[i].SubItems[0]));
    if liv_transfersalltime.Items[i].SubItems.Count < 3 then
      liv_transfersalltime.Items[i].SubItems.Add(IntToStr(Umsatz))
    else
      liv_transfersalltime.Items[i].SubItems[2] := IntToStr(Umsatz);
    inc(Umsatz_gesamt,Umsatz);
    // doppelt gemoppelt: Umsatz_gesamt := Umsatz_gesamt + Umsatz;
  end;
So müsste es immer passen.[/edit]

NaPsTeRforever 20. Aug 2009 16:04

Re: Listview spalten addieren
 
kA was du meinst, wie gesagt 4 Spalten:
Name, Einkaufspreis, Verkaufspreis, Umsatz

Aus der Datei werden Name, Einkaufspreis und Verkaufspreis in die Listview geladen, die Umsatzspalte (Spalte4!!!) bleibt dabei leer!

Wie in meinem ersten Beitrag bereits angemerkt und durch gerade erneutes Testen stelle ich fest, dass das ganze funktioniert wenn in der Umsatzspalte bereits etwas steht!!!

Also hat die Listview (speziell liv_transfersalltime.Items[i].SubItems[2] := IntToStr(Umsatz); ) irgend ein Problem mit der leeren Spalte4 oder nicht??!?!


EDIT:

Zitat:

Zitat von DeddyH
Wo soll die 4. Spalte denn herkommen? Ich sehe da einen ImageIndex, einen Namen und 2 Zahlen, damit komme ich auf 3 Spalten.

[edit]Aber gut:
Delphi-Quellcode:
Umsatz_gesamt := 0;
  for i := 0 to liv_transfersalltime.Items.Count - 1 do
  begin
    Umsatz := StrToInt(ZahlohnePunkte(liv_transfersalltime.Items[i].SubItems[1])) - StrToInt(ZahlohnePunkte(liv_transfersalltime.Items[i].SubItems[0]));
    if liv_transfersalltime.Items[i].SubItems.Count < 3 then
      liv_transfersalltime.Items[i].SubItems.Add(IntToStr(Umsatz))
    else
      liv_transfersalltime.Items[i].SubItems[2] := IntToStr(Umsatz);
    inc(Umsatz_gesamt,Umsatz);
    // doppelt gemoppelt: Umsatz_gesamt := Umsatz_gesamt + Umsatz;
  end;
So müsste es immer passen.[/edit]


aaaah ok, jetzt gehts :D

EDIT2: hat sich erledigt xD

mkinzler 20. Aug 2009 16:06

Re: Listview spalten addieren
 
Beim Import, werden dann aber nur 3 Spalten erstellt.

FrankJ28 20. Aug 2009 16:08

Re: Listview spalten addieren
 
Hallo,
also nach meiner unmaßgeblichen Meinung füllst Du dein Listview mit dem gezeigten Textfile, was aber nur eine Cption und 2 (zwei) SubItems befüllt. Häng doch einfach eine DummySpalte (#_) hinten dran und schau mal was passiert.
Ciao
Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.

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