![]() |
else ifs werden übersprungen
Ich habe folgene Konstruktion:
Delphi-Quellcode:
Meine Frage an euch: Was würdet ihr sagen:
if (ReadInteger('Version', 'Major', 0) > Major) then
Avaiable else if (ReadInteger('Version', 'Minor', 0) > Minor) then Avaiable else if (ReadInteger('Version', 'Release', 0) > Release) then Avaiable else if (ReadInteger('Version', 'Build', 0) > Build) then Avaiable; Wenn ich Version in der Ini-Datei "1.5.2.1" ist, und die andere Version (die Variablen) "1.5.1.0". Sollte er ein "Avaible" ausführen? Meinermeinung nach im Vergleich der "Releases" oder nicht? Aber Delphi (im Debugmodus) springt vom 1. Vergleich an das Ende der Vergleiche => keine Meldung => Bug ?! Oder ich unterschätze die Wirkungsweise des "else-ifs"? PS: Hier der Kontext:
Delphi-Quellcode:
procedure TfrmUpdate.Button1Click(Sender: TObject);
procedure Avaiable; begin MessageBox(Handle, PChar('A new version is avaiable'), PChar('Update possible'), MB_OK or MB_ICONINFORMATION); end; var fs : TFileStream; Major, Minor, Release, Build: Integer; ini : TIniFile; begin fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'info.ini', fmCreate); try ihDownload.Get(infoUrl, fs); finally FreeAndNil(fs); end; GetVersion(ParamStr(0), Major, Minor, Release, Build); with TIniFile(ExtractFilePath(ParamStr(0)) + 'info.ini') do try // START VON OBEN if (ReadInteger('Version', 'Major', 0) > Major) then Avaiable else if (ReadInteger('Version', 'Minor', 0) > Minor) then Avaiable else if (ReadInteger('Version', 'Release', 0) > Release) then Avaiable else if (ReadInteger('Version', 'Build', 0) > Build) then Avaiable; // ENDE VON OBEN finally Free; end; end; |
Re: else ifs werden übersprungen
Mach mal spasseshalber aus den > ein paar >=.
Edit: alternativ könntest du deine Vergleiche auch verketten, statt eine lange if-Liste zu benutzen... |
Re: else ifs werden übersprungen
Zitat:
Da wäre es interessant, zu sehen, was wirklich in Deiner Ini-Datei bzw. Deiner Variablen steht. |
Re: else ifs werden übersprungen
Zitat:
Und bei einer langen Kette funktioniert das auch nicht ;) Oder wie hättest du sie verkettet? Zitat:
Also: ![]() Und in den Variablen stehen die korrekten Werte. Oder wirft er vielleicht eine Exception? [edit]Moment ;) Das würde die AV erklären ^^ Aber warum macht er dass :([/edit] Zitat:
|
Re: else ifs werden übersprungen
Also nicht das es wirklich wichtig wäre, aber müsste die Prozedur nicht "available" benannt werden :stupid:
|
Re: else ifs werden übersprungen
ohh.. -.- einfach ignorieren...
|
Re: else ifs werden übersprungen
Habe das bei mir mal so gelöst, das geht garantiert (bei dir kanns evtl probleme geben, wenn major kleiner ist und dann nur der Release größer oder so...)
Delphi-Quellcode:
mfG
function CompareValues(v1, v2: Integer): Integer;
begin if v1 = v2 then Result := 0 else if v1 > v2 then Result := -1 else Result := 1; end; //////////////////////// Result := CompareValues(OriginalMajor, RemoteMajor); if Result = 0 then begin Result := CompareValues(OriginalMinor, RemoteMinor); if Result = 0 then begin Result := CompareValues(OriginalRelease, RemoteRelease); if Result = 0 then Result := CompareValues(OriginalBuild, RemoteBuild); end; end; mirage228 |
Re: else ifs werden übersprungen
Bei einer Verkettung:
Delphi-Quellcode:
Hast du das Problem bei der Version "1.0.0.0" gegenüber "0.0.0.1". Wenn die 1. die zu updatende Datei ist wird er sagen, dass die 2. Version neuer ist (da 1 > 0 :stupid: )
(NewMajor > Major) or .... or (NewBuild > Build)
Hmmm... bei meiner ist auch ein Bug drinne :( Zitat:
Ah jetzt ^^ Wenn man beides einsetzt und als Operator "and" nimmt: Zitat:
|
Re: else ifs werden übersprungen
Ich stand letztens vor dem selben Problem und habe es so gelöst:
Delphi-Quellcode:
[EDIT]
procedure VersionStrToInt(Version : String;
var Major, Minor, Release, Build : Integer); var Len : Integer; // Länge der gesamten Versionsinfo p1, p2, p3 : Integer; // Position der einzelnen Punkte begin // Länge des Versionsstrings ermitteln Len := Length(Version); //Position der einzelnen Punkte ermitteln p1 := PosEx('.', Version, 1); p2 := PosEx('.', Version, p1 + 1); p3 := PosEx('.', Version, p2 + 1); // Die einzelnen Strings in Zahlen umwandeln Major := StrToIntDef(Copy(Version, 1, p1 - 1 ), 0); Minor := StrToIntDef(Copy(Version, p1 + 1, p2 - p1 - 1), 0); Release := StrToIntDef(Copy(Version, p2 + 1, p3 - p2 - 1), 0); Build := StrToIntDef(Copy(Version, p3 + 1, Len ), 0); end; . . . // Versionsinformationen der installierten Version ermitteln VersionStrToInt(GetVersion, MajorAct, MinorAct, ReleaseAct, BuildAct); VersionAct := StrToIntDef(Format(FormatString, [MajorAct, MinorAct, ReleaseAct, BuildAct]), 0); // Versionsinformation der Version auf dem Server ermitteln VersionStrToInt(VER, MajorSrv, MinorSrv, ReleaseSrv, BuildSrv); VersionSrv := StrToIntDef(Format(FormatString, [MajorSrv, MinorSrv, ReleaseSrv, BuildSrv]), 0); // Meldung wenn Version auf Server aktueller if VersionSrv > VersionAct then begin end; Sorry hatte vergessen eine dazugehörige Prozedur zu posten... :oops: |
Re: else ifs werden übersprungen
Zitat:
Delphi-Quellcode:
schreibst, es aber
with TIniFile(ExtractFilePath(ParamStr(0)) + 'info.ini') do
Delphi-Quellcode:
sein müsste; das 'Create' fehlt.
with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'info.ini') do
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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