Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Zwei Stringlisten sortieren (https://www.delphipraxis.net/45670-zwei-stringlisten-sortieren.html)

Luckie 10. Mai 2005 13:32


Zwei Stringlisten sortieren
 
Problem: Ich habe zwei Stringlisten. In der einen sind die Einträge in einer bestimmten Reihenfolge in der anderen nicht. In dieser anderen sollen die Einträge jetzt die gleiche Reihenfolge haben, wie die in der ersten. hat da jemand eine Idee, wie man das elegant lösen könnte?

Mir schwebt irgendwie was mit einer dritten temporären vor. Aber eht es eventuell noch besser?

bernau 10. Mai 2005 13:41

Re: Zwei Stringlisten sortieren
 
Frage: Unterscheidet sich der Inhalt der beiden Listen? Oder ist der Inhalt bis auf die Sortierung gleich?


Gerd

Luckie 10. Mai 2005 13:46

Re: Zwei Stringlisten sortieren
 
Man kann sagen, dass der Inhalt nahezu identisch ist. Hintergrund ist der: Ich habe eine Stringliste mit Dateien. Diese zeige ich in einem Stringgrid an. Aber dort nur die Dateinamen, der Pfad ist in dem Moment uninteressant. Mit Klick auf die Zelle wird die Datei in einem Memo angezeigt. Kein Problem, da ich aus der Zeile den Index in der Stringliste ermitteln kann. Jetzt kann das Stringgrid aber sortiert werden, mit der Folge dass die Reihenfolge im Grid nicht mehr mit der in der Stringliste übereinstimmt und somit die falsche Datei geöffnet wird. Bei einer Listbox hätte ich mit AddObject gearbeitet, aber das bietet das TMS StringGrid irgendwie nicht - oder ich habe es nochnicht gefunden.

Chris1986 10. Mai 2005 14:07

Re: Zwei Stringlisten sortieren
 
Hi Luckie,
welche Möglichkeiten der Sortierung bietet denn dein Stringgrid? Wenn es nur um eine alphabetisch aufsteigende, bzw. absteigende Sortierung der Dateinamen geht kannst du diese in der Stringlist doch einfach nachempfinden.
Wenn aber Einträge verschoben werden fällt mir auch nichts besseres ein, als Schritt für Schritt durchs Grid zu gehen, die Einträge mit der Stringlist zu vergleichen und eine temporäre Stringlist zu schreiben :gruebel:

Gruß
Christian

Luckie 10. Mai 2005 14:13

Re: Zwei Stringlisten sortieren
 
Nein, es werden nicht die dateinamen sortiert, das Kriterium ist ein anderes, was die Dateinamen total durcheinander würfelt.

Sharky 10. Mai 2005 14:19

Re: Zwei Stringlisten sortieren
 
Zitat:

Zitat von Luckie
... aber das bietet das TMS StringGrid irgendwie nicht - oder ich habe es nochnicht gefunden.

Hai Luckie,
ich habe zwar schon lange nicht mehr mit den TMS Produkten gearbeitet... aber das TMS-StringGrid ist glaube ich vom "normalen" TStringGrid abgeleitet. Dieses kannt auch ein Delphi-Referenz durchsuchenAddObject für jede Zeile/Spalte ([oh]Colls/Rows[/oh])

Luckie 10. Mai 2005 14:52

Re: Zwei Stringlisten sortieren
 
Gut die Eigenschaft habe ich jetzt gefunden, nur leider hängt sich mein Programm ganz still auf. Es kommt keine AV oder sonst irgendetwas.

Delphi-Quellcode:
type
  TFileObject = record
    Filename: String[255];
  end;
  PFileObject = ^TFileObject;

procedure TForm1.mnuFilesClick(Sender: TObject);
var
  i: Integer;
  s: string;
  FileObj: PFileObject;
begin
  if frmFiles.ShowModal = mrOK then
  begin
    // oben und unten eine Zeile zusätzlich
    StringGrid1.RowCount := slFiles.Count + 2;
    // Spaltenbreite anpassen
    StringGrid1.ColWidths[0] := GetLongestWord(StringGrid1.Canvas, slFiles) +
      30;
    // Dateinamen mit Pfad als Objekt in der Zeile ablegen
    for i := 0 to slFiles.Count - 1 do
    begin
      new(FileObj);
      FileObj^.Filename := slFiles.Strings[i];
      StringGrid1.Rows[i+1].AddObject(ExtractFilename(slFiles.Strings[i]), TObject(FileObj));
    end;
  end;
  mnuAnalyze.Enabled := EnableAnalyzeBtn;
end;

Alexander 10. Mai 2005 14:54

Re: Zwei Stringlisten sortieren
 
Mal ne Frage: Wenn in beiden Stringlisten das gleiche drin steht, nur halt einmal sortiert und einmal nicht. Warum nimmst du dann nicht einfach gleich die sortierte Stringlist?

Luckie 10. Mai 2005 14:55

Re: Zwei Stringlisten sortieren
 
Deswegen: http://www.delphipraxis.net/internal...=365641#365641 In der sortieretn fehlen die Pfade zu den Dateien.

Christian Seehase 10. Mai 2005 15:11

Re: Zwei Stringlisten sortieren
 
Moin Luckie,

warum nimmst Du als Objekt nicht einfach den Index der sortierten Liste?
Das spart Dir anschliessend auch die Freigabe des reservierten Speichers.

[EDIT]
und prüf' auch mal nach, dass AddObject auch das gewünschte erledigt.
Bei Memo/RichEdit.Lines kann man auch AddObject machen, aber hier enthält das Objekt anschliessend nur 0
[/EDIT]

Luckie 10. Mai 2005 15:17

Re: Zwei Stringlisten sortieren
 
Zitat:

Zitat von Christian Seehase
warum nimmst Du als Objekt nicht einfach den Index der sortierten Liste?
Das spart Dir anschliessend auch die Freigabe des reservierten Speichers.

Das verstehe ich jetzt nicht. Wie meinst du das?

Christian Seehase 10. Mai 2005 15:21

Re: Zwei Stringlisten sortieren
 
Moin Luckie,

statt

Delphi-Quellcode:
AddObject(ExtractFilename(slFiles.Strings[i]), TObject(FileObj));
Delphi-Quellcode:
AddObject(ExtractFilename(slFiles.Strings[i]), TObject(i));
Da die andere Liste (slFiles) ja nicht angetastet wird, so wie ich es verstanden habe, ist der Index ja eindeutig

Luckie 10. Mai 2005 15:26

Re: Zwei Stringlisten sortieren
 
Hm, ich würde gerne meine ursprüngliche Idee mit dem manuellen Sortieren der Stringlisten trotzdem gerne weirer verfolgen. Ich habe jetzt:
Delphi-Quellcode:
procedure SortSl(slInOut, slTemplate: TStringlist);
var
  slTemp: TStringList;
  i: Integer;
  //idx: Integer;
  s: string;
begin
  slTemp := TStringList.Create;
  try
    //for i := 0 to slTemplate.Count - 1 do
    while slTemp.Count > slTemplate.Count do
    begin
      s := slInOut.Strings[i];
      if pos(slTemplate.Strings[i], s) > 0 then
        slTemp.Add(s);
    end;
    slInOut.Assign(slTemp);
  finally
    //FreeAndNil(slTemp);
  end;
end;
Nur bekomme ich dann eine AV, wenn ich auf eine Zelle mit einem Dateinamen klicke:
Delphi-Quellcode:
procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Col, Row: Integer;
  sl: TStringList;
  i: Integer;
begin
  StringGrid1.MouseToCell(X, Y, Col, Row);
  if (Col = 0) and (Row > 0) and (StringGrid1.Cells[Col, Row] <> '') then
  begin
    IndexFileToOpen := Row - 1;
    TempForm := TfrmDisplayFiles.Create(self); // hier AV!!!
    FormList.Add(TempForm);
    TfrmDisplayFiles(FormList.Items[FormList.Count - 1]).Show;
    TfrmDisplayFiles(FormList.Items[FormList.Count - 1]).BringToFront;
  end;
  if (Col = StringGrid1.ColCount - 1) or
    (Col = StringGrid1.ColCount - 2) and
    (Row = 0) then
  begin
    StringGrid1.SortSettings.Column := Col;
    StringGrid1.QSort;
    sl := TStringList.Create;
    try
      for i := 1 to StringGrid1.RowCount - 2 do
      begin
        sl.Add(StringGrid1.Cells[0, i]);
      end;
      SortSl(slFiles, sl);
    finally
      FreeAndNil(sl);
    end;
    Sorted := True;
    mnuUnsort.Enabled := Sorted;
  end;
end;
Ich zerschieße mir wohl irgendwie die ursprüngliche Dateiliste (slFiles).

Sharky 10. Mai 2005 16:26

Re: Zwei Stringlisten sortieren
 
Hai Luckie,

da man in deinem Code nicht sieht was TfrmDisplayFiles ist und wo TempForm deklariert wurde kann man schwer etwas sagen.
Wenn Du das Projekt mal anhängst schaue ich gerne mal drüber (wenn es keine besonderen Komponenten benötigt).

Luckie 10. Mai 2005 17:45

Re: Zwei Stringlisten sortieren
 
Anhängen ungerne, ich verdiene damit Geld. ;) Schicken könnte ich es dir, aber erst morgen, ich muss noch ein paar Worte dazu schreiben, damit du wenigstens den Hauch einer Chance hast dich zurecht zu finden. :mrgreen:

