Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi else ifs werden übersprungen (https://www.delphipraxis.net/99399-else-ifs-werden-uebersprungen.html)

Dax 11. Sep 2007 22:48

Re: else ifs werden übersprungen
 
Da hast du wohl Recht :) Aber für den Fall, dass man keine Build-Nummer benutzen will (oder die aus irgend einem Grund nicht konsequent hochzählt), wäre dann unser Vorschlag ebenfalls geeignet.

Sir Rufo 11. Sep 2007 23:19

Re: else ifs werden übersprungen
 
Hi,

diese Funktion liefert folgendes Ergebnis:

V1 < V2 -> -1
V1 = V2 -> 0
V1 > V2 -> 1

und zwar immer wenn die einzelnen Versions-Zahlen nicht größer sind, als in ein integer passt.
Wer es grösser mag und braucht, kann ja auch int64 nehmen.

Die Funktion stammt aus einem Projekt von mir, wo ich in einem VirtualStringTree u.a. nach Versions-Nummern sortieren lassen will.
Klappt übrigens auch hervorragend mit IP-Adressen (verwende ich in dem geleichen Projekt auch dafür) :wink:

cu

Oliver

Delphi-Quellcode:
function VersionCompareStr(const V1, V2 : string) : integer;
var
  tvSL,
  cvSL : TStrings;
  i    : integer;
  equal : boolean;
  tV1, tV2 : string;
begin
  tvSL := TStringList.Create;
  cvSL := TStringList.Create;
  try
    tV1 := V1;
    tV2 := V2;
    tV1 := StringReplace( tV1, ',', '.', [ rfReplaceAll ] );
    tV2 := StringReplace( tV2, ',', '.', [ rfReplaceAll ] );

    tV1 := StringReplace( tV1, '_', '.', [ rfReplaceAll ] );
    tV2 := StringReplace( tV2, '_', '.', [ rfReplaceAll ] );

    tvSL.Delimiter := '.';
    cvSL.Delimiter := '.';
    tvSL.DelimitedText := tV1;
    cvSL.DelimitedText := tV2;


    while tvSL.Count < cvSL.Count
    do
      tvSL.Add( '0' );
    while cvSL.Count < tvSL.Count
    do
      cvSL.Add( '0' );
    i := 0;
    RESULT := 0;
    equal := true;
    while ( i < tvSL.Count ) and equal
    do begin
      equal := StrToIntDef( tvSL.Strings[ i ], 0 ) = StrToIntDef( cvSL.Strings[ i ], 0 );
      if not equal
      then
        if StrToIntDef( tvSL.Strings[ i ], 0 ) < StrToIntDef( cvSL.Strings[ i ], 0 )
        then
          RESULT := -1
        else
          RESULT := 1;
      Inc( i );
    end;

  finally
    FreeAndNil( tvSL );
    FreeAndNil( cvSL );
  end;
end;

shmia 12. Sep 2007 09:51

Re: else ifs werden übersprungen
 
Ich würde mal sagen die beste Lösung ist die von Dax:
Delphi-Quellcode:
funtion VersionID(Major, Minor, Release, Build: Word): Int64;
begin
  Result := Int64(Major) shl 48 or Int64(Minor) shl 32 or Release shl 16 or Build;
end;
Kurz, knackig und effizient.

xZise 12. Sep 2007 14:16

Re: else ifs werden übersprungen
 
Jap :) Mir fiel gestern noch auf, dass er auch bei gleichen Versionen zuschlägt.
Gibt es denn sozusagen ein int64 als vorzeichenlose Ganzzahl?
Und eine Frage zu Int64: ist das erste Bit ein Vorzeichenbit? (Also 63 Bits für die Zahl?) Oder ist "0" dass minimum? (also "- (MAX_INT64 / 2)?)

s-off 12. Sep 2007 14:19

Re: else ifs werden übersprungen
 
@xZise:

Hattest Du wirklich das Create vergessen? Deine Bildchen waren nicht ganz aussagekräftig - bin mir nicht sicher, ob Du Deinen Kopf wegen Dir, oder wegen mir an der Wand zerschmetterst :stupid:

xZise 12. Sep 2007 14:25

Re: else ifs werden übersprungen
 
Zitat:

Zitat von s-off
bin mir nicht sicher, ob Du Deinen Kopf wegen Dir, oder wegen mir an der Wand zerschmetterst :stupid:

Nein :) Es war kein Create drinne :wall: Es bezog sich eher auf mich als auf dich :stupid:

s-off 12. Sep 2007 14:28

Re: else ifs werden übersprungen
 
Na dann bin ich ja froh :wink: - danke für's Feedback :-D

shmia 12. Sep 2007 15:31

Re: else ifs werden übersprungen
 
Zitat:

Zitat von xZise
Gibt es denn sozusagen ein int64 als vorzeichenlose Ganzzahl?

Leider nicht. (Zumindest Delphi Version <= 5.0)
Zitat:

Zitat von xZise
Und eine Frage zu Int64: ist das erste Bit ein Vorzeichenbit? (Also 63 Bits für die Zahl?)

Ja.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr.
Seite 3 von 3     123   

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