| Autor |
Beitrag |
MILÖ
      
Beiträge: 26
WIN 98 SE
Delphi 3.0
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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Ö 
      
Beiträge: 26
WIN 98 SE
Delphi 3.0
|
Verfasst: 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
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Fr 31.12.04 15:41
| MILÖ hat folgendes geschrieben: | | @ tommie-lie Was ist OnCompare-Event? Ich bin kein Profi.... |
@Luckie: Gewonnen!
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Ö 
      
Beiträge: 26
WIN 98 SE
Delphi 3.0
|
Verfasst: 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.....
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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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 LISTVIEW SORTIEREN nicht ausspuckt
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
MILÖ 
      
Beiträge: 26
WIN 98 SE
Delphi 3.0
|
Verfasst: Fr 31.12.04 17:10
@ Keldorn Leider ist bei mir kein Beispiel vorhanden...
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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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Ö 
      
Beiträge: 26
WIN 98 SE
Delphi 3.0
|
Verfasst: 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....
Hier nochmals der Link: www.milo-soft.com/magazin/project3.zip
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 31.12.04 18:38
Weil heute Silvester ist:
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 procedure FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True); public 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)))); 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Ö 
      
Beiträge: 26
WIN 98 SE
Delphi 3.0
|
Verfasst: 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
|
Verfasst: 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.  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
|
|