Delphi-PRAXiS
Seite 2 von 3     12 3      

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 18:27

Re: else ifs werden übersprungen
 
Zitat:

Zitat von xZise
Der sinn eines Updates ist es aber nicht, die gleiche Version nochmal zu downloaden ;)
Und bei einer langen Kette funktioniert das auch nicht ;)

Damit sprach ich auch den von die vermuteten Bug im Delphi-Debugger an...

Wie du um die Teilabfragen herumkommst: Berechne eine Versions-ID so:
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;
Wenn du diese IDs vergleicht, hast du alles, was du über die else-ifs ausdrücken wolltest, implizit dabei.

shmia 11. Sep 2007 18:35

Re: else ifs werden übersprungen
 
Das Kernproblem lässt sich auch auf einen Integervergleich reduzieren:
Delphi-Quellcode:
function MakeVersion(major, minor, release, build:byte):Cardinal;
begin
   result := (major shl 24) or (minor shl 16) or (release shl 8) or build;
end;
if MakeVersion(ReadInteger('Version', 'Major', 0), ....) > MakeVersion(Major, Minor, ...) then
   Avaiable;
Kein Teil darf dann über 255 hinausgehen. (Aber Versionen wie 3.260.70.577 sind ja eher selten)
Sollte dies ein Problem sein, dann macht man eben einen Fliesskommazahlvergleich:
Delphi-Quellcode:
function MakeVersion(major, minor, release, build:integer):Double;
begin
   result := (((major * 10000.0) + minor) * 10000.0 +release)*10000.0 + build;
end;

ringli 11. Sep 2007 18:43

Re: else ifs werden übersprungen
 
Sory, hatte in meinem Beitrag eine dazugehörige Prozedur vergessen. Habe den Beitrag nochmal editiert.

xZise 11. Sep 2007 21:37

Re: else ifs werden übersprungen
 
Zitat:

Zitat von s-off
Zitat:

Zitat von xZise
Oder wirft er vielleicht eine Exception?

Ja, und zwar deshalb, weil Du nur
Delphi-Quellcode:
with TIniFile(ExtractFilePath(ParamStr(0)) + 'info.ini') do
schreibst, es aber
Delphi-Quellcode:
with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'info.ini') do
sein müsste; das 'Create' fehlt.

:wall: :stupid:

Zitat:

Zitat von shmia
Das Kernproblem lässt sich auch auf einen Integervergleich reduzieren:
Delphi-Quellcode:
function MakeVersion(major, minor, release, build:byte):Cardinal;
begin
   result := (major shl 24) or (minor shl 16) or (release shl 8) or build;
end;
if MakeVersion(ReadInteger('Version', 'Major', 0), ....) > MakeVersion(Major, Minor, ...) then
   Avaiable;

Und was bringt mir ein solcher Vergleich? (Auch an Dax)

Ich habe das so gemacht:
Delphi-Quellcode:
if (ReadInteger('Version', 'Major', 0) >= Major) and (ReadInteger('Version', 'Minor', 0) >= Minor) and (ReadInteger('Version', 'Release', 0) >= Release) and (ReadInteger('Version', 'Build', 0) > Build) then

Hawkeye219 11. Sep 2007 21:55

Re: else ifs werden übersprungen
 
Hallo Fabian,

angenommen, ich arbeite mit Version 1.0.0.42, und die .ini-Datei kündigt Version 2.0.0.0 an. Mit deinem Code aus Beitrag #1 erhalte ich ein Update, mit deinem neuen Code aus Beitrag #14 nicht mehr. Und das nur, weil die Build-Nummer der neuen Version nicht hoch genug ist...

Gruß Hawkeye

Dax 11. Sep 2007 22:14

Re: else ifs werden übersprungen
 
Zitat:

Zitat von xZise
Und was bringt mir ein solcher Vergleich? (Auch an Dax)

Durch die Umwandlung der verschiedenen Versionszahlen in einen Integer erreichst du genau das, was du willst: ein Vergleich VerA > VerB ergibt nur dann true wenn [u]mindestens eine[b] Versionszahl von VerB größer ist als die entsprechende Versionszahl aus VerA. Das ist einfache Arithmetik ;) Der Grund dafür ist simpel: du hast vier Zahlen A, B, C und D, die man als Werte der ersten, zweiten, ... Position eines Stellenwertsystems S1 ansehen kann. Durch die von uns vorgeschlagene Umwandlung der vier Zahlen in eine einzige transferierst du diese Zahlen A, B, C, D in ein anderes Stellenwertsystem S2, dass diesmal pro Stelle *mehr* Informationen enthalten kann. Da S1 und S2 wohlgeordnet sind, gelingt dieser Vergleich immer.

