Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   String in Array einlesen (https://www.delphipraxis.net/175184-string-array-einlesen.html)

musicman56 5. Jun 2013 13:02

AW: String in Array einlesen
 
Hallo,

also bitte mal der Reihe nach. Vielleicht hab ich ja was falsch verstanden. Dann korrigiert mich bitte. So schrieb es der TE:

Zitat:

Ich möchte nun die Werte in Spalte 2 der Größe nach ordnen, mit den zugehörigen Werten aus Spalte 1 und 3.
Das hab ich so verstanden, dass die Sortierung in dieser Reihenfolge/Priorität erfolgen sollte:

Spalte 2 + Spalte 1 + Spalte 3, also nicht nur nach Spalte 2. Demzufolge kann die Lösung mit TList so nicht funktionieren, weil eben NUR nach Spalte 2 sortiert wird, und Spalte 1 und 3 werden in der Sortierung ignoriert.

Der record könnte dann beispielsweise so aussehen:

Delphi-Quellcode:
type
  PMyData = ^TMyData;

  TMyData = record
    Col1, Col2, Col3 : string;
    Cols : string;
  end;
...wobei Cols dann Col2+Col1+Col3 wäre und die Sortierung dann...

Delphi-Quellcode:
function CompareMyDataCol2( Item1, Item2 : Pointer ) : Integer;
begin
  Result := CompareStr( PMyData( Item1 ).Cols, PMyData( Item2 ).Cols );
end;
....und bei der Ausgabe dann wieder den string zusammensetzen aus Col1+Col2+Col3.

Sir Rufo 5. Jun 2013 13:06

AW: String in Array einlesen
 
Das hatten wir doch schon

In SQL würde das so aussehen
SQL-Code:
SELECT
  Col1, Col2, Col3
FROM
  MyTable
ORDER BY
  Col2
Wie er Strings sortiert weiß er, aber nicht wie er nach der Sortierung den logischen Zusammenhang wieder hinbekommt. ;)

DeddyH 5. Jun 2013 13:07

AW: String in Array einlesen
 
Das habe ich (und zumindest Sir Rufo auch) so nicht verstanden. Vielmehr geht es darum, nach Spalte 2 zu sortieren, aber die Zugehörigkeit zu den anderen beiden Werten nicht zu verlieren. Und selbst wenn nach mehreren Spalten in einer bestimmten Reihenfolge sortiert werden soll, erweitert man den Callback entsprechend und fertig.
Delphi-Quellcode:
function CompareFunc(Item1, Item2: PRec): integer;
begin
  Result := AnsiCompareStr(Item1^.Col2, Item2^.Col2);
  if Result = 0 then
    Result := AnsiCompareStr(Item1^.Col1, Item2^.Col1);
  if Result = 0 then
    Result := AnsiCompareStr(Item1^.Col3, Item2^.Col3);
end;

musicman56 5. Jun 2013 13:13

AW: String in Array einlesen
 
Das ist der Punkt bzw. Unterschied...ich hab's so verstanden:

Code:
SELECT
  Col1, Col2, Col3
FROM
  MyTable
ORDER BY
  Col2, Col1, Col3

arnof 5. Jun 2013 15:20

AW: String in Array einlesen
 
Hallo an alle:

mal zum Verständnis: man will niemanden ärgern, wir wollen ja alle nur mal Helfen und manchmal lernt man was neues :thumb:

was DeddyH in seinem Quellcode macht und Sir Rufo im Quellcode (seinen ersten Beitrag angedeutet hat), ist einen Record der Liste zu übergeben und die Sortierfunktion entsprechen umzuleiten, das nach dem 2'ten Feld sortiert wird.

Meine Lösung macht das auf altbackene weise, so kann man es aber nachvollziehen (ist aber langsamer).

DeddyH 5. Jun 2013 15:30

AW: String in Array einlesen
 
Nunja, das Hauptproblem, das ich persönlich mit Deinem Code habe, ist die Vermischung von Logik und Darstellung. Es liest sich so, als ob man unbedingt Memos bzw. Listboxen bräuchte, um das Problem zu lösen. Das geht natürlich auch, ist aber IMO unschön.
Nothing for ungood

