AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datum/Zeitwerte vergleichen

Ein Thema von MicMic · begonnen am 12. Sep 2018 · letzter Beitrag vom 14. Sep 2018
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 19:29
https://www.swissdelphicenter.ch/de/...de.php?id=1103
Vielleicht hilft Dir dieses Beispiel weiter.
Delphi-Quellcode:
{
  This example shows how to use the TListView's CustomSort method to
  sort the items in the list using a ordering function.
  This allows you to sort custom data in the correct order you want.

  When the user clicks on a column header, the ListView will be sorted
  by that column.
  If the user clicks on the same column again, the sort order will be toggled.

  (***)

  Dieses Beispiel zeigt die Verwendung der CustomSort Methode einer TListView.
  Damit kann man z.B Zahlen korrekt (d.h nach ihrer Grösse) sortieren lassen.
  Wenn der Anwender auf den Kopf einer Spalte klickt, wird die ensprechende
  Spalte sortiert. Bei nochmaligem Klicken auf dieselbe Spalte wird die
  Sortierreihenfolge umgekehrt.

}


{ custom sort styles }

type
  TCustomSortStyle = (cssAlphaNum, cssNumeric, cssDateTime);

var
  { variable to hold the sort style }
  LvSortStyle: TCustomSortStyle;
  { array to hold the sort order }
  LvSortOrder: array[0..4] of Boolean; // High[LvSortOrder] = Number of Lv Columns

implementation

{$R *.DFM}

function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;
var
  s1, s2: string;
  i1, i2: Integer;
  r1, r2: Boolean;
  d1, d2: TDateTime;

  { Helper functions }

  function IsValidNumber(AString : string; var AInteger : Integer): Boolean;
  var
    Code: Integer;
  begin
    Val(AString, AInteger, Code);
    Result := (Code = 0);
  end;

  function IsValidDate(AString : string; var ADateTime : TDateTime): Boolean;
  begin
    Result := True;
    try
      ADateTime := StrToDateTime(AString);
    except
      ADateTime := 0;
      Result := False;
    end;
  end;

  function CompareDates(dt1, dt2: TDateTime): Integer;
  begin
    if (dt1 > dt2) then Result := 1
    else
      if (dt1 = dt2) then Result := 0
    else
      Result := -1;
  end;

  function CompareNumeric(AInt1, AInt2: Integer): Integer;
  begin
    if AInt1 > AInt2 then Result := 1
    else
      if AInt1 = AInt2 then Result := 0
    else
      Result := -1;
  end;

begin
  Result := 0;

  if (Item1 = nil) or (Item2 = nil) then Exit;

  case SortColumn of
    -1 :
    { Compare Captions }
    begin
      s1 := Item1.Caption;
      s2 := Item2.Caption;
    end;
    else
    { Compare Subitems }
    begin
      s1 := '';
      s2 := '';
      { Check Range }
      if (SortColumn < Item1.SubItems.Count) then
        s1 := Item1.SubItems[SortColumn];
      if (SortColumn < Item2.SubItems.Count) then
        s2 := Item2.SubItems[SortColumn]
    end;
  end;

  { Sort styles }

  case LvSortStyle of
    cssAlphaNum : Result := lstrcmp(PChar(s1), PChar(s2));
    cssNumeric : begin
                    r1 := IsValidNumber(s1, i1);
                    r2 := IsValidNumber(s2, i2);
                    Result := ord(r1 or r2);
                    if Result <> 0 then
                      Result := CompareNumeric(i2, i1);
                  end;
    cssDateTime : begin
                    r1 := IsValidDate(s1, d1);
                    r2 := IsValidDate(s2, d2);
                    Result := ord(r1 or r2);
                    if Result <> 0 then
                      Result := CompareDates(d1, d2);
                  end;
  end;

  { Sort direction }

  if LvSortOrder[SortColumn + 1] then
    Result := - Result;
end;


{ The ListView's OnColumnClick event }

procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
  { determine the sort style }
  if Column.Index = 0 then
    LvSortStyle := cssAlphaNum
  else
    LvSortStyle := cssNumeric;

  { Call the CustomSort method }
  ListView1.CustomSort(@CustomSortProc, Column.Index -1);

  { Set the sort order for the column}
  LvSortOrder[Column.Index] := not LvSortOrder[Column.Index];
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.371 Beiträge
 
Delphi 12 Athens
 
#2

AW: Datum/Zeitwerte vergleichen

  Alt 14. Sep 2018, 00:59
Immer wieder sieht man Codes, die noch niemand benutzt hat, der sein Programm auch mal debuggt,
mit massenhaft unnötigen Exceptions, welche ständig die Arbeit unterbrechen und jemanden zu einem Mord verleiten (an dem, der das verbrochen hat).

Delphi-Referenz durchsuchenTryStrToDateTime

Die uralte TurboPascal-Funktion "Val" ist hier nicht verkehrt, wobei es auch dafür seit Jahrzehnten ein Delphi-Referenz durchsuchenTryStrToInt gäbe.
Code ist allerdings irreführender Bezeichner, denn es ist ja eigentlich die Fehler-Position (ErrPos), aber da liegt der Fehler bei Delphi/Borland/Embaradero und dessen "falscher" Dokumentation/Funktionsdeklaration.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Datum/Zeitwerte vergleichen

  Alt 14. Sep 2018, 03:30
In der Funktion "CompareDates" wird genau das gemacht, was ich angesprochen habe, sprich laut Hilfe (diese eine Anmerkung) soll man die Vergleichsprüfung nicht so machen.
Trotzdem Danke @KodeZwerg für's raussuchen.

Michael
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:06 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