Oder anders gesagt: weil 10A + B > 10C + D das selbe ist wie (A > B and C >= D) or (A >= B and C > D) - was sich auf beliebig viele Stellen erweitern lässt ;)

Edit: unter der Vorraussetzung, dass A, B, C, D die eigenen Versionszahlen sind und E, F, G, H die auf dem Server, könnte dein Vergleich auch einfach not (A <= E and B <= F and C <= G and D <= H) sein.

xZise 11. Sep 2007 22:19

Re: else ifs werden übersprungen
 
Hi Hawkeye219 :)
Mist ^^ ich habe beim letzten Vergleich das = vergessen :) OOPs


Zitat:

Zitat von Dax
Zitat:

Zitat von xZise
Und was bringt mir ein solcher Vergleich? (Auch an Dax)

Durch die Umwandlung der verschiedenen Versionszahlen in einen Integer erreichst du genau das, was du willst: ein Vergleich VerA > VerB ergibt nur dann true wenn [u]mindestens eine[b] Versionszahl von VerB größer ist als die entsprechende Versionszahl aus VerA. Das ist einfache Arithmetik ;) Der Grund dafür ist simpel: du hast vier Zahlen A, B, C und D, die man als Werte der ersten, zweiten, ... Position eines Stellenwertsystems S1 ansehen kann. Durch die von uns vorgeschlagene Umwandlung der vier Zahlen in eine einzige transferierst du diese Zahlen A, B, C, D in ein anderes Stellenwertsystem S2, dass diesmal pro Stelle *mehr* Informationen enthalten kann. Da S1 und S2 wohlgeordnet sind, gelingt dieser Vergleich immer.

Oder anders gesagt: weil 10A + B &gt; 10C + D das selbe ist wie (A &gt; B and C &gt;= D) or (A &gt;= B and C &gt; D) - was sich auf beliebig viele Stellen erweitern lässt ;)

Edit: unter der Vorraussetzung, dass A, B, C, D die eigenen Versionszahlen sind und E, F, G, H die auf dem Server, könnte dein Vergleich auch einfach not (A <= E and B &lt;= F and C &lt;= G and D &lt;= H) sein.

Ich weiß ;) Aber wo liegt der Vorteil gegenüber den oben genannten Code (#14)?

Dax 11. Sep 2007 22:24

Re: else ifs werden übersprungen
 
Oben genannter Code enthält Fehler, obwohl er auf den ersten Blick richtig erscheinen mag - unser Code enthält keine Fehler, weil es gegen die Axiome der Mathematik verstieße ;)

shmias Code ist aber, zugegebenermaßen, fehleranfällig als der, den ich gepostet habe, gerade weil Build-Zahlen manchmal schon über die Byte-Grenze hinauswachen.

grenzgaenger 11. Sep 2007 22:34

Re: else ifs werden übersprungen
 
entweder du machst 'n INT vergleich wie DAX und shmia sagten, oder du hängst 'ne build Nr. hinten an, welche über deine versionen ständig heraufgezählt wird und frägst auf diese ab... projekt -- >optionen --> versionsinfo --> buildnummer
dann sieht deine versionsnummer so aus 1.5.2.368 und die nächst version z.b. so 2.1.13.428

in deiner ersten version, haste auf alle fälle den >= vergleich vergessen...

grüsse und noch viel erfolg

grenzgaenger 11. Sep 2007 22:36

Re: else ifs werden übersprungen
 
Zitat:

Zitat von Dax
shmias Code ist aber, zugegebenermaßen, fehleranfällig als der, den ich gepostet habe, gerade weil Build-Zahlen manchmal schon über die Byte-Grenze hinauswachen.

wohl eher häufig, aber was spricht dagegen, die build nummer als in zu implementieren? ca. 2 Mrd. builds, dürften für den otto normal programmierer genügen ;-) und die reicht ja in aller regel aus, um eine neue version eindeutig zu identifizieren ... :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Seite 2 von 3     12 3      

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