Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView 2 mal Sortieren nicht möglich? (https://www.delphipraxis.net/86174-listview-2-mal-sortieren-nicht-moeglich.html)

Flom 10. Feb 2007 12:59


ListView 2 mal Sortieren nicht möglich?
 
Hallo,
Ich versuche nun seit 3 Stunden verzweifelt ein ListView Feld mit Hilfe der Code-Library zu Sortieren: Folgender Link:
http://www.delphipraxis.net/internal...light=listview

Nun möchte ich jedoch Feld 0 & 1 Sortieren und später dann vielleicht noch nach dem Daten Herkunfts Pfad : also dachte ich, ich mache es einfach so:

Delphi-Quellcode:
ColumnToSort := 0; //hier also der Index der Spalte, nach der Sortiert werden soll
ListView4.AlphaSort;
ColumnToSort := 1;
ListView4.AlphaSort;
ColumnToSort := 3;
ListView4.AlphaSort;
doch leider Sortiert er jedesmal nur Spalte 0 warum & wie kann ich mein Problem Lösen?

Grüße Flom!

Keldorn 10. Feb 2007 13:35

Re: ListView 2 mal Sportieren nicht möglich?
 
Hallo

du kannst das oncompare ereignis ändern und dort nach der 2. zusätzlichen Spalte sortieren, wenn mehr Spalten sind, kommst du mit einem Columtosortarray und einer kleinen Schllife sicher besser.
hier Denksanstoß für 2 Sortierspalten, brauchst dazu eine 2. Columtosortvariable:
Delphi-Quellcode:
procedure TForm1.ListViewsCompare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
var
  i:integer;
begin
  if ColumnToSort = 0 then
  Compare := CompareText(Item1.Caption, Item2.Caption)
  else
  begin
    i := ColumnToSort -1;
    Compare := CompareText(Item1.SubItems[i], Item2.SubItems[i]);
  end;
  if compare=0 then //wenn Einträge gleich sind, dann nach einer 2. Spalte sortieren
    begin
      if ColumnToSort2 = 0 then
      Compare := CompareText(Item1.Caption, Item2.Caption)
      else
      begin
        i := ColumnToSort2 -1;
        Compare := CompareText(Item1.SubItems[i], Item2.SubItems[i]);
      end;
    end;
Mfg Frank

Flom 10. Feb 2007 14:49

Re: ListView 2 mal Sportieren nicht möglich?
 
irgendwie raff ichs nicht... das bringt mich 0 weiter irgendwie...

Keldorn 10. Feb 2007 15:52

Re: ListView 2 mal Sortieren nicht möglich?
 
na mit deinem Code
Delphi-Quellcode:
ColumnToSort := 0; //hier also der Index der Spalte, nach der Sortiert werden soll
ListView4.AlphaSort;
ColumnToSort := 1;
ListView4.AlphaSort;
ColumnToSort := 3;
ListView4.AlphaSort;
Sortierst du das listview erst nach Spalte 0, dann 1 und dann Spalte 3. Aber so sortierst du das listview immer komplett nach diesen Spalten und nicht erst nach Spalte0, bei gleichen Einträgen dann nach Spalte 1 und 3. Das kann nur im oncompare passieren, du sortierst erst nach der Columtosortspalte, wenn beide Items gleich sind, ist oncompare 0 und dann vergleichst du nach einer 2. Sortierspalte.

ansonsten poste mal bitte deinen relevanten code.

Mfg Frank

Flom 10. Feb 2007 16:38

Re: ListView 2 mal Sortieren nicht möglich?
 
@Keldorn

Nur funktioniert es nicht! er sortiert trotz alle dem nur die erste Spalte!

Keldorn 10. Feb 2007 16:41

Re: ListView 2 mal Sortieren nicht möglich?
 
ok, dann zeig mal deinen code.
wenn du schreibst, daß er immer nach der 0. Spalte sortiert: das oncompare-ereignsi hast du auch deiner Listview zugewiesen?

Flom 10. Feb 2007 16:47

Re: ListView 2 mal Sortieren nicht möglich?
 
Delphi-Quellcode:
procedure TForm1.ListViewsColumnClick(Sender: TObject; Column: TListColumn);
begin
  ColumnToSort := Column.Index;
  (Sender as TCustomListView).AlphaSort;
end;

procedure TForm1.ListViewsCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
var
  i:integer;
begin
  if ColumnToSort = 0 then
  Compare := CompareText(Item1.Caption, Item2.Caption)
  else
  begin
    i := ColumnToSort -1;
    Compare := CompareText(Item1.SubItems[i], Item2.SubItems[i]);
  end;
  if compare=0 then //wenn Einträge gleich sind, dann nach einer 2. Spalte sortieren
    begin
      if ColumnToSort2 = 0 then
      Compare := CompareText(Item1.Caption, Item2.Caption)
      else
      begin
        i := ColumnToSort2 -1;
        Compare := CompareText(Item1.SubItems[i], Item2.SubItems[i]);
      end;
    end;
end;
...

Delphi-Quellcode:
procedure TForm1.CreateFileList(Dir, Ext: String; UseSubDirs: Boolean);
var
SR: TSearchRec;
Item: TListItem;

begin
If FindFirst(Dir + '*.*', faAnyFile, SR) = 0 then
Repeat
  If (SR.Attr and faDirectory = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') and (UseSubDirs) then CreateFileList(IncludeTrailingPathDelimiter(Dir + SR.Name), Ext, UseSubDirs)
  Else If LowerCase(ExtractFileExt(SR.Name)) = LowerCase(Ext) then
   begin
    Application.ProcessMessages;
    ///////////////////////////////////////////////
    ///////////////////////////////////////////////
    Item := ListView4.Items.Add;
    Lese_ID3Tag(Dir + SR.Name);
    Item.Caption := ID3Tag.Artist;
    Item.SubItems.Add(ID3Tag.Titel);
    Item.SubItems.Add(SR.Name);
    Item.SubItems.Add(Dir);
   end;
   Label2.Caption:='Aktion: Suche Dateien';
Until FindNext(SR) <> 0;
FindClose(SR);
Label2.Caption:='Aktion: Fertig';
end;
der Aufruf:
Delphi-Quellcode:
procedure TForm1.SucheClick(Sender: TObject);
begin
ListView4.Clear;
if CheckBox_MP3.Checked = True then
CreateFileList(quelle + '\', '.mp3', CheckBox1.Checked);
if CheckBox_WMA.Checked = True then
CreateFileList(quelle + '\', '.wma', CheckBox1.Checked);
Label1.Caption:='Insgesamt: '+IntToStr(ListView4.Items.Count);
//////////////////////////////////////////////////////////////
ColumnToSort := 0; //hier also der Index der Spalte, nach der Sortiert werden soll
ListView4.AlphaSort;
end;

Keldorn 10. Feb 2007 16:55

Re: ListView 2 mal Sortieren nicht möglich?
 
Hast du wirklich die beiden ereignisse deinem Listview zugewiesen? Weil die heißen bei dir TForm1.ListViews... und nicht Listview4-Column, nicht das du die bloß in deinen Quelltext kopiert hast.

Flom 10. Feb 2007 17:02

Re: ListView 2 mal Sortieren nicht möglich?
 
Zitat:

Zitat von Keldorn
Hast du wirklich die beiden ereignisse deinem Listview zugewiesen? Weil die heißen bei dir TForm1.ListViews... und nicht Listview4-Column, nicht das du die bloß in deinen Quelltext kopiert hast.

Alles so wies da steht! Und was soll ich den wo zuweisen?!

*oh man ist echt nich mein tach*

Keldorn 10. Feb 2007 17:07

Re: ListView 2 mal Sortieren nicht möglich?
 
na normaler weise klickt man im OI die beiden ereignisse doppelt und Delphi erstellt die beiden leeren Proceduren und du kopierst den eigentlichen code rein. Das kannst du nicht gemacht haben, sonst stünde da Tform1.Listview4.

Wenn du die beiden Ereignisse 1:1 in deinen quelltext kopiert hast, mußt Du sie noch dem Listview zuweisen (im Objektinspektor bei oncompare und on columclick die beiden procs auswählen. Wenn du sie nicht auswählen kannst, mußt du sie noch unter Tform ergänzen

Delphi-Quellcode:
  TForm1 = class(TForm)
    ListView4: TListView;
    procedure ListViewsColumnClick(Sender: TObject; Column: TListColumn);
    procedure ListViewsCompare(Sender: TObject; Item1, Item2: TListItem;Data: Integer; var Compare: Integer);


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz