Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.
Seite 2 von 3     12 3      

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