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
slemke76

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

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 10: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 10:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#2

AW: "Version Compare" / Major/Minorversion Vergleich

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

major.minor
major.minorxyz

1.2.3.4

1.020304

Delphi-Referenz durchsuchenCompilerVersion
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
slemke76

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

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 10: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

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.687 Beiträge
 
Delphi 12 Athens
 
#4

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 10: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
slemke76

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

AW: "Version Compare" / Major/Minorversion Vergleich

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

Delphi-Quellcode:
{$IF (gsIdVersionMajor <> 10) or (gsIdVersionMinor <> 6) or (gsIdVersionRelease <> 2) or (gsIdVersionBuild <> 0)}
{$MESSAGE Fatal 'Falsche Indy-Version!'}
{$ENDIF}
Beim Update der Komponente auf eine neuere Version muss ich das anpassen, bei meiner Lösung nicht, da ist es ein Minimum- und kein Exaktes Requirement.

Grüße
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.687 Beiträge
 
Delphi 12 Athens
 
#6

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 11:38
Beim Update der Komponente auf eine neuere Version muss ich das anpassen, bei meiner Lösung nicht, da ist es ein Minimum- und kein Exaktes Requirement.
Das mit dem "mindestens" hatte ich übersehen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#7

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 12:18
{$IF (gsIdVersionMajor > 10) or ((gsIdVersionMajor = 10) and (gsIdVersionMinor > 6)) or ((gsIdVersionMajor = 10) and (gsIdVersionMinor = 6) and (gsIdVersionRelease > 2)) or ((gsIdVersionMajor = 10) and (gsIdVersionMinor = 6) and (gsIdVersionRelease = 2) and (gsIdVersionBuild >= 0))}

Nja, es gibt mehrere Varianten für das Gleiche.
Delphi-Quellcode:
gsIdVersion = '10.06.02.01'; // 00-09 mit führender 0 oder Leerzeichen, aber besser die 0
{$IF gsIdVersion >= '10.02.00.00'}
{$IF gsIdVersion >= '10.00.00.00'}

gsIdVersion = 10060201;
{$IF gsIdVersion >= 10020000}
{$IF gsIdVersion >= 10000000}

gsIdVersion = 10.060201;
{$IF gsIdVersion >= 10.02}
{$IF gsIdVersion >= 10}
Meistens interessieren Einen nur die erste oder die ersten beiden Stellen (Major und Minor),
da ist dann das Letztere halt einfacher/verständlicher.

Nachteil bei all diesen Dingen: Die subversionen dürfen nur Werte von 0 bis 99 haben.
Bei String darfs der Major auch nur 0 bis 99, aber dei den Numerischen kann es auch größer/kleiner sein.
Ein Therapeut entspricht 1024 Gigapeut.

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

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

AW: "Version Compare" / Major/Minorversion Vergleich

  Alt 2. Mär 2018, 12:23
Hallo,

Das mit dem "mindestens" hatte ich übersehen.
Alles gut, ich freue mich über das viele Feedback

@himitsu:
Ich sehe das tatsächlich in diesem Falle nicht ganz, die Definition von gsIdVersion kommt aus den Indys, da habe ich keinen Einfluss drauf:

gsIdVersion = '10.6.2.0'; {do not localize} und da fehlen bei der Minorversion und dem Release die führende "0".

Grüße,
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort

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 20:05 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