arnof 5. Jun 2013 15:40

AW: String in Array einlesen
 
Nun ich wurde mal als Listboxenprogrammierer beschimpft :thumb: um schnell eine Lösung zu machen, die würde ja einem Prof nicht gefallen, aber der wird ja auch nicht nach dem Ergebnis bezahlt sondern nur nach .... :roll:

Mit XE4 und iOS wurde mir klar, das ist das neueste vom neuen, da geht ja fast alles über meine liebe Listbox und die kann ja jetzt auch richtig viel :lol:

DeddyH 5. Jun 2013 15:44

AW: String in Array einlesen
 
Zitat:

Zitat von arnof (Beitrag 1217558)
Listboxenprogrammierer

Den Begriff muss ich mir mal notieren :lol:

jupiter4065139 14. Jun 2013 15:38

AW: String in Array einlesen
 
Hallo,

vielen Dank für die rege Beteiligung. Ich war letzter zeit verhindert und kann das Problem jetzt erst wieder anpacken. Ich bin zur Zeit dabei mein String in records einzulesen wie bei DeddyH

Delphi-Quellcode:
type
  PRec = ^TRec;
  TRec = record
    Col1, Col2, Col3: string;
  end;

...

//Befüllen
var
  NewRec: PRec;
begin
  New(NewRec);
  NewRec^.Col1 := 'Anton';
  NewRec^.Col2 := 'Berta';
  NewRec^.Col3 := 'Cäsar';
  FList.Add(NewRec);
  New(NewRec);
  NewRec^.Col1 := 'August';
  NewRec^.Col2 := 'Bär';
  NewRec^.Col3 := 'C++';
  FList.Add(NewRec);
  New(NewRec);
  NewRec^.Col1 := 'Auf der Mauer';
  NewRec^.Col2 := 'Auf der Lauer';
  NewRec^.Col3 := 'Dideldum dideldei';
  FList.Add(NewRec);
end
wie gesagt mein string sieht folgendermaßen aus

Delphi-Quellcode:
mystring := col1 + #9 + col2 + #9 +col3;


mit ungefähr hundert zeilen. Wie mach ich denn das am Besten den Pointer NewRec^.Col1 eine Schleife zu verpassen das der mir nur die col1 mit den 100 Werten aus dem string einliest.

p80286 14. Jun 2013 16:21

AW: String in Array einlesen
 
Ein wenig konfus was Du da willst.
Gehen wir mal davon aus, daß Du eine Funktion hast, die die Inhalte aus einem String auslesen kann (
Delphi-Quellcode:
wert:=getcol(i,mystring);
)

dann müßte die Verarbeitung ungefähr so aussehen:

Delphi-Quellcode:
var
  NewRec: PRec;
begin
  Stringlist:=tStringlist.Create;
  Stringlist.Loadfromfile('meinedaten.txt');
  for i:=0 to Stringlist.count-1 do begin
    New(NewRec);
    NewRec^.Col1 := getcol(1,Stringlist[i]);
    NewRec^.Col2 := getcol(2,Stringlist[i]);
    NewRec^.Col3 := getcol(3,Stringlist[i]);
    FList.Add(NewRec);
  end;
Wenn Du nur eine Spalte lesen willst dann vllt. so:
Delphi-Quellcode:
var
  NewRec: PRec;
begin
  Stringlist:=tStringlist.Create;
  Stringlist.Loadfromfile('meinedaten.txt');
  for i:=0 to Stringlist.count-1 do begin
    New(NewRec);
    NewRec^.Col1 := getcol(1,Stringlist[i]);
    NewRec^.Col2 := '';
    NewRec^.Col3 := '';
    FList.Add(NewRec);
  end;

U.U wäre es besser mit einem
Delphi-Quellcode:
Array of Col
zu arbeiten, da könntest Du die einzelnen spalten direkt über einen Index ansprechen.
Aber bitte nicht vergessen vorher alle Felder zu initialsieren.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.
Seite 3 von 4     123 4      

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 by Thomas Breitkreuz