Luckie 11. Mai 2005 11:52

Re: Zwei Stringlisten sortieren
 
Zitat:

Zitat von Christian Seehase
Delphi-Quellcode:
AddObject(ExtractFilename(slFiles.Strings[i]), TObject(i));
Da die andere Liste (slFiles) ja nicht angetastet wird, so wie ich es verstanden habe, ist der Index ja eindeutig

Jetzt habe ich es kapiert, aber das will auch nicht. Das Programm reagiert einfach nicht mehr.

Luckie 11. Mai 2005 20:05

Re: Zwei Stringlisten sortieren
 
Da die vorgeschlagenen Methoden irgendwas als Objekt zu speichern irgendwie nicht funktionieren, versuche ich jetzt über die Methode mit dem Sortieren der Stringliste zu gegehn. Problem habe ich im mersten Posting beschrieben. Ich bin jetzt so weit:
Delphi-Quellcode:
procedure Tform1.SortSlFiles(slTemplate: TStringlist);
var
  slTemp: TStringList;
  i: Integer;
  //idx: Integer;
  s: string;
begin
  i := 0;
  slTemp := TStringList.Create;
  try
    while slTemp.Count <= slTemplate.Count do
    begin
      s := slFiles.Strings[i];
      if pos(slTemplate.Strings[i], s) > 0 then
      begin
        slTemp.Add(s);
        Writeln(s);
      end;
      Inc(i);
    end;
    slFiles.Clear;
    for i := 0 to slTemp.Count -1 do
    begin
      slFiles.Add(sltemp.Strings[i])
    end;
  finally
    FreeAndNil(slTemp);
  end;
end;
Der Aufmerksame Leser wird sehen was passiert. Ich renne über den Listenidex hinaus, da i jedesmal erhöht wird und irgendwann ist i größer als Count - 1 und ich habe noch nicht alle Einträge in der neuen Liste. Es wäre schön, wenn mir da jemand helfen könnte, ich wollte die Software in den nächsten Tagen ausliefern.

Christian Seehase 11. Mai 2005 20:27

Re: Zwei Stringlisten sortieren
 
Moin Luckie,

Zitat:

Zitat von Luckie
Da die vorgeschlagenen Methoden irgendwas als Objekt zu speichern irgendwie nicht funktionieren,

seltsam :gruebel:

Ich habe das eben mal mit D6PE ausprobiert: Alles OK.

z.B. so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.Objects[0,0] := TObject(50);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(IntToStr(integer(StringGrid1.Objects[0,0])));
end;

Luckie 11. Mai 2005 20:30

Re: Zwei Stringlisten sortieren
 
Hm, so geht es wohl tatsächlich. Ich habe es immer so probiert:
Delphi-Quellcode:
StringGrid1.Rows[i+1].AddObject(ExtractFilename(slFiles.Strings[i]), TObject(i));
Mal sehen.

Christian Seehase 11. Mai 2005 20:32

Re: Zwei Stringlisten sortieren
 
Moin Luckie,

so geht's auch.
Das Objekt hat dann den Index 0.

Luckie 11. Mai 2005 20:47

Re: Zwei Stringlisten sortieren
 
Wie gesagt, bei mir ging es irgendwie nicht, aber so geht es perfekt, dankt dir. Du hast gerade einen treuen Kunden sehr glücklich gemnacht. ;)

Christian Seehase 11. Mai 2005 20:49

Re: Zwei Stringlisten sortieren
 
Moin Luckie,

vielleicht solltest Du einfach mal ein bisschen weniger nonVCL machen ;-)

Johnny_W 11. Mai 2005 20:50

Re: Zwei Stringlisten sortieren
 
Hallo Luckie,

Zitat:

Man kann sagen, dass der Inhalt nahezu identisch ist. Hintergrund ist der: Ich habe eine Stringliste mit Dateien. Diese zeige ich in einem Stringgrid an. Aber dort nur die Dateinamen, der Pfad ist in dem Moment uninteressant. Mit Klick auf die Zelle wird die Datei in einem Memo angezeigt. Kein Problem, da ich aus der Zeile den Index in der Stringliste ermitteln kann. Jetzt kann das Stringgrid aber sortiert werden, mit der Folge dass die Reihenfolge im Grid nicht mehr mit der in der Stringliste übereinstimmt und somit die falsche Datei geöffnet wird. Bei einer Listbox hätte ich mit AddObject gearbeitet, aber das bietet das TMS StringGrid irgendwie nicht - oder ich habe es nochnicht gefunden
Wenn Stringgrid Reihenfolge der unsortierten Stringliste entspricht, dann kannst du doch die Eigenschaft Values und Names der TStringList benutzen bzw setzen.

Z.b. Sprich Pfade= Value und Key=Name der Datei
UnsortierteListe.Add('EinProgramm=C:\Irgendwo');

Dann kann man über UnsortierteListe.Values['Key'] auf den Pfad zugreifen. Da kann "uns" der Index egal sein.

Nur so ein Vorschlag...


[/Edit] Bin zu langsam, aber wollt es trotzdem schicken...

MfG :)


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