![]() |
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? |
Re: Zwei Stringlisten sortieren
Frage: Unterscheidet sich der Inhalt der beiden Listen? Oder ist der Inhalt bis auf die Sortierung gleich?
Gerd |
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.
|
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 |
Re: Zwei Stringlisten sortieren
Nein, es werden nicht die dateinamen sortiert, das Kriterium ist ein anderes, was die Dateinamen total durcheinander würfelt.
|
Re: Zwei Stringlisten sortieren
Zitat:
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 ![]() |
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; |
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?
|
Re: Zwei Stringlisten sortieren
Deswegen:
![]() |
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] |
Re: Zwei Stringlisten sortieren
Zitat:
|
Re: Zwei Stringlisten sortieren
Moin Luckie,
statt
Delphi-Quellcode:
AddObject(ExtractFilename(slFiles.Strings[i]), TObject(FileObj));
Delphi-Quellcode:
Da die andere Liste (slFiles) ja nicht angetastet wird, so wie ich es verstanden habe, ist der Index ja eindeutig
AddObject(ExtractFilename(slFiles.Strings[i]), TObject(i));
|
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:
Nur bekomme ich dann eine AV, wenn ich auf eine Zelle mit einem Dateinamen klicke:
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;
Delphi-Quellcode:
Ich zerschieße mir wohl irgendwie die ursprüngliche Dateiliste (slFiles).
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; |
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). |
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:
|
Re: Zwei Stringlisten sortieren
Zitat:
|
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:
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.
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; |
Re: Zwei Stringlisten sortieren
Moin Luckie,
Zitat:
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; |
Re: Zwei Stringlisten sortieren
Hm, so geht es wohl tatsächlich. Ich habe es immer so probiert:
Delphi-Quellcode:
Mal sehen.
StringGrid1.Rows[i+1].AddObject(ExtractFilename(slFiles.Strings[i]), TObject(i));
|
Re: Zwei Stringlisten sortieren
Moin Luckie,
so geht's auch. Das Objekt hat dann den Index 0. |
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. ;)
|
Re: Zwei Stringlisten sortieren
Moin Luckie,
vielleicht solltest Du einfach mal ein bisschen weniger nonVCL machen ;-) |
Re: Zwei Stringlisten sortieren
Hallo Luckie,
Zitat:
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