Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

arnof 5. Jun 2013 10:55

AW: String in Array einlesen
 
:?:

also Obiwan (Sir Rufo), ich will mich nicht so weit aus dem Fenster lehnen ich würde mal behaupten das dein Quellcode nicht geht, bzw nicht das macht was er will:

in SQL ausgedrückt will er

Select Sp1,sp2,sp3 from wasauchimmer
order by sp2

musicman56 5. Jun 2013 10:56

AW: String in Array einlesen
 
@Sir Rufo Stimmt, abgesehen davon, dass

Delphi-Quellcode:
Result := CompareStr( Left.Col2, Right.Col2 );
in diesem Fall eben so einfach nicht funktioniert

arnof 5. Jun 2013 11:11

AW: String in Array einlesen
 
Ich will mal versuchen das auf die altmodische Art zu Lösen:


Code:

var ozeile:integer;
// in die Form zwei Tmemo und eine Tlistbox einfügen
....

memo1.lines.loadfromfile('ursprung.txt'); // Textladen
Listbox1.items.clear;                     // Zwischenpuffer zum sortieren
Listbox1.Sorted:=False;                   // Sortierung aus
for i:=0 to memo1.lines.count-1 do begin
 if Pos(#9,Memo1.lines[i])>0 then begin  // SP2 ermitteln
  ListBox1.items.Add(Copy(Memo1.lines[i],Pos(#9,Memo1.lines[i])+1),255); // Sp2+sp3 einsetzen
  ListBox1.Items[ListBox1.items.count-1]:=Copy(ListBox1.Items[ListBox1.items.count-1],1,Pos(#9,ListBox1.Items[ListBox1.items.count-1])))+intTostr(i); // sp3 entfernen und ID mit übergeben
end;
Listbox1.Sorted:=True;  // sortieren
memo2.Lines.clear; // hier nun das ergebnis speichern
for i:=0 to ListBox1.items.count-1 do begin
 // ursprüngliche zeile herausfinden
 ozeile:=StrToInt(Copy(ListBox1.items[i],Pos(#9,ListBox1.Items[i]+1),255)); //id der sortierten Listbox auslesen
 memo2.lines.Add(memo1.lines[ozeile]); // ursprüngliche zeile übergeben
end;
//

// in memo2 steht nun das ergebnis

Sollte ich Tippfehler oder Klammern vergessen haben, so bitte ich dies zu entschuldigen, da ich das hier einfach mal so reingehackt habe .....

DeddyH 5. Jun 2013 11:19

AW: String in Array einlesen
 
Wie kommt Ihr eigentlich darauf, dass das nicht funktionieren soll? In diesem Beispiel ist FList ein privates Formularfeld vom Typ TList.
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;

//Sortieren
function CompareFunc(Item1, Item2: PRec): integer;
begin
  Result := AnsiCompareStr(Item1^.Col2, Item2^.Col2);
end;

procedure TfrmTest.btnSortClick(Sender: TObject);
begin
  FList.Sort(@CompareFunc);
end;

...

//Ausgeben
for i := 0 to FList.Count - 1 do
  begin
    Rec := PRec(FList[i])^;
    mmoAusgabe.Lines.Add(Format('%s;%s;%s', [Rec.Col1, Rec.Col2, Rec.Col3]));
  end;
Das ergibt dann folgende Ausgabe:
Zitat:

Auf der Mauer;Auf der Lauer;Dideldum dideldei
August;Bär;C++
Anton;Berta;Cäsar

Sir Rufo 5. Jun 2013 11:32

AW: String in Array einlesen
 
@DeddyH

genau so :)

Sir Rufo 5. Jun 2013 11:34

AW: String in Array einlesen
 
Zitat:

Zitat von arnof (Beitrag 1217511)
:?:

also Obiwan (Sir Rufo), ich will mich nicht so weit aus dem Fenster lehnen ich würde mal behaupten das dein Quellcode nicht geht, bzw nicht das macht was er will:

in SQL ausgedrückt will er

Select Sp1,sp2,sp3 from wasauchimmer
order by sp2

Ja, genau das wird auch gemacht

Zitat:

Zitat von musicman56 (Beitrag 1217512)
@Sir Rufo Stimmt, abgesehen davon, dass

Delphi-Quellcode:
Result := CompareStr( Left.Col2, Right.Col2 );
in diesem Fall eben so einfach nicht funktioniert

Aha, und warum nicht?

Sir Rufo 5. Jun 2013 11:45

AW: String in Array einlesen
 
Evtl. handelt es sich hier um das Hummel-Paradoxon.
Mein Code weiß nicht, dass er gar nicht funktionieren darf, und macht es trotzdem ;)

Ein kleines Testprogramm mit und ohne Generics
Delphi-Quellcode:
program ListSort;

{$APPTYPE CONSOLE}
{$R *.res}
// Generics-Switch
{$IF CompilerVersion>=20}
{$DEFINE GENERICS}
{$IFEND}
//

uses
{$IFDEF GENERICS}
  System.Generics.Defaults,
  System.Generics.Collections,
{$ENDIF}
  Classes,
  SysUtils;

type
  PMyData = ^TMyData;

  TMyData = record
    Col1, Col2, Col3 : string;
  end;

{$IFDEF GENERICS}

procedure WriteList( AList : TList<TMyData> );
var
  LIdx : Integer;
begin
  for LIdx := 0 to AList.Count - 1 do
    Writeln( AList[LIdx].Col1, ',', AList[LIdx].Col2, ',', AList[LIdx].Col3 );
end;

procedure Test;
var
  LList : TList<TMyData>;
  LRec : TMyData;
begin
  Writeln( 'Generic Version' );
  Writeln;

  LList := TList<TMyData>.Create;
  try
    // Add Data

    LRec.Col1 := 'a';
    LRec.Col3 := 'c';

    LRec.Col2 := 'z';
    LList.Add( LRec );

    LRec.Col2 := 'a';
    LList.Add( LRec );

    LRec.Col2 := 'm';
    LList.Add( LRec );

    // Output Data
    Writeln( 'Before Sort' );
    WriteList( LList );
    Writeln;

    // Sort Data

    LList.Sort( TComparer<TMyData>.Construct(
      function( const Left, Right : TMyData ) : Integer
      begin
        Result := CompareStr( Left.Col2, Right.Col2 );
      end ) );

    // Output Data
    Writeln( 'After Sort' );
    WriteList( LList );
    Writeln;

  finally
    LList.Free;
  end;
end;

{$ELSE}

function CompareMyDataCol2( Item1, Item2 : Pointer ) : Integer;
begin
  Result := CompareStr( PMyData( Item1 ).Col2, PMyData( Item2 ).Col2 );
end;

procedure WriteList( AList : TList );
var
  LIdx : Integer;
begin
  for LIdx := 0 to AList.Count - 1 do
    Writeln( PMyData( AList[LIdx] ).Col1, ',', PMyData( AList[LIdx] ).Col2, ',', PMyData( AList[LIdx] ).Col3 );
end;

procedure AddData( AList : TList; ARec : TMyData );
var
  LNewRec : PMyData;
begin
  New( LNewRec );
  LNewRec^ := ARec;
  AList.Add( LNewRec );
end;

procedure Test;
var
  LList : TList;
  LRec : TMyData;
begin
  Writeln( 'NON-Generic Version' );
  Writeln;

  LList := TList.Create;
  try

    // Add Data

    LRec.Col1 := 'a';
    LRec.Col3 := 'c';

    LRec.Col2 := 'z';
    AddData( LList, LRec );

    LRec.Col2 := 'a';
    AddData( LList, LRec );

    LRec.Col2 := 'm';
    AddData( LList, LRec );

    // Output Data
    Writeln( 'Before Sort' );
    WriteList( LList );
    Writeln;

    // Sort Data

    LList.Sort( @CompareMyDataCol2 );

    // Output Data
    Writeln( 'After Sort' );
    WriteList( LList );
    Writeln;

  finally
    LList.Free;
  end;
end;
{$ENDIF}

begin
  try

    Test;

  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;

  ReadLn;

end.

baumina 5. Jun 2013 11:59

AW: String in Array einlesen
 
OT:

@Sir Rufo : Lass dich nicht ärgern, ich finde deine Lösungen immer sehr kompetent, kurz und knackig. Da ich Informatik nicht studiert habe, muss sich da zwar mein Köpfchen oft sehr anstrengen um alles zu kapieren, aber wenn ichs dann kapiert habe, bin ich wieder ein Quäntchen schlauer und zufriedener als zuvor

... Ich mag Luke-Power 8-)

p80286 5. Jun 2013 12:18

AW: String in Array einlesen
 
Hab ich da etwas nicht mitbekommen?
Die Lösung von BLUP (hab ich jetzt nicht getestet oder ganz genau gelesen) ist doch wohl das, was gesucht wurde?
Sir Rufo hat es mit Feldern/Records gelöst, was meiner Meinung nach sauberer ist.
Ist übrigens ein schönes Beispiel dafür, daß man die Darstellung von den Daten trennen sollte.
(Peine Paris Salzgitter reicht auch, es muß nicht immer Airbus sein )

Gruß
K-H

Sir Rufo 5. Jun 2013 12:26

AW: String in Array einlesen
 
Zitat:

Zitat von baumina (Beitrag 1217524)
OT:

@Sir Rufo : Lass dich nicht ärgern, ich finde deine Lösungen immer sehr kompetent, kurz und knackig. Da ich Informatik nicht studiert habe, muss sich da zwar mein Köpfchen oft sehr anstrengen um alles zu kapieren, aber wenn ichs dann kapiert habe, bin ich wieder ein Quäntchen schlauer und zufriedener als zuvor

... Ich mag Luke-Power 8-)

Geht ja nicht darum dass ich mich ärgere, aber wenn das jemand liest, dann kommt der noch auf die falsche Fährte :mrgreen:

(Danke für die Blumen :))


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 Uhr.
Seite 2 von 4     12 34      

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