Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿como hago para comprobar si un nº de versión es mayor o menor? (https://www.clubdelphi.com/foros/showthread.php?t=65897)

cocute 20-01-2010 17:48:48

¿como hago para comprobar si un nº de versión es mayor o menor que otro?
 
pues eso,
partiendo de que ya tengo extraida la versión del ejecutable en un string,
como hago para comprobar por ejemplo que una versión de un programa
1.0.0.11 es mayor que otra con valor 1.0.0.9 ¿?
y si puede ser complicandolo lo menos posible.

comparandolos como strings no sirve ya que "1.0.0.9" es mayor que "1.0.0.11" al estar el 9 en primera posicion.

gracias

rgstuamigo 20-01-2010 18:09:28

Asi:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var v1,v2:Integer;
begin
v1:=StrToInt(StringReplace(Edit1.Text,'.','',[rfReplaceAll]));{reeplazo los puntos(.) por Vacio ('') y 
convierto el string resultante en Integer ;) } 

v2:=StrToInt(StringReplace(Edit2.Text,'.','',[rfReplaceAll]));// Igual aqui
 if (v1 > v2) then
  ShowMessage('La mayor version es : '+Edit1.Text)
else if (v1 < v2)  then
     ShowMessage('La mayor version es : '+Edit2.Text)
     else ShowMessage('Son Iguales');
end;
Saludos...:)

delphi.com.ar 20-01-2010 18:20:51

Cita:

Empezado por rgstuamigo (Mensaje 351276)
Asi:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var v1,v2:Integer;
begin
v1:=StrToInt(StringReplace(Edit1.Text,'.','',[rfReplaceAll]));{reeplazo los puntos(.) por Vacio ('') y 
convierto el string resultante en Integer ;) } 

v2:=StrToInt(StringReplace(Edit2.Text,'.','',[rfReplaceAll]));// Igual aqui
 if (v1 > v2) then
  ShowMessage(Edit1.Text)
else if (v1 < v2)  then
     ShowMessage(Edit2.Text)
     else ShowMessage('Son Iguales');
end;
Saludos...:)

Mmmmm.. si compraras las versiones "1.1.0.10" contra "10.0.0.0" te dirá que la primera es mayor.

Si ya tienes armado el string, simplemente tienes que descomponerlo en números separándolo por los puntos y comparar parte a parte, mientras sean iguales de izquierda a derecha, en cuanto un valor es superior al otro, ya tienes identificado cual es la versión mayor.

Pero pregunto... este valor lo estas obteniendo con la winapi GetFileVersionInfo?... porque de ser así puedes comparar directamente los resultados de la misma.

Saludos!

cocute 20-01-2010 18:26:29

Cita:

Empezado por delphi.com.ar (Mensaje 351278)
Mmmmm.. si compraras las versiones "1.1.0.10" contra "10.0.0.0" te dirá que la primera es mayor.

Si ya tienes armado el string, simplemente tienes que descomponerlo en números separándolo por los puntos y comparar parte a parte, mientras sean iguales de izquierda a derecha, en cuanto un valor es superior al otro, ya tienes identificado cual es la versión mayor.

Pero pregunto... este valor lo estas obteniendo con la winapi GetFileVersionInfo?... porque de ser así puedes comparar directamente los resultados de la misma.

Saludos!

Gracias, pensaba que habria algún modo mas simple de hacerlo,

uso esta función para extraer la versión:
Código Delphi [-]
function VersionExe(const ruta: string) : string;
var
  Pt, Pt2: Pointer;
  Size, Size2: DWord;
begin
  Result := '';
  if not FileExists(ruta) then Exit;
  Size := GetFileVersionInfoSize(PChar(ruta), Size2);
  if (Size > 0) then begin
    GetMem(Pt, Size);
    try
      GetFileVersionInfo(PChar(ruta), 0, Size, Pt);
      VerQueryValue (Pt, '\', Pt2, Size2);
      with TVSFixedFileInfo (Pt2^) do begin
        Result :=
        IntToStr(HiWord(dwFileVersionMS))+'.'+
        IntToStr(LoWord(dwFileVersionMS))+'.'+
        IntToStr(HiWord(dwFileVersionLS))+'.'+
        IntToStr(LoWord(dwFileVersionLS));
      end;
    finally
      FreeMem(Pt);
    end;
  end;
end;


para rgstuamigo, gracias pero como bien dice delphi.com.ar eso es lo mismo que hacer un simple:
if Edit1.Text > edit2.text then ShowMessage('La mayor version es : '+Edit1.Text);
if Edit1.Text < edit2.text then ShowMessage('La mayor version es : '+Edit2.Text)
else ShowMessage('Son iguales');
ya que no hace falta pasarlos a int ni quitar los puntos para comprobar eso, pero no es correcto.

rgstuamigo 20-01-2010 18:30:53

Cita:

Empezado por delphi.com.ar (Mensaje 351278)
Mmmmm.. si compraras las versiones "1.1.0.10" contra "10.0.0.0" te dirá que la primera es mayor.

Si ya tienes armado el string, simplemente tienes que descomponerlo en números separándolo por los puntos y comparar parte a parte, mientras sean iguales de izquierda a derecha, en cuanto un valor es superior al otro, ya tienes identificado cual es la versión mayor.

Pero pregunto... este valor lo estas obteniendo con la winapi GetFileVersionInfo?... porque de ser así puedes comparar directamente los resultados de la misma.

Saludos!

Pues si :o... Federico...tienes toda la razon...me parece que no tomé en cuenta eso.:rolleyes::eek::D.
Saludos...:)

delphi.com.ar 20-01-2010 19:00:51

Ok!.. fíjate que internamente la función VersionExe utiliza la winapi GetFileVersionInfo a la cual hice referencia. También terminas obteniendo un registro del tipo TVSFixedFileInfo con dos valores que luego descompones en cuatro. Yo lo que digo es utilizar esos dos valores sin pasarlos a string, es algo mucho mas óptimo ya que se trata de únicamente dos evaluaciones aritméticas por cada comparación.

Hice esto, está sin probar:

Código Delphi [-]
function GetFileInfo(AFileName: PChar): TVSFixedFileInfo;
var
  dwSize, dwSize2: DWORD;
  lpData, lpData2: Pointer;
begin
  ZeroMemory(@Result, SizeOf(TVSFixedFileInfo));
  if FileExists(AFileName) then
  begin
    dwSize := GetFileVersionInfoSize(AFileName, dwSize2);
    if dwSize > 0 then
    begin
      GetMem(lpData, dwSize);
      try
        GetFileVersionInfo(AFileName, 0, dwSize, lpData);
        VerQueryValue(lpData, '\', lpData2, dwSize2);
        Move(lpData2^, Result, dwSize2);
      finally
        FreeMem(lpData);
      end;
    end;
  end;
end;


function GetFileVersion(AFileName: string): string;
begin
  with GetFileInfo(PChar(AFileName)) do
    Result:= Format('%d.%d.%d.%d', [HiWord(dwFileVersionMS),
                                    LoWord(dwFileVersionMS),
                                    HiWord(dwFileVersionLS),
                                    LoWord(dwFileVersionLS)] );
end;

function CompareFileVersions(AFileName1, AFileName2: string): Integer;
var
  FileInfo1, FileInfo2: TVSFixedFileInfo;
begin
  FileInfo1 := GetFileInfo(PChar(AFileName1));
  FileInfo2 := GetFileInfo(PChar(AFileName2));

  Result := CompareValue(FileInfo1.dwFileVersionMS, FileInfo2.dwFileVersionMS);

  if Result = 0 then
    Result := CompareValue(FileInfo1.dwFileVersionLS, FileInfo2.dwFileVersionLS);
end;

Saludos!

cocute 20-01-2010 19:30:02

muchas gracias por tu interes lo intentare probar y adaptar,
el problema es que uno de los dos valores lo saco de un fichero de texto que descargo de una web, osea no quiero comparar dos ficheros locales, si no la version del ejecutable en curso con un string con el contenido de la ultima version. No se si con esto seria mas sencillo o mas complicado.
Pero la verdad es que no pensaba liarme tanto.

Al final igual me creo un valor de versión simple que vaya aumentando sin más, sin puntos ni historias y sin tener en cuenta la version real que marca el ejecutable y me olvido de complicaciones.

delphi.com.ar 20-01-2010 19:52:56

Pero no es tan complicado, simplemente tendrías que escribir algo que haga esto:
Cita:

Empezado por delphi.com.ar (Mensaje 351278)
Si ya tienes armado el string, simplemente tienes que descomponerlo en números separándolo por los puntos y comparar parte a parte, mientras sean iguales de izquierda a derecha, en cuanto un valor es superior al otro, ya tienes identificado cual es la versión mayor.

No es mas que un poco de manejo de strings!.. no me digas que no te animas!

PD: He corregido el código que había subido, pq había un error en la comparación.

Saludos!

cocute 21-01-2010 11:31:13

Ya que has insistido al final me he animado a hacerlo, pero he preferido no aprovechar los datos descompuestos de GetFileVersion, ya que tengo que usar una funcion para descomponer un valor prefiero sacar el valor de version con la función que he puesto mas arriba y luego descomponerlos los dos valores, ya que asi creo que es menos codigo .
Os pongo el código que he usado por si algún dia alguno la utilizais, creo que esta bién, tengo que probarlo mejor a ver:

Función para descomponer una cadena con 4 valores separados por 3 puntos:
Código Delphi [-]
function Descompone(cadena: string; var cadena1, cadena2,cadena3,cadena4: string):string;
var i, j:integer;
begin
j:=1;
i:=pos('.', cadena);
cadena1:=copy(cadena, j, i-j);
j:=i+1;
i:=PosEx('.', cadena, j);
cadena2:=copy(cadena, j, i-j);
j:=i+1;
i:=PosEx('.', cadena, j);
cadena3:=copy(cadena, j, i-j);
j:=i+1;
i:=length(cadena);
cadena4:=copy(cadena, j, i);
end;

Función para comprobar que versión es mayor:
(devuelve 0 si son iguales, 1 si version1 es mayor y 2 si version2 es mayor)
Código Delphi [-]
function cualesmayor(version1,version2:string):integer;
var cad1, cad2, cad3,cad4,cod1,cod2,cod3,cod4:string;
m:Integer;
begin
Descompone(version1, cad1,cad2,cad3,cad4);
Descompone(version2, cod1,cod2,cod3,cod4);
m:=2;
if cad1>cod1 then m:=1;
 if cad1=cod1 then
  begin
    if cad2>cod2 then m:=1;
    if cad2=cod2 then
      begin
       if cad3>cod3 then m:=1;
       if cad3=cod3 then
         begin
          if cad4>cod4 then m:=1;
          if cad4=cod4 then
           begin
            m:=0;
           end;
         end;
      end;
  end;
 Result:=m;
end;

Para usarlo partiendo de dos edits y un botón:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var t:Integer;
begin
t:=cualesmayor(Edit1.Text,Edit2.text);
if t=0 then ShowMessage('son iguales');
if t=1 then ShowMessage('Edit1 es mayor');
if t=2 then ShowMessage('Edit2 es mayor');
end;


La franja horaria es GMT +2. Ahora son las 20:17:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi