Delphi-PRAXiS

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);

Flom 10. Feb 2007 17:14

Re: ListView 2 mal Sortieren nicht möglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
okay! hab ich Depp natürlich nicht gemacht trotzdem passiert das selbe wie vorher ich poste mal ein bild mit als Bsp. was er eben nicht tut.

hab es außerdem zusätzlich jetzt in ListView1 umbenannt... grrr

Keldorn 10. Feb 2007 17:24

Re: ListView 2 mal Sortieren nicht möglich?
 
ok, richtig was erkenne tue ich in dem bild aber auch nicht (welche Spalte hast du angeklickt)?
in deinem code oben steht aber auch nirgends, daß du columntosort2, also die zweite Sortierspalte irgendwo setzt.

Flom 10. Feb 2007 17:39

Re: ListView 2 mal Sortieren nicht möglich?
 
wieso geklickt?
Er sortiert Automatisch nach dem Finden

Keldorn 10. Feb 2007 17:42

Re: ListView 2 mal Sortieren nicht möglich?
 
klar. und dort steht nur columnstosort:=0 also sortiert er nur nach der ersten. columnstosort2 setzt du nirgends.

Flom 10. Feb 2007 17:45

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

Zitat von Keldorn
klar. und dort steht nur columnstosort:=0 also sortiert er nur nach der ersten. columnstosort2 setzt du nirgends.

so ich hab jetzt das 2te hinzugefügt und dennoch:
Delphi-Quellcode:
ColumnToSort := 0; //hier also der Index der Spalte, nach der Sortiert werden soll
ListView1.AlphaSort;
ColumnToSort2 := 1;
ListView1.AlphaSort;

Keldorn 10. Feb 2007 17:50

Re: ListView 2 mal Sortieren nicht möglich?
 
und dennoch?

außerdem hast Du es immer noch nicht verstanden
Delphi-Quellcode:
ColumnToSort := 0;
ColumnToSort2 := 1;
ListView1.AlphaSort;
ansonsten häng dein ges. projekt als anhang dran.

Flom 10. Feb 2007 18:00

Re: ListView 2 mal Sortieren nicht möglich?
 
s. Anhang
ich muss was dämlich sein!!!

Keldorn 10. Feb 2007 18:16

Re: ListView 2 mal Sortieren nicht möglich?
 
aber das programm machts doch oder was ist nicht so, wie du es haben willst?

Flom 10. Feb 2007 18:20

Re: ListView 2 mal Sortieren nicht möglich?
 
Er zeigt mir folgendes an
Künstler - Titel

A - B
A - A
A - F
A - C

Statt

A - A
A - B
A - C
A - F

verstehst du mich jetzt ?

Keldorn 10. Feb 2007 18:25

Re: ListView 2 mal Sortieren nicht möglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
klar, aber das macht es doch?

Flom 10. Feb 2007 18:30

Re: ListView 2 mal Sortieren nicht möglich?
 
ja habs auch gerade mit bekommen nur frag ich mich was bei meinen "Heinz Erhardt" Titel anders ist ?!?
Ich hab nämlich nur den Ordner getestet... komisch....

Ich danke dir für die absolut stressigen Tag - Abend
Thema hat sich erledigt... ^^

Aber eine frage noch fix:
Kann ich die einzelnen Felder irgendwie in die hand nehmen zum Bearbeiten beispielsweise Speichern in einer Txt datei ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.

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