AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi "Version Compare" / Major/Minorversion Vergleich

"Version Compare" / Major/Minorversion Vergleich

Ein Thema von slemke76 · begonnen am 1. Mär 2018 · letzter Beitrag vom 2. Mär 2018
Antwort Antwort
Seite 1 von 2  1 2   
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
136 Beiträge
 
#1

"Version Compare" / Major/Minorversion Vergleich

  Alt 1. Mär 2018, 20:39
Hallo zusammen,

ich möchte gerne sicher gehen, dass meine Anwendung (mindestens) gegen eine bestimmte Indy-Version compiliert ist - auch um versehntlich nicht auf die mitgelieferte Version "zurückzufallen".
Da gibt es die MajorVersion, MinorVersion, Release und Build Angabe in der IdVers.inc.

Unter PHP gibt es so eine prima Vergleichsfunktion: http://php.net/manual/de/function.version-compare.php
Gibt es etwas ähnliches unter Delphi?

Oder muss ich so etwas machen und in einer {$IF} Bedingung vergleichen?
(gsIdVersionMajor*1000*1000*1000)+(gsIdVersionMino r*1000*1000)+(gsIdVersionRelease*1000)+gsIdVersion Build => meinegewünschteversion

lg
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.609 Beiträge
 
Delphi 5 Professional
 
#2

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 1. Mär 2018, 22:46
Multiplikation hab ich früher auch mal benutzt. Später bin ich auf eine Funktion _VersionCompare() im AutoIt gestoßen, die zwar recht lang ist, aber der Code ist gut verständlich. Die Funktion bekommt zwei Parameter (die zu vergleichenden Versionen), die an den darin enthaltenen Punkten gesplittet werden. Verglichen werden dann einfach die Einzelteile, und ein Abbruch erfolgt, sobald eine Ungleichheit gefunden wurde. Die Funktion fällt auf Stringvergleich zurück, sollte das nötig sein (eine Stelle bzw. ein Parameter kein Ordinalwert).

Sowas sollte sich in Delphi analog umsetzen lassen. Bei Interesse einfach mal AutoIt runterladen (ZIP genügt), und einen Blick in Include\Misc.au3 werfen. Auch als Nicht-AutoItler sollte man sich im Code zurechtfinden.

Grüße
Dalai
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 04:59
Hier mal meine Lösung:


Delphi-Quellcode:
unit Unit10;

interface
uses
  System.Classes,System.SysUtils;

Type
  TVersion = record
    private
      fmajor,fminor,frelease,fbuild : Integer;
    public
      property Major:integer read fmajor write fmajor;
      property Minor:integer read fminor write fminor;
      property Release:integer read frelease write frelease;
      Property Build:integer read fbuild write fbuild;

      Procedure SetVersion(major,minor,release,build:integer);
      Procedure FromString(VersionStr:string);
      function isEqualTo(Versionstr:string):boolean;

  end;
implementation

procedure TVersion.FromString(VersionStr: string);
var
  str : TStrings;

begin
  str := TStringlist.Create;
  str.Delimiter := '.';
  str.DelimitedText := VersionStr;
  fmajor := StrToInt(str.Strings[0]);
  fminor := StrToInt(str.Strings[1]);
  frelease := StrToInt(str.strings[2]);
  fbuild := StrToInt(str.Strings[3]);
  str.Free;
end;

function TVersion.isEqualTo(Versionstr: string):boolean;
var
  str : TStrings;
  hlp : integer;
begin
  str := Tstringlist.Create;
  str.Delimiter := '.';
  str.DelimitedText := VersionStr;
  result := false;
  hlp := StrToInt(str.Strings[0]);
  if (hlp = fmajor) then
  begin
    hlp := StrToInt(str.Strings[1]);
    if (hlp = fminor) then
    begin
      hlp := StrToInt(str.Strings[2]);
      if (hlp = frelease) then
      begin
        hlp := StrToInt(str.Strings[3]);
        if (hlp = fbuild) then
          result := true;
      end;
    end;
  end;
  str.Free;
end;

procedure TVersion.SetVersion(major: Integer; minor: Integer; release: Integer; build: Integer);
begin
  fmajor := major;
  fminor := minor;
  frelease : release;
  fbuild := build;
end;
end.
Anwendung:

Delphi-Quellcode:
  :
  const cDesiredVersion = '10.12.13.1294';
  :
  var vers : TVersion;
  :
  begin
    vers.FromString(cDesiredVersion);
    if (vers.isEqualTo(gsIdVersion)) then
      //wenn die Version passt
    else
     //wenn die Version nicht passt
  end;
Das ganze funktioniert zur Laufzeit (also wenn das Programm schon compiliert wurde).

Um das compilieren mit einer falschen Version zu unterbinden musst du den Weg über $IF gehen.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
16.943 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 08:23
Bedenke das auch Versionnummern mit Buchstaben möglich sind.
Also 12.1.15b
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 09:41
Da hast du Recht. Die notwendigen Anpassungen sollten aber nicht wirklich das große Problem sein
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.972 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 11:04
Wäre es nicht ganz einfach, wenn man einach nur ein NaturalCompare, oder wie man das immer nennen mag, nutzt?
Also wo Zahlen wir Zahlen und nicht als Strings verglichen werden, so wie bei der Sortierung im Explorer.

Und schon ist es egal wieviele Punkte/Nummern oder ob Buchstaben.
Eventuell noch die Leerzeichen ignorieren, bzw. durch Punkte ersetzen und doppelte Punkte entfernen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 2. Mär 2018 um 11:07 Uhr)
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
136 Beiträge
 
#7

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 11:07
Hallo zusammen,

vielen Dank für die Anregungen - die Lösung aus dem AutoIT gefällt mir ab besten, da man nicht nur den exakten Vergleich sondern auch kleiner/größer machen könnte.

Ein Naturalcompare wird vermutlich bei diesem Beispiel nicht korrekt funktionieren: 10.6.2 gegen 10.10.2 - da wird die 10.10 als "älter" erkannt, da 1 vor 6 sortiert wird. Oder täusche ich mich jetzt?

Da ich derjenige bin, der das Program compiliert, möchte ich auch gerne die Meldung beim compilieren haben - eine Ausgabe zur Laufzeit (irgendwo in einer Unit, die man womöglich nicht jedesmal neu durchtestet) könnte man (= ich) übersehen

Ich habe es jetzt mehrere Lösungen, die ich nicht vorenthalten möchte:

Delphi-Quellcode:
{$i IdCompilerDefines.inc}

{$IFNDEF INDY100}
  {$MESSAGE Error 'This project must be compiled against Indy 10'}
{$ENDIF}
{$IFNDEF 10_6_2}
  {$MESSAGE Error 'This project must be compiled against Indy 10.6.2'}
{$ENDIF}
Wobei ich die Benennung von "10_6_2" unglücklich finde - "INDY10_6_2" wäre wohl besser gewesen, zumal folgende Bedingung nicht funktioniert: {$IF not Defined(INDY100) or not Defined(10_6_2)}

Das ganze macht natürlich nur einen exakten Vergleich - das ist etwas unglücklich, deswegen habe ich das anders gelöst - zuerst habe ich noch Multipliziert, aber dann bitweise verschoben und verknüpft - auch wenn nicht relevant bei heuten CPUs sicherlich die schnellste Lösung:

Delphi-Quellcode:
const
  {$i IdVers.inc}

  gsIdMinVersionMajor = 10;
  gsIdMinVersionMinor = 6;
  gsIdMinVersionRelease = 2;

  gsIdActualBitwise = ( gsIdVersionMajor shl 20) OR ( gsIdVersionMinor shl 10) OR gsIdVersionRelease;
  gsIdMinimumBitwise = ( gsIdMinVersionMajor shl 20 ) OR ( gsIdMinVersionMinor shl 10 ) OR gsIdMinVersionRelease;

{$IF not Declared(gsIdActualBitwise) or ( gsIdActualBitwise < gsIdMinimumBitwise )}
  {$MESSAGE Error 'Indy Version is too old.'}
{$IFEND}
Ich hoffe, es hilft irgendwann einmal jemanden

Grüße
Sebastian

Geändert von slemke76 ( 2. Mär 2018 um 11:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.972 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 11:15
Statt Integern vielleicht mit Floats?

major.minor
major.minorxyz

1.2.3.4

1.020304

Delphi-Referenz durchsuchenCompilerVersion
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
136 Beiträge
 
#9

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 11:30
Hallo,

kann nicht ganz folgen, stehe auf dem Schlauch Bekommt man das schöner hin?

Die Definition, die von den Indys zur Verfügung steht sieht so aus: https://github.com/graemeg/indy/blob...tem/IdVers.inc

Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.953 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 11:55
Delphi-Quellcode:
{$IF (gsIdVersionMajor <> 10) or (gsIdVersionMinor <> 6) or (gsIdVersionRelease <> 2) or (gsIdVersionBuild <> 0)}
{$MESSAGE Fatal 'Falsche Indy-Version!'}
{$ENDIF}
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf