![]() |
Listview sortieren (Dateigroesse und Speed)
Hallo Leute,
Bin dabei meine Listview zu sortieren nach ![]() Klappt auch ganz gut aber ich moechte den Code noch etwas anpassen denn ich habe in eine Spalte eine Dateigroesse stehen Zitat:
Zitat:
Kann mich da vielleicht einer helfen bitte? Danke im voraus. |
Re: Listview sortieren (Dateigroesse und Speed)
Du hast ja wohl ein Funktion, die dir eine Integer-Zahl in einen String wandelt.
229169010 -> '218.34 MB' Jetzt brauchst du die Umkehrfunktion; also der String mit der Größenangabe muss wieder zurück in eine Zahl verwandelt werden. Statt CompareText(Item1.Caption,Item2.Caption) schreibst du dann:
Delphi-Quellcode:
Compare := CompareInteger(Umkehrfunktion(Item1.Caption),Umkehrfunktion(Item2.Caption));
|
Re: Listview sortieren (Dateigroesse und Speed)
Hi shmia,
Erstmal danke fuer deine Antwort. Also du meinst es so?
Delphi-Quellcode:
else
Compare := CompareInteger(StrtoInt(TextToSort1),StrtoInt(TextToSort2)); |
Re: Listview sortieren (Dateigroesse und Speed)
speicher doch einfach die dateigröße in bytes in deinen items. dann kannst du via Item1.fSize (was Int64 wäre) darauf zugreifen, und brauchst nicht bei jedem Sort das IntToStr verwenden. du kannst auch bei änderung der fSize via Property die fSizeStr in MB, GB, usw. umrechnen lassen und auch speichern.
|
Re: Listview sortieren (Dateigroesse und Speed)
Hi dahead, was deine Loesung angeht blick ich noch nicht ganz durch.
Also die 4e Spalte beinhaltet die Groessen und die 6e Spalte den Speed. Ich beschraenke mich erstmal auf die Groesse und arbeite mal mit der Loesung von shmia. Jetzt weiss ich aber nicht was ich wo aendern soll in den Code, ich nehme an irgendwo hier:
Delphi-Quellcode:
//Texte je nach Tag der Spalte unterschiedlich vergleichen
case (Sender as TListView).Columns[ColumnToSort].Tag of //Integer-Werte 1: Compare := StrToInt(TextToSort1)-StrToInt(TextToSort2); //Float-Werte 2: begin Compare := 0; if StrToFloat(TextToSort1) > StrToFloat(TextToSort2) then Compare := Trunc(StrToFloat(TextToSort1)-StrToFloat(TextToSort2))+1; if StrToFloat(TextToSort1) < StrToFloat(TextToSort2) then Compare := Trunc(StrToFloat(TextToSort1)-StrToFloat(TextToSort2))-1; end; //2 //DateTime-Werte 3: begin Compare := 0; if StrToDateTime(TextToSort1) > StrToDateTime(TextToSort2) then Compare := Trunc(StrToDateTime(TextToSort1)-StrToDateTime(TextToSort2))+1; if StrToDateTime(TextToSort1) < StrToDateTime(TextToSort2) then Compare := Trunc(StrToDateTime(TextToSort1)-StrToDateTime(TextToSort2))-1; end; //3 //Alles andere sind Strings else Compare := CompareText(TextToSort1,TextToSort2); end; //case (Sender as TListView).Columns[ColumnToSort].Tag of |
Re: Listview sortieren (Dateigroesse und Speed)
Ich meine, du musst in deinen angezeigten Elementen (ob records, objects oder sonstwas) ja irgendwo die Größe (ich gehe jetzt mal nicht auf die Geschwindigkeit ein) speichern.
Ich habe dir empfohlen, die Dateigröße in Bytes als Int64 in deinem Element zu speichern und als String. Dann kannst du beim Vergleich in der Listview die genauen Byte Werte vergleichen, und als Anzeige verwendest du den formatierten String. Hier mal ein Beispiel - denke so ist es etwas verständlicher.
Delphi-Quellcode:
Der Vorteil ist, dass du nicht bei jedem HeaderClick auf die Sortierspalte jeden Wert von FloatToStr oder sonstwas umrechnen musst.
TFileItem = class(TObject)
private fFullFilename, fSizeStr, fDateTimeStr: String; fSize: Int64; fDateTime: TDateTime; public constructor Create(const aFilename: String; const aFileSize: Int64); destructor Free; property Checked: Boolean read fChecked write fChecked; property FullFilename: String read fFullFilename; property Size: Int64 read write SetSize; property SizeStr: String read fSizeStr; property DateTimeStr: String read fDateTimeStr; property DateTime: TDateTime read fDateTime write SetDateTime; end; |
Re: Listview sortieren (Dateigroesse und Speed)
Ich denke, was dahead sagen wollte ist, dass du die Größenangaben nicht als '3.98 GB' in einem String abspeichern sollst, sondern als 4273492460 (= 3,98 x 1024 x 1024 x 1024 Byte) in einer Int64; die Geschwindigkeiten (z.B. '354.12 kb/S') als 362619 (= 354.12 x 1024 Byte/S). Diese Int64 kann der Prozessor wesentlich schneller vergleichen und sortieren. Für die Anzeige werden die Zahlen dann entsprechen "aufbereitet", damit aus 4273492460 wieder ein '3.98 GB' wird.
[edit]zu langsam...[/edit] |
Re: Listview sortieren (Dateigroesse und Speed)
Hi Lucius,
da deine Daten aus einem XML-File stammen und du sie intern in einer StringList speicherst, kommst du um das eventuell mehrfache Konvertieren der Strings nicht herum. Probier die Konvertierung mal mit der folgenden Funktion anstelle von StrToFloat():
Delphi-Quellcode:
Grüße vom marabu
type
TDemoForm = class(TForm) ... private fs: TFormatSettings; end; function StrToBytes(s: string; fs: TFormatSettings; decimal: boolean = true): double; var sValue: string; factor: integer; begin if decimal then factor := 1000 else factor := 1024; sValue := ParseStr(s, ' '); Result := StrToFloat(sValue, fs); case s[1] of 'G': Result := Result * factor * factor; 'K': Result := Result * factor; end; end; procedure TDemoForm.Create(Sender: TObject); begin // initialize format settings GetLocaleFormatSettings(GetUserDefaultLCID, fs); // in case of differing decimal point settings fs.DecimalSeparator := '.'; fs.ThousandSeparator := ','; end; procedure TDemoForm.ButtonClick(Sender: TObject); begin try d := StrToBytes('312.45 MB', fs); ShowMessage(FloatToStr(d)); except ShowMessage('damned'); end; end; |
Re: Listview sortieren (Dateigroesse und Speed)
Hi marabu,
Ich bekomme nen Overload Fehler bei deiner Function.
Delphi-Quellcode:
function StrToBytes(s: string; fs: TFormatSettings; decimal: boolean = true): double;
var sValue: string; factor: integer; begin if decimal then factor := 1000 else factor := 1024; sValue := ParseStr(s, ' '); Result := StrToFloat(sValue, fs); <-----There is no overload version of StrtoFloat case s[1] of 'G': Result := Result * factor * factor; 'K': Result := Result * factor; end; end; |
Re: Listview sortieren (Dateigroesse und Speed)
Lucius, qualifiziere den Funktionsaufruf einfach mal so: SysUtils.StrToFloat() - eventuell hast du irgendwo eine Überdeckung.
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr. |
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