Autor Beitrag
MILÖ
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Fr 31.12.04 13:43 
Hallo
Ich benutze Delphi 3.0 Dort habe ich eine ListView eingefügt, in dem ich mir Dateien anzeigen lasse. Soweit so gut. Nun habe ich 3 Spalten. In der ersten wird der Dateiname angezeigt, in der Zweiten die Dateigröße und in der Dritten das Erstelldatum der Datei.
Jetzt möchte ich die Dateien sortieren.
Bei diesem Befehl (klick auf die erste Spalte) klappt es und es werden die Dateien in alphabetischer Reihenfolge sortiert.
If Column.Caption='Name' then ListView1.SortType:=stText;

Wenn ich allerdings auf die zweite Spalte klicke
If Column.Caption='Size' then ListView1.SortType:=stData;
wird nicht nach der Dateigröße sortiert. Es passiert rein garnichts.....

Was mache ich falsch???

Ich möchte es eigentlich genau so haben, wie im Windows Explorer.

Gruß und frohes neues Jahr
Michael
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 31.12.04 13:50 
MILÖ hat folgendes geschrieben:

Was mache ich falsch???

Schwer zu sagen, so ganz ohne Glaskugel und ohne freie Sicht auf deinen Bildschirm. Oder ist das alles, was du gemacht hast?
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Fr 31.12.04 13:55 
Hast du an das OnCompare-Event gedacht?
Delphi-Onlinehilfe hat folgendes geschrieben:
If SortType is stData or stBoth, you must provide an OnCompare event handler to compare data values.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
MILÖ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Fr 31.12.04 15:36 
@ tommie-lie Was ist OnCompare-Event? Ich bin kein Profi....
@ Luckie Würde der Quellcode helfen? Ich könnte den ja mal schicken.
Falls mir hier jemand helfen kann, bitte einfach eine Mail an: info@milo-soft.com und ich schicke den Quellcode.

Danke Michael
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Fr 31.12.04 15:41 
MILÖ hat folgendes geschrieben:
@ tommie-lie Was ist OnCompare-Event? Ich bin kein Profi....
@Luckie: Gewonnen! :mrgreen:
Da habe ich schon die Onlinehilfe zitiert und du kommst immer noch nicht auf die Idee, selbst dort nachzuschauen. Einfach mal 'nen Listview auf's Formular, markieren, F1 drücken, auf den Link "Events" klicken und OnCompare aus der aufpoppenden Liste raussuchen und anklicken.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
MILÖ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Fr 31.12.04 16:01 
Ich war auf diese Idee schon vorher gekommen.....

Dann erhalte ich das:
Zitat:
OnCompare occurs to when two items need to be compared during a sort of the list.

TLVCompareEvent = procedure(Sender: TObject; Item1, Item2: TListItem; Data: Integer;

var Compare: Integer) of object;

property OnCompare: TLVCompareEvent;

Description

Write an OnCompare event handler to implement a sort order for the list. An OnCompare event handler is called when the SortType property is stData or stBoth, when the AlphaSort method is called, or when the CustomSort method is called without a SortProc parameter.
The OnCompare event handler compares the list items passed as the Item1 and Item2 parameters. If Item1 is the same as Item2 in the sort order, set the Compare parameter to 0. If Item1 is less than Item2, set the Compare parameter to a value less than 0. If Item1 is greater than Item2, set the Compare parameter to a value greater than 0. The Data parameter is 0 when the event handler is called to maintain the sort order of a list view with a SortType of stData or stBoth. Similarly, when OnCompare occurs in response to the AlphaSort method, the Data parameter is 0. When OnCompare occurs in response to the CustomSort method, the Data parameter is the value of the LParam parameter of CustomSort.


Wenn ich jetzt im Englischen perfekt wäre, dann wüsste ich bestimmt was zu tun ist und könnte mir das Posten hier im Forum sparen..... :wink:
Bin ich aber leider nicht und so bitte ich immer noch um eine kleine Hilfe.....
Mein Angebot mit dem Quellcode steht immer noch.
Hier kann man in downloaden: www.milo-soft.com/magazin/project3.zip
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 31.12.04 16:57 
Hallo

öhmm, in der Delphi-hilfe ist doch sogar ein Beispiel (bei oncompare oder on columnclick-ereignis), das brauchst du doch nur zu übernehmen. außerdem glaube ich nicht, das die Suche zu Suche in: Delphi-Forum, Delphi-Library LISTVIEW SORTIEREN nicht ausspuckt ;)

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
MILÖ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Fr 31.12.04 17:10 
@ Keldorn Leider ist bei mir kein Beispiel vorhanden... :cry:
Ich komme einfach nicht weiter, kannst Du mir vielleicht dieses Beispiel schicken? Oder schau dir doch mal meinen Quellcode an. Es kann doch bestimmt nicht so viel Qode sein, um dieses blöde ListView nach verschiedenen Spalten zu sortieren....
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 31.12.04 17:25 
warum suchst du nicht erstmal im Forum? Du bist nicht der erste, der ein listview sortieren will

wenn du den suchlink angeklickt hättest, hättest du z.B. das gefunden:
www.delphi-forum.de/...t=listview+sortieren
das Bsp von Luckie ist das aus der Onlínehilfe.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
MILÖ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Fr 31.12.04 17:50 
@ Keldorn
Habe das Beispiel gefunden, aber es funktioniert bei mir nicht...
Bitte, bitte schau dir doch mal meinen Code an und sage mir was ich falsch mache.... :cry:
Hier nochmals der Link: www.milo-soft.com/magazin/project3.zip
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 31.12.04 18:38 
Weil heute Silvester ist:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
    procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn);
    procedure ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
  private
    { Private-Deklarationen }
    procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse:
      Boolean = True);
  public
    { Public-Deklarationen }
  end;

var
  Form1        : TForm1;

implementation

{$R *.dfm}

var
  ColumnToSort : Integer;
  Accending    : Boolean = False;

function GetFileSize(szFile: PChar): Int64;
var
  fFile        : THandle;
  wfd          : TWIN32FINDDATA;
begin
  result := 0;
  if not FileExists(szFile) then
    exit;
  fFile := FindFirstfile(pchar(szFile), wfd);
  if fFile = INVALID_HANDLE_VALUE then
    exit;
  result := (wfd.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;

procedure TForm1.FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse:
  Boolean = True);
var
  SR           : TSearchRec;
  ListItem     : TListItem;
begin
  if RootFolder = '' then
    Exit;
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  RootFolder := IncludeTrailingPathDelimiter(RootFolder);
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
    try
      repeat
        if SR.Attr and faDirectory = faDirectory then
          if (SR.Name <> '.') and (SR.Name <> '..') then
            FindAllFiles(RootFolder + SR.Name, Mask, Recurse);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory <> faDirectory then
      begin
        ListItem := Listview1.Items.Add;
        ListItem.Caption := SR.Name;
        ListItem.SubItems.Add(IntToStr(GetFileSize(PChar(RootFolder +
          SR.Name))));
          //Form1.Memo1.Lines.Add(RootFolder + SR.Name);
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Listview1.SortType := stData;
  FindAllFiles('c:\', '*.*', False);
end;

procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  ColumnToSort := Column.Index;
  Listview1.AlphaSort;
  Accending := not Accending;
end;

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  case ColumnToSort of
    0:
      begin
        if Accending then
          Compare := CompareText(Item1.Caption, Item2.Caption)
        else
          Compare := CompareText(Item2.Caption, Item1.Caption);
      end;
    1:
    begin
      if Accending then
        Compare := StrToInt(Item1.SubItems[0]) - StrToInt(Item2.SubItems[0])
      else
        Compare := StrToInt(Item2.SubItems[0]) - StrToInt(Item1.SubItems[0]);
    end;
  end;
end;

Einen Listview mit 2 Spalten auf die Form packen, Code reinkopieren und die Ereignisse zuweisen.
MILÖ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Fr 31.12.04 19:14 
@ Luckie Danke für die Mühe...
Leider hast Du übersehen, dass ich unter Delphi 3.0 arbeite und da funktioniert der Code nicht. (Auch die Hinweise auf www.delphi-forum.de/...t=listview+sortieren berücksichtigen das nicht.)
Bei Deinem Code bekomme ich schon bei procedure FindAllFiles(RootFolder: string; Mask: string ='*.*'; Recurse: Boolean = True);
Die Fehlermeldung: ; oder ) erwartet, aber = gefunden!

Ich glaube, ich wrde das Problem unter 3.0 wohl nie lösen können.

Trotzdem Danke und ein frohes neues Jahr
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 01.01.05 15:51 
Die Rouitine FindAllFiles habe ich mir doch nur da reingepackt, damit ich was zum Sortieren da drinne stehen habe. :roll: Und außerdem ging es dir doch ums sortieren oder?

Aber hier ist der Code auch für D3 angepasst: www.delphipraxis.net...ien+durchsuchen.html