Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listview sortieren (Dateigroesse und Speed) (https://www.delphipraxis.net/57626-listview-sortieren-dateigroesse-und-speed.html)

lucius 24. Nov 2005 10:59


Listview sortieren (Dateigroesse und Speed)
 
Hallo Leute,

Bin dabei meine Listview zu sortieren nach diesem Verfahren.
Klappt auch ganz gut aber ich moechte den Code noch etwas anpassen denn ich habe in eine Spalte eine Dateigroesse stehen
Zitat:

3.98 GB
4.31 GB
77.02 MB
218.34 MB
und in eine andere Spalte eine Geschwindigkeit
Zitat:

354.12 kB/s
3.19 MB/s
52.02 kB/s
Fuer die zwei Spalten moechte ich den code anpassen aber weiss nicht so recht wie.
Kann mich da vielleicht einer helfen bitte?
Danke im voraus.

shmia 24. Nov 2005 11:10

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

lucius 24. Nov 2005 11:31

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

dahead 24. Nov 2005 11:39

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.

lucius 24. Nov 2005 11:52

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

dahead 24. Nov 2005 12:08

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:
 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;
Der Vorteil ist, dass du nicht bei jedem HeaderClick auf die Sortierspalte jeden Wert von FloatToStr oder sonstwas umrechnen musst.

Grishnak 24. Nov 2005 12:10

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]

marabu 24. Nov 2005 12:19

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:
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;
Grüße vom marabu

lucius 24. Nov 2005 12:31

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;

marabu 24. Nov 2005 12:58

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 02:59 Uhr.
Seite 1 von 2  1 2      

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