Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList gruppieren (https://www.delphipraxis.net/163409-tstringlist-gruppieren.html)

fanavity 28. Sep 2011 07:02

Delphi-Version: 5

TStringList gruppieren
 
Hallo,

Ich habe eine TStringList und möchte diese nach bestimmten Kreterien gruppieren. Leider stehe ich vollkommen auf dem Schlauch und weiß nicht wie ich an die Sache herran gehen soll..

Die Liste ist folgendermaßen aufgebaut:

0 | 12
1 | 12345
2 | 1
3 | 0
- der Strich ist nur gedanklich vorhanden!
4 | 10
5 | 12345
6 | 6
7 | 1
-
8 | 1
9 | 24657
10| 2
11| 0
-
.. usw


Wenn jetzt zB. jeweils der 2. Eintrag der Blöcke gleich ist, soll die zahl danach addiert werden..


Im Beispiel also: String 1 und 5 ist identisch (jeweils der 2. eines Blocks!) also sollen String 2 und 6 Addiert werden. Dann soll der kommplette Block 2 quasi gelöscht werden. Statdessen soll dort 0, Summe, Variable mit dem Summeninhalt, 0 stehen.

Ich hoffe das ist verständlich. Leider habe ich wie gesagt keinen Ansatz..
Jeweils die 2. Zahl steht für eine Produktnummer.. Wenn die gleich ist, soll die 3. Zahl (Anzahl) addiert werden. Damit auf einem Blick ersichtlich ist wieviele Produkte jeweils vorhanden sind :)

M.f.G.

fanavity

Jumpy 28. Sep 2011 07:43

AW: TStringList gruppieren
 
Würde es denn nicht Sinn machen, die vier jeweils zusammengehörenden Werte (ein Block) in z.B. ein Record zu packen, dann die Records in eine Liste, diese sortieren nach der Artikelnummer und dann durcheiern?

DeddyH 28. Sep 2011 07:46

AW: TStringList gruppieren
 
Wenn man statt des Records eine Klasse nimmt, lässt sich diese sogar an den jeweiligen Eintrag der Stringliste anhängen.

fanavity 28. Sep 2011 08:05

AW: TStringList gruppieren
 
Ich habe noch nie mit Recods gearbeitet.. Wie funktioniert das ganze denn?

p80286 28. Sep 2011 09:31

AW: TStringList gruppieren
 
In Deinem Falle könnte man vllt. so etwas definieren:
Delphi-Quellcode:
Type
 tMyRecord = record
               Zeile1,
               Zeile2,
               Zeile3,
               Zeile4 : string [40];
             end;
pMyRecord = tMyRecord;
und so könnte man bsp einlesen:
Delphi-Quellcode:
var
  recpoint:pMyrecord
  Liste  : tList;
...
while not eof(textdatei) do begin
  new(recpoint);
  readln(textdatei,recpoint^.Zeile1;
  readln(textdatei,recpoint^.Zeile2;
  readln(textdatei,recpoint^.Zeile3;
  readln(textdatei,recpoint^.Zeile4;
  Liste.add(recpoint);
end;
(nur so als idee, ohne Fehlerprüfung etc.)

Damit könnte man dann eine TList oder eine TObjectlist befüllen und dannSortieren und was auch immer Du vorhast machen.

Gruß
K-H

fanavity 28. Sep 2011 09:35

AW: TStringList gruppieren
 
Danke für die Antwort :)

Ich habe das ganze nun mal so gemacht.. Ich hoffe das ist richtig?

Delphi-Quellcode:
  Type  Artikel= Record
         Test: String[2];
         ArtName: String[6];
         Anzahl : String[3];
         Preis: String[2];
  end;

Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
Var
Artikelliste: Array[0..199] of Artikel;
...
Begin
i := 0;
     j := 0;
     while i < test.count -1 do begin

           Artikelliste[j].Test:= Test.Strings[i];
           i := i+1;
           Artikelliste[j].ArtName:= Test.Strings[i];
           i := i+1;
           Artikelliste[j].Anzahl := Test.Strings[i];
           i := i+1;
           Artikelliste[j].Preis:= Test.Strings[i];
           i := i+1;
           j := j+1;
    end;
end;
Nur jetzt stehe ich wieder vor der Frage, wie ich darin nun sortiere/gruppiere?!

Jumpy 28. Sep 2011 11:10

AW: TStringList gruppieren
 
Zunächst mal: Es müssen nicht alles Strings sein in dem Record. Die Anzahl könntest du auch in irgendeinem Integer speichern. Dann wird das addieren nachher weniger umständlich.

Zum Problem: Statt eines Arrays mit den Records oder Klassen diese wirklich in eine T(Object)List packen, da diese eine Sortierfunktion haben. Vllt. mal nach TList sortieren suchen, um zu sehen, wie das genau geht.

fanavity 28. Sep 2011 13:10

AW: TStringList gruppieren
 
Naja ich will ja nicht wirklich Sortieren.. Sondern mehr oder weniger nur Vergleichen und ggf addieren/ersetzten. Das hat ja im Grunde nichts mit der STort-Funktion zu tun.. Oder sehe ich das falsch?

Jumpy 28. Sep 2011 15:10

AW: TStringList gruppieren
 
Hast schon recht. War bei mir eher ein Optimierungsgedanke, damit du nicht die Liste so oft durcheiern musst, denn unsortiert musst du das erste Element nehmen, dann die ganze Liste durchgehen und deine Additionsgechichte durchführen wann immer du das Element nochmal findest.
Dann das zweite Element nehmen und dann die ganze Liste durchgehen...
Dann das dritte Element nehmen und dann die ganze Liste durchgehen...

Zwei verschachtelte Schleifen ist jetzt programmiertechnisch nix wildes, aber halt suboptimal.

Ist die Liste sortiert nimmst du das erste Element als Startelement.
Schaust ob das/die nächste(n) gleich ist und addierst,
andenfalls ist das nächste halt dein neues Startelement.


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