Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Programmversionen vergleichen + Update (https://www.delphipraxis.net/188134-programmversionen-vergleichen-update.html)

Freyr77 3. Feb 2016 12:38

Delphi-Version: 5

Programmversionen vergleichen + Update
 
Moin.

Es geht diesmal nicht um mein Projekt. Es geht darum das bei start eines Programmes überprüft werden soll, ob ein externes Programm eine aktuelle Version aus Kompatibilitätsgründen hat. Dafür habe ich einen TaskDialog geschrieben, der sich nur starten soll wenn die aktuelle Programmversion älter ist als die unterstützte.

Das herausfinden der aktuell installierten Version ist schon möglich, dafür gibt es einen Befehl. Wenn ich ihm jetz sage er soll den Dialog nur öffnen, wenn die aktuell installierte Version vorhanden ist, funktioniert das.

Jetzt muss ich die aktuelle Version aber irgendwie vergleichen (z.B. Aktuelle Version < 2.2.2). Wie mache ich das am besten, um irgendwelchen Fehlern vorzubeugen? Und wie verbinde ich den klick auf den Button im Taskdialog dann so, dass das Update automatisch vorgenommen wird?

Sir Rufo 3. Feb 2016 12:46

AW: Programmversionen vergleichen + Update
 
Nun ja, du musst 4 Zahlen vom Typ
Delphi-Quellcode:
DWORD
vergleichen.

Den String 2.2.2 zerlegst am Punkt du in max. 4 Teile und wandelst dann die Teilstrings in ein
Delphi-Quellcode:
DWORD
um.
Code:
Major  = 2
Minor  = 2
Release = 2
Build  = 0
Diese kannst du dann vergleichen.

Ich würde dafür einen Record nehmen, der dann den Vergleich und auch die Konvertierungen (String -> Version -> String) intern vornimmt.

Das Wie steht da http://www.delphi-treff.de/tutorials...on-operatoren/

baumina 3. Feb 2016 12:47

AW: Programmversionen vergleichen + Update
 
EDIT : ** Moment, da hab ich was falsches kopiert **

Das hier ist das was ich kopieren wollte, das wandelt den Versionsstring (z.B. '4.2.3') in einen Int64 um, den man dann für den Versionsvergleich verwenden kann:

Delphi-Quellcode:
function VersionNumberFromString (s: string): Int64;
var
  ErrPos : Integer;
  Index : Integer;
  Parts : packed array [0..3] of Word;

begin
  FillChar(Parts, SizeOf(Parts), 0);
  for Index := 3 downto 0 do
  begin
    Val (s, Parts[Index], ErrPos);
    if (ErrPos = 0) then Break;
    Delete (s, 1, ErrPos);
  end;
  Result := Int64(Parts);
end;

Sir Rufo 3. Feb 2016 12:49

AW: Programmversionen vergleichen + Update
 
Zitat:

Zitat von baumina (Beitrag 1329237)
Delphi-Quellcode:
If '4.3.2' < ApplicationVersion then
begin
  // alte Version
end;

Ein String-Vergleich ist da nicht ratsam
Delphi-Quellcode:
if '8.0.0' < '9.0.0' then
begin
  // alte Version
end;

// und jetzt???

If '10.0.0' < '9.0.0' then
begin
  // alte Version
end;

// und jetzt???

if '9.11.4' < '9.5.7' then
begin
  // alte Version
end;

baumina 3. Feb 2016 13:00

AW: Programmversionen vergleichen + Update
 
Sry, Rufo, hast recht, siehe EDIT oben.

Sir Rufo 3. Feb 2016 13:24

AW: Programmversionen vergleichen + Update
 
Ja das passt schon eher.

Ich würde - wie schon gesagt - einen Record deklarieren und den alles machen lassen.
Delphi-Quellcode:
var
  lCurrent, lRemote: TVersion;
begin
  lCurrent := '7.3.5';
  lRemote := '7.11.3';
  if lCurrent < lRemote then
  begin
    // Update durchführen
  end;
end;
Das ist einmal gemacht, kann man aber immer wieder verwenden und es ist eindeutig, dass es sich hier um eine Versions-Information handelt.

Freyr77 4. Feb 2016 13:54

AW: Programmversionen vergleichen + Update
 
Danke!

Aber wie hole ich mir dann die Daten aus "GetVersion" heraus, um die auch zu zerlegen?:|

baumina 4. Feb 2016 14:03

AW: Programmversionen vergleichen + Update
 
Delphi-Quellcode:
function ApplicationVersion: String;
var
  VerInfoSize, Dummy: DWord;
  VerInfo: Pointer;
  VerValueSize: DWord;
  VerValue: PVSFixedFileInfo;

begin
  VerInfoSize:=GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  If VerInfoSize<>0 then
  begin
    GetMem(VerInfo, VerInfoSize);
    GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
    VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
    with VerValue^ do
    begin
      Result:=IntTostr(dwFileVersionMS shr 16);
      Result:=Result+'.'+IntTostr(dwFileVersionMS and $FFFF);
      Result:=Result+'.'+IntTostr(dwFileVersionLS shr 16);
//      Result:=Result+'.'+IntTostr(dwFileVersionLS and $FFFF);
    end;
    FreeMem(VerInfo, VerInfoSize);
  end
  else
    Result:='Version Inconnue';
end;

himitsu 4. Feb 2016 14:25

AW: Programmversionen vergleichen + Update
 
Man kann als String vergleichen ... muß dann aber die Zahlen normieren.

z.B. jede der 4 Zahlen mit 5 Dezimalstellen und nach links mit 0 aufgefüllt.
Das sind jeweils ein Word, also maximal 5 Dezimalstellen und da die höherwertigsten Versions-Anteile auch links stehen. :angle:

Memnarch 4. Feb 2016 14:43

AW: Programmversionen vergleichen + Update
 
Zitat:

Zitat von Sir Rufo (Beitrag 1329235)
[...]2.2.2 zerlegst am Punkt du in max. 4 Teile[...]

Noch nie Blizzard-Patchversionen gesehen oder :D?
Produktversionen einer Datei können beliebig lang sein. Ich wär also vorsichtig! (ja ok es gebt um die Fileversion, trotzdem ;) )

Für unser Produkt habe ich soetwas auch schonmal geschrieben. Ich generiere einfach aus einem string einen array of DWord und vergleiche dann zwei arrays. Das nagelt einen nicht auf die Elementanzahl fest und es lässt sich somit Vielseitiger verwenden


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.
Seite 1 von 2  1 2      

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