Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-01-2010
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
¿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

Última edición por cocute fecha: 21-01-2010 a las 12:08:12.
Responder Con Cita
  #2  
Antiguo 20-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

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...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 20-01-2010 a las 18:19:53.
Responder Con Cita
  #3  
Antiguo 20-01-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por rgstuamigo Ver Mensaje
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 20-01-2010
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
Cita:
Empezado por delphi.com.ar Ver Mensaje
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.

Última edición por cocute fecha: 20-01-2010 a las 18:35:53.
Responder Con Cita
  #5  
Antiguo 20-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por delphi.com.ar Ver Mensaje
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 ... Federico...tienes toda la razon...me parece que no tomé en cuenta eso..
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #6  
Antiguo 20-01-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 20-01-2010 a las 19:41:31. Razón: Correciones en la redacción
Responder Con Cita
  #7  
Antiguo 20-01-2010
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 20-01-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Pero no es tan complicado, simplemente tendrías que escribir algo que haga esto:
Cita:
Empezado por delphi.com.ar Ver Mensaje
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #9  
Antiguo 21-01-2010
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
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;

Última edición por cocute fecha: 21-01-2010 a las 12:22:22.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Fecha de mayor a menor alcides Varios 2 15-02-2008 16:46:09
Que versión de php necesito para que funcione en mi server lo que hago el Delphi4php cooper PHP 3 01-05-2007 04:21:46
como puedo hacer para cambiar un archivo de excel con versión 2.1 a versión 8.0 RONPABLO Servers 4 23-01-2006 06:02:38
Me hago mayor? Me invento las cosas? Soy autosugestionable? papulo Varios 6 11-11-2005 21:37:07
ordenar un DBGrid de mayor a menor jmlifi Varios 2 03-11-2005 16:36:34


La franja horaria es GMT +2. Ahora son las 20:16:21.


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
Copyright 1996-2007 Club Delphi