AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Listview sortieren (Dateigroesse und Speed)
Thema durchsuchen
Ansicht
Themen-Optionen

Listview sortieren (Dateigroesse und Speed)

Ein Thema von lucius · begonnen am 24. Nov 2005 · letzter Beitrag vom 24. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#1

Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 10:59
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 11:10
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:
Compare := CompareInteger(Umkehrfunktion(Item1.Caption),Umkehrfunktion(Item2.Caption));
Andreas
  Mit Zitat antworten Zitat
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 11:31
Hi shmia,

Erstmal danke fuer deine Antwort.

Also du meinst es so?
Delphi-Quellcode:
else
Compare := CompareInteger(StrtoInt(TextToSort1),StrtoInt(TextToSort2));
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead

Registriert seit: 16. Mai 2005
620 Beiträge
 
#4

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 11:39
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.
  Mit Zitat antworten Zitat
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 11:52
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
  Mit Zitat antworten Zitat
Benutzerbild von dahead
dahead

Registriert seit: 16. Mai 2005
620 Beiträge
 
#6

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 12:08
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.
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#7

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 12:10
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]
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 12:19
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
  Mit Zitat antworten Zitat
lucius

Registriert seit: 6. Okt 2005
Ort: Niederlande
215 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 12:31
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Listview sortieren (Dateigroesse und Speed)

  Alt 24. Nov 2005, 12:58
Lucius, qualifiziere den Funktionsaufruf einfach mal so: SysUtils.StrToFloat() - eventuell hast du irgendwo eine Überdeckung.

marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 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