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 26-06-2014
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Compilación condicional

Buenas, tengo un dilema.
Resulta que tengo que incluir una unit si el ejecutable está corriendo en Win7 o Win8, caso contrario no se incluye.
Tengo entendido que se hace con los condicionales.
¿Alguien me puede dar una mano? Gracias.

Código Delphi [-]
{$IfDef DefName} //Esto debería indicarme si estoy en Win7 o Win8 o en ninguno.
 thinfinity,
 {$Else}
 system, controls, ...
 {$EndIf}
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #2  
Antiguo 26-06-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Santiago.

Las directivas de compilación sirven para indicar cómo debe ser generado (compilado) el programa ejecutable. Una vez obtenido éste, será el mismo programa lo instales en donde lo instales. Si deseas un comportamiento diferente de la aplicación según el sistema operativo donde corra, entonces necesitarás añadir instrucciones que verifiquen en qué versión de Windows se encuentra y, mediante tradicionales "Ifs", separar las sentencias que deben ser ejecutadas en unas versiones del sistema operativo de las que deben ser ejecutadas en otras.

Una alternativa a lo anterior sería definir un símbolo condicional en las opciones del proyecto (entrada Conditional defines), sin dejar de usar directivas de compilación $IfDef. El símbolo lo pondrías o lo quitarías, según desees generar un ejecutable para unas versiones de Windows o para otras.

No ando muy lúcido este día, pero ojalá te haya servido de algo mi intervención.

Un cordial saludo.
Responder Con Cita
  #3  
Antiguo 26-06-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
santiago14,

Cita:
Empezado por santiago14
...tengo que incluir una unit si el ejecutable está corriendo en Win7 o Win8...
Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetWindowsVersion : String;
const
  wbemFlagForwardOnly = $00000020;

var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet : OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
  SQLWMI : String;

begin

  // Obtiene Acceso a WMI
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');

  // Obtiene Acceso al NameSpace root\CIMV2 localmente que contiene la Clase Win32_Process
  FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');

  // Contruye la Consulta SQL WMI (WQL) a la Clase Win32_Process
  SQLWMI := 'SELECT * FROM Win32_OperatingSystem';

  // Ejecuta la Consulta
  FWbemObjectSet := FWMIService.ExecQuery(SQLWMI,'WQL',wbemFlagForwardOnly);

  // Interface a los objetos COM de la consulta por medio de enumeración
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;

  // Accesa las propiedades de los objetos de la enumeración
  if oEnum.Next(1, FWbemObject, iValue) = 0 then
  begin
     Result := Format('%s %s',[FWbemObject.Caption, FWbemObject.Version]);
     FWbemObject:=Unassigned;
  end

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(GetWindowsVersion);
end;

end.
El código anterior en Delphi 7 permite obtener por medio de WMI (Windows Management Instrumentation) el nombre y la versión del Sistema Operativo Windows instalado.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetWindowsVersion : String;
var
   OSVersionInfo: TOSVersionInfo;
   MajorVersion, MinorVersion: Integer;

begin

   Result := 'Windows Unknown';

   OSVersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);

   if GetVersionEx(OSVersionInfo) then
   begin

      MajorVersion := OSVersionInfo.dwMajorVersion;
      MinorVersion := OSVersionInfo.dwMinorVersion;

      if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
      begin
         if MajorVersion <= 4 then
            Result := Format('%s %d',['Windows NT',MajorVersion])
         else if (MajorVersion = 5) and (MinorVersion = 0) then
            Result := Format('%s %d.%d',['Windows 2000',MajorVersion,MinorVersion])
         else if (MajorVersion = 5) and (MinorVersion = 1) then
            Result := Format('%s %d.%d',['Windows XP',MajorVersion,MinorVersion])
         else if (MajorVersion = 6) and (MinorVersion = 0) then
            Result := Format('%s %d.%d',['Windows Vista',MajorVersion,MinorVersion])
         else if (MajorVersion = 6) and (MinorVersion = 1) then
            Result := Format('%s %d.%d',['Windows 7',MajorVersion,MinorVersion])
         else if (MajorVersion = 6) and (MinorVersion = 2) then
            Result := Format('%s %d.%d',['Windows 8',MajorVersion,MinorVersion])
      end;

   end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(GetWindowsVersion);
end;

end.
El código anterior en Delphi 2010 permite obtener el nombre y la versión del Sistema Operativo Windows instalado.

Nota: En Delphi 7, el código propuesto identifica erróneamente el SO Windows 7 x32 y x64 como Windows XP.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetWindowsVersion : String;
var
   OSVersion : TOSVersion;
begin
   Result := Format('%s %d.%d Build %d',[OSVersion.Name,
                                         OSVersion.Major,
                                         OSVersion.Minor,
                                         OSVersion.Build]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(GetWindowsVersion);
end;

end.
El código anterior en Delphi XE6 permite obtener el nombre y la versión del Sistema Operativo Windows instalado.

Revisa esta información:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 26-06-2014 a las 08:05:37.
Responder Con Cita
  #4  
Antiguo 26-06-2014
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Wink

Gracias nlsgarcia, yo creo que sí sirve.
Me explico mejor.

Hay una unit que uso, pero solamente ha sido desarrollada para Win8, si compilo en DelphiXE5 sobre Win8 y lo ejecuto , lo hace sin problemas.
Cuando llevo ese ejecutable a otra máquina (XP, Win7), no se ejecuta y devuelve un error.
La idea es que cuando esté corriendo en cierto sistema operativo, Win8, le dé bolilla a esa unit, que está en uses claro, y cuando esté corriendo en otro, no. No se si entiende. Lo mismo vale para los objetos, que están dentro del código, que son de esa unit.
Ahora que lo veo, no se si por el lado de las condicionales la cosa se encamina.

Supongo que se puede combinar lo que pusiste con esta explicación.
Un detalle mas, a esa unit la debo poner en la lista de unit del program.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #5  
Antiguo 26-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Con lo que te han explicado, supongo que sería algo así:
Código Delphi [-]
unit CosasParaWindows8;
...
implementatin
funtion DevuelveCosaEspecial(...);
begin
   if (EsWindows8) then
   begin
      ...
   end
   else
      Return -1; // error
end;

La otra opción es:

Código Delphi [-]
funtion EstoUtilizaAlgoDeWindows8(...);
begin
   ...
   if (EsWindows8) then
      VariableEspeciaal := DevuelveCosaEspecial(...)...
   else
      VariableEspeciaal := Obtengo_el_valor_de_otra_manera;   
   ...   
end;
Responder Con Cita
  #6  
Antiguo 26-06-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
santiago14,

Cita:
Empezado por santiago14
...Hay una unit que uso, pero solamente ha sido desarrollada para Win8...en Delphi XE5 sobre Win8...sin problemas...Cuando llevo ese ejecutable a otra máquina (XP, Win7), no se ejecuta...
Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses UWindowsX, UWindows8;

function GetWindowsVersion : Boolean;
var
   OSVersion : TOSVersion;
begin
   if Copy(OSVersion.Name,1,9) = 'Windows 8' then
      Result := True
   else
      Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if GetWindowsVersion then
      UWindows8.Msg  // Se ejecuta si el OS es Windows 8
   else
      UWindowsX.Msg; // Se ejecuta si el OS es una versión diferente a Windows 8
end;

end.
El código anterior en Delphi XE6, ejecuta el procedimiento Msg en función de si el Sistema Operativo es Windows 8 o es otro Sistema Operativo Windows.

Espero sea útil

Nelson.
Responder Con Cita
  #7  
Antiguo 26-06-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Para dar más información, revisa la API GetVersionEx y la estructura OSVERSIONINFO


Código Delphi [-]
function IsWin8: boolean;
var
  VerInfo: TOSVersioninfo;
begin
  VerInfo.dwOSVersionInfoSize:= SizeOf(TOSVersionInfo);
  GetVersionEx(VerInfo);
  Result:= (VerInfo.dwMajorVersion >= 6) and (VerInfo.dwMinorVersion >= 2);
end;

Nota importante:
El código anterior dará WinXP(5.1) si corres por ejemplo delphi7 en Win8 en modo de compatibilidad WinXP durante el debug, pero la aplicación ya compilada reconocerá Win8 sin error


Saludos.
Responder Con Cita
  #8  
Antiguo 27-06-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
santiago14,

Nota: El segundo código del Msg #3 (Basado en la API GetVersionEx) si es ejecutado en Delphi 7 en modo Debug, identifica erróneamente el SO Windows Vista, Windows 7 y Windows 8 como Windows XP, si es ejecutado directamente desde el ejecutable funcionara correctamente según lo esperado.

Nelson.

Última edición por nlsgarcia fecha: 27-06-2014 a las 02:57:42.
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
Consulta condicional? Theluar SQL 4 25-10-2013 06:09:04
Problemas de condicional If whatson Varios 7 18-08-2010 21:57:15
si condicional en interbase??? GustavoCruz Firebird e Interbase 3 18-11-2008 21:10:08
manejar distintas versiones de un producto con compilación condicional.. pvizcay Varios 5 13-09-2006 15:34:00
locate condicional gatsoft2 Varios 10 06-05-2005 16:57:37


La franja horaria es GMT +2. Ahora son las 08:22:41.


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