Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con Inno Setup ,con alias y DBE (https://www.clubdelphi.com/foros/showthread.php?t=36382)

David 10-10-2006 18:34:15

Problemas con Inno Setup ,con alias y DBE
 
Tengo ya el inno setup , pero tengo dos dudas , una es cuando instalo , si esta el BDE Administrator , que no lo instale , es decir que detecte si esta y si no esta que lo instale y la otra es añadir los alias según el directorio donde instale el usuario el programa .

Mi programa tiene dos alias , que estan en dos carpetas distintas , dentro de donde está instalado el programa .

He mirado , en la web de Inno , aquí :

http://www.jrsoftware.org/iskb.php?bde

Me dice , que añada el programa Minireg.exe , pero claro no me explica , lo que he dicho yo , de instalar si esta o no esta el BDE .

En cuanto a los alias , te dice que añadas un programa realizado en Delphi , llamado AddAlias.exe , pero este programa , no te instala los alias en el lugar elegido por el usuario para instalar el programa . Además mi programa tiene dos alias , habría que ver como resuelvo este problema .

De todo lo que he dicho , lo que más me interesa , es instalar los alias .

Un saludo

roman 10-10-2006 18:47:46

Bueno, según yo entiendo, usas AddAlias por cada alias que quieras instalar pasando como parámetro la ruta:

Código:

[run]
AddAlias mi_alias c:\ruta\al\directorio paradox
AddAlias mi_otro_alias c:\ruta\al\otro\directorio paradox

No lo he probado, pero imagino que en la sección [run] puedes hacer uso de las constantes de la instalación, tales como {app} (directorio de instalación):

Código:

[run]
AddAlias mi_alias {app}\subdirectorio\de\tablas paradox

// Saludos

roman 10-10-2006 18:51:58

Mmm... La sintaxis es incorrecta. Sería más bien así:

Código:

[run]
Filename: "{tmp}\AddAlias.exe"; Parameters: """{app}\subdirectorio"""

// Saludos

David 12-10-2006 16:56:10

Cita:

Empezado por roman
Mmm... La sintaxis es incorrecta. Sería más bien así:

Código:

[run]
Filename: "{tmp}\AddAlias.exe"; Parameters: """{app}\subdirectorio"""

// Saludos

Pero con esta sintaxis , donde pongo los alias ?

roman 12-10-2006 17:59:26

Acabo de probarlo y así me funciona:

Código:

[Run]
Filename: "{tmp}\AddAlias.exe"; Parameters: "mi_alias ""{app}\tablas"" PARADOX"

Observa las comillas alrededor de {app}\tablas. Si las omites parece que no funciona.

// Saludos

David 13-10-2006 21:25:54

No me sale , no sé donde esta el error , pero no me sale , pongo todo el código a ver si alguien ve donde este el error .

compila bien , instala el programa , pero no instala los alias .

Código Delphi [-]
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
AppName=Miprograma
AppVerName=Miprograma1.5
DefaultDirName={pf}\Miprograma
DefaultGroupName=Miprograma
DisableProgramGroupPage=yes
OutputDir=C:\My InstallShield Express Projects
OutputBaseFilename=Miprograma
SetupIconFile=C:\Miprograma.ico
Compression=lzma
SolidCompression=yes

[Languages]
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Miprograma\Miprograma.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Miprograma\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "AddAlias.exe"; DestDir: "{tmp}"

; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Miprograma"; Filename: "{app}\Miprograma.exe"
Name: "{group}\{cm:UninstallProgram,Miprograma}"; Filename: "{uninstallexe}"
Name: "{userdesktop}\Miprograma"; Filename: "{app}\Miprograma.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\Miprograma.exe"; Description: "{cm:LaunchProgram,Miprograma}"; Flags: nowait postinstall skipifsilent
Filename: "{tmp}\AddAlias.exe"; Parameters: "alias1""{app}""PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "alias2""{app}\tablas""PARADOX"

David 13-10-2006 21:44:04

Ya me sale , habia que poner un poco de espacio entre las comillas , las que estan detras de cada alias y un espacio delante de la palabra PARADOX.

Código Delphi [-]
Filename: "{tmp}\AddAlias.exe"; Parameters: "alias1 ""{app}"" PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "alias2 ""{app}\tablas"" PARADOX"

Ya sé que este programa es gratis , pero por dejar un pequeño espacio dentro de unas comillas , no deberia de ser motivo para que no funcione una aplicación , me he estado toda la tarde dandole vueltas por este aparentemente insignificante detalle .

Otro detalle de la aplicación , es que no desinstala los alias , al desinstalar el programa , y si desinstala el programa y lo instalas de nuevo , en otro directorio , pues no te actualiza la ruta de los alias .

egostar 13-10-2006 22:10:08

Otra opción que tienes es la siguiente:

Cita:

[Run]
Filename: "{app}\AddAlias.exe"; Parameters: "MIBASE {app}\tables PARADOX"
Sin tantas comillas, recuerda que estas pasando parametros en la linea de comandos.

Cita:

Empezado por David
Otro detalle de la aplicación , es que no desinstala los alias , al desinstalar el programa , y si desinstala el programa y lo instalas de nuevo , en otro directorio , pues no te actualiza la ruta de los alias

Pues si se puede borrar agregando un signo - al Alias

Cita:

Filename: "{app}\AddAlias.exe"; Parameters: "-MIBASE"
Y también hay que modificar el programa AddAlias.

Aqui pego la modificación

Código Delphi [-]
 
  DbiInit(nil);
  try
    if FDelete then
      try
        DbiDeleteAlias(nil, PChar(GAlias));
      except
      end
    else // Este else no esta en el original.
      try
        DbiAddAlias(nil, PChar(StrToOem(GAlias)),
                         PChar(StrToOem(FDrvName)),
                         PChar(FParams), True);
        DbiCfgSave(nil, nil, True);
      except
      end;
  finally
    DbiExit();
  end;

Saludos

roman 13-10-2006 22:23:29

Cita:

Empezado por egostar
Sin tantas comillas, recuerda que estas pasando parametros en la linea de comandos.

Las comillas son necesarias porque la ruta {app} pudiera tener espacios (como en C:\Archivos de programa\Mi App). Justamente por eso es que el espacio que menciona David no es una cuestión del InnoSetup sino de como se pasan los parámetros a un ejecutable en Windows.

Muy buena la adición de cómo borrar alias. No estoy seguro, pero me parece que InnoSetupo permite especificar que eso se ejecuta al desinstalar el programa, ¿es así?

// Saludos

egostar 13-10-2006 22:24:11

Se me pasó, tambien puedes hacer que se ejecute cuando desinstalas la aplicación usando lo siguiente:

Cita:

[UninstallRun]
Filename: Addalias.exe; Parameters: "-MIBASE"

Saludos.

roman 13-10-2006 22:27:55

¡Ah! Pues con esto ya queda bien redondito :) Creo que este hilo es el hilo a citar para futuras referencias respecto a la instalación del BDE.

// Saludos

egostar 13-10-2006 22:30:36

Cita:

Empezado por roman
Las comillas son necesarias porque la ruta {app} pudiera tener espacios (como en C:\Archivos de programa\Mi App). Justamente por eso es que el espacio que menciona David no es una cuestión del InnoSetup sino de como se pasan los parámetros a un ejecutable en Windows.

Creo que tienes razón, yo normalmente no uso directorios con espacios, buen punto.

Otra cosa que les recomiendo es usar otra herramienta que va de la mano con InnoSetup y se llama ISTool

Te crea el mismo archivo que usa InnoSetup pero desde una interfaz gráfica.

Saludos.

egostar 14-10-2006 02:46:24

Cita:

Empezado por David
Me dice , que añada el programa Minireg.exe , pero claro no me explica , lo que he dicho yo , de instalar si esta o no esta el BDE .

Para complementar este tema y evitar que se instale de nuevo el BDE si ya existe, modifique el programa MiniReg de Jordan Russell agregando lo siguiente:

Código Delphi [-]
 
{ MiniReg v1.0 by Jordan Russell
  Note: For Delphi 3+, you'll need to change "OLE2" below to "ActiveX". }
uses
  Windows, ActiveX,BDE; // BDE para usar la función dbiInit
 
var
  BDECheck : Bool;
 
{x$R *.RES}
 
.......
.......
 
begin
  if ParamCount <> 1 then
     Exit;
  BDECheck := (dbiInit(nil) = 0);  //Aqui verifico si existe BDE, 
                                            //Esta idea la tomé de Trucomanía
  If BDECheck = false then begin  //Actúo en consecuencia
     CoInitialize (nil);
     try
       RegisterServer (ParamStr(1));
     finally
       CoUninitialize;
     end;
  end;
end;

Saludos.

David 15-10-2006 13:32:01

No me desinstala los alias :

si pongo esto , después de poner el else en el programa AddAlias como dice egostar :

Código Delphi [-]
[Run]
Filename: "{app}\Miprograma.exe"; Description: "{cm:LaunchProgram,Miprorgrama}"; Flags: nowait postinstall skipifsilent
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias1 ""{app}"" PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias2 ""{app}\tablas"" PARADOX"

Al poner - delante del alias , ni siquiere me instala los alias .

Si pongo esto , con el AddAlias original , y en la sección [Run] lo que he puesto arriba pero sin el signo - delante del alias , me instala los alias , pero no me lo desinstala .

Código Delphi [-]
[UninstallRun]
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias1 ""{app}"" PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias2 ""{app}\tablas""

Y por otra parte , según dicen en la nueva versión de Inno setup , yo no puedes poner un icono de desinstalación , el comando UninstallIconFile , ya no funciona , queda muy mal , ir a inicio , programas y ver que el icono del programa y el desinstalación es el mismo .

Lepe 15-10-2006 14:00:59

Cita:

Empezado por David
Y por otra parte , según dicen en la nueva versión de Inno setup , yo no puedes poner un icono de desinstalación , el comando UninstallIconFile , ya no funciona , queda muy mal , ir a inicio , programas y ver que el icono del programa y el desinstalación es el mismo .

Yo lo veo muy útil, se supone que estas en la ventana de "Desinstalar Programas", el hecho de ver un icono distinto desconcierta un poco, ya que tienes que leer el nombre para saber el programa que quieres desinstalar. Al ver el mismo icono de tu aplicación, lo localizas más rápido.

... Aunque sobre gustos no hay nada escrito ;).

Saludos

roman 15-10-2006 16:15:10

Cita:

Empezado por Lepe
se supone que estas en la ventana de "Desinstalar Programas"

No necesariamente. Creo que David se refiere al icono que se coloca en el menú inicio:

Inicio|Programas|Tu Aplicación

Ahí es donde resulta confuso.

En cuanto a por qué no funciona la desinstalación de alias hay que considerar dos puntos:

1. Tal como está no sirve porque AddAlias.exe se copia al directorio {tmp} y todo lo que está ahí se borra al final de la instalación. Debe entonces copiarse a algún otro drectorio, por ejemplo {app} o {app}\bin.

2. Revisando el código fuente de AddAlias veo que el signo - antes del nombre del alias no hace lo que estamos pensando.

Cita:

Empezado por código fuente de AddAlias
Código:

  1: Name of alias
      if begins with '-' then delete first if exist
                        else do nothing if exist


Es decir, el alias de cualquier forma se agrega, sólo que si ya existe un alias con ese nombre, se borra antes.

Podría modificarse el programa para que sólo borre el alias, pero creo que yo lo que haría para matener las cosas separadas es crear un segundo programa DeleteAlias que sólo borre alias. Este DeleteAlias es el que se copiaría a {app}.

Le queda de tarea a David :)

// Saludos

David 15-10-2006 16:54:50

A mi si esta y lo borra me viene perfecto , aunque luego lo instale .

Pero es que si pongo el signo - , como he dicho , es que no hace nada de nada .

Por que la única utilidad para desinstalar los alias es la siguiente . Cuando te instala el programa ,te instala los alias en el directorio donde esta la aplicación , si desinstalas , y no quitas los alias (el usuario no sabe hacerlo ) , luego instalas y si eliges otro directorio , los alias apuntan al directorio inicial , y el programa no funciona .

Por lo que si al instalar , encuentra los alias , los borrra y luego los escribe en la dirección correcta , estaria bien por mi parte .

Pero reitero , si pongo el signo - , como he explicado que he hecho , no hace nada de nada .

David 15-10-2006 18:32:14

Cita:

Empezado por roman
No necesariamente. Creo que David se refiere al icono que se coloca en el menú inicio:

Inicio|Programas|Tu Aplicación

Ahí es donde resulta confuso.

Ahí es donde digo , el icono del programa y el de desinstalación es el mismo . Y además primero te sale el de desintalación y luego el del programa . No es que sea un detalle muy importante , pero prefiero tener primero el icono del programa y luego otro dinstinto y debajo el de desinstalar.

Lepe 15-10-2006 18:41:56

Bueno, quizás y solo quizás, no se deba poner el icono de desintalación tan a mano de usuarios inexpertos, y por esa razón, no debe ponerse en inico -> Programas (alguna vez le he dado sin querer :D)

Nero 6, Office, incluso BDS 2006 no traen los iconos de desinstalar en inicio -> programas.

El hecho de hacer un programa para añadir alias y otro para borrar, me parece demasiado, yo al menos cambiaría el nombre del programa "AddAlias" por "AliasManager" con una linea de comando:

AliasManager /add MiAlias
AliasManager /del Mialias
AliasManager /h
AliasManager /help
AliasManager /?

Las 3 últimas muestran un mensaje con los parámetros que se pueden usar y qué hace cada uno.

Saludos

roman 17-10-2006 23:04:42

Regresando a lo del icono para desinstalar:

Si se quiere cambiar el icono que aparece en la ventana "Agregar o quitar programas" basta usar la opción UninstallDisplayIcon en la sección [Setup]. De hecho, también puede cambiarse el texto que aparece usando UninstallDisplayName:

Código Delphi [-]
[Setup]
...
UninstallDisplayIcon={app}\eliminar.ico
UninstallDisplayName="¡¡Quita ya esta cosa de mi sistema!!"
...

También puede usarse una librería de iconos o un exe o dll. En tal caso se puede especificar el índice del icono que se quiera usar. Por ejemplo:

Código Delphi [-]
[Setup]
...
UninstallDisplayIcon={sys}\shell32.dll,31
...

hará que aparezca el icono número 31 de la librería shell32.dll (que resulta ser el icono de la papelera).

Por otra parte, también puede cambiarse el icono que usemos en el menú de Inicio para acceso directo al desinstalador. De hecho, como con cualquier otro icono de acceso directo, puede usarse uno distinto del de la aplicación destino. Para ello hay que usar la directiva IconFileName y opcionalmente IconIndex. Por ejemplo:

Código Delphi [-]
[Icons]
Name: "{group}\Quitar programa"; Filename: "{uninstallexe}"; IconFilename: "eliminar.ico"

para usar un icono fijo, o bien

Código Delphi [-]
[Icons]
Name: "{group}\Quitar programa"; Filename: "{uninstallexe}"; IconFilename: "{sys}\shell32.dll"; IconIndex: 31

Coincido con Lepe en que en la ventana "Agregar o quitar programas" conviene usar el mismo icono que el de la aplicación para poder distinguirlo rápidamente. Pero en el menú Inicio, usar un icono distinto evitará que accidentalmente desisntalemos la aplicación.

// Saludos

egostar 17-10-2006 23:56:30

Cita:

Empezado por Lepe
El hecho de hacer un programa para añadir alias y otro para borrar, me parece demasiado, yo al menos cambiaría el nombre del programa "AddAlias" por "AliasManager" con una linea de comando:

"Robandome" la buena idea de Lepe les dejo aqui las modificaciones que hice.

Código Delphi [-]
 
{
program adds a alias to the BDE configuration file
 parameters:
   0: programname + path (standard parameter of OS)
   1: Name of alias
      if begins with '-' then delete first if exist
                         else do nothing if exist
   2: path to data directory
   3: BDE driver name
Bugfix: Savierhs Lopez Arteaga 3.1.2001
        AddAlias didn't delete alias with beginning '-'
 
      Modificación para una operación genérica
   1: Tipo de Operación  ( /ADD, /DEL)
   2: Nombre de Alias
   3: Ruta de Directorio de Datos
   4: Driver de BDE
}
 
program AliasManager;
uses
  Windows, SysUtils, BDE;
 
var
  GType:     string; //Tipo de Operación
  GAlias:    string;
  GDriver:   string;
  GAliasDir: string;
  FParams:   string;
  FDrvName:  string;
  FDelete:   boolean;
  i:         integer;
 
function StrToOem(const AnsiStr: string): string;
begin
  SetLength(Result, Length(AnsiStr));
  if Length(Result) > 0 then
    CharToOem(PChar(AnsiStr), PChar(Result));
end;

{-----------------------------------------------------------------------}
begin
  for i := 1 to ParamCount do
  begin
    case i of
      1: GType     := ParamStr(1);
      2: GAlias    := ParamStr(2);
      3: GAliasDir := ParamStr(3);
      4: GDriver   := ParamStr(4);
    end;
  end;
 
  // Tipo de Operación
  if GType = '/DEL' then
     FDelete := True
  else FDelete := False;
 
  //default alias
  if GAliasDir = '' then GAliasDir := ExtractFilePath(ParamStr(0))+'Tables';
  FDrvName := GDriver;

  //set Parameters, the driver and server name
  if (CompareText(GDriver, szCFGDBSTANDARD) = 0) or
     (CompareText(GDriver, szPARADOX) = 0)       or
     (CompareText(GDriver, szDBASE) = 0)         or
     (CompareText(GDriver, szFOXPRO) = 0)        or
     (CompareText(GDriver, szASCII) = 0)         then
  begin
    if (CompareText(GDriver, szCFGDBSTANDARD) = 0) then FDrvName := szPARADOX;
 
    //set parameters for the new alias
    FParams := Format('%s:"%s"',  [szCFGDBPATH, GAliasDir]) +
               Format(';%s:"%s"', [szCFGDBDEFAULTDRIVER, GDriver]) +
               Format(';%s:"%s"', [szCFGDBENABLEBCD, szCFGFALSE]);
  end else begin
    if (CompareText(GDriver, 'INTRBASE') = 0)
    then FParams := Format('%s:"%s"',  [szSERVERNAME, GAliasDir])
    else FParams := Format('%s:"%s"',  [szDATABASENAME, GAliasDir]);
    //add other Parameters here !!!!!!!!!!!!!!!!!
  end;
 
  DbiInit(nil);
  try
    if FDelete then
      try
        DbiDeleteAlias(nil, PChar(GAlias));
      except
      end
      else //Conserve este else
      try
        DbiDeleteAlias(nil, PChar(GAlias)); //Se debe borrar el Alias si existe
                                                     // ya que no hay una función que
                                                    // permita cambiar el Path
        DbiAddAlias(nil, PChar(StrToOem(GAlias)),
                         PChar(StrToOem(FDrvName)),
                         PChar(FParams), True);
        DbiCfgSave(nil, nil, True);
      except
      end;
  finally
    DbiExit();
  end;
end.
//----------------------------------------------------------------------

Por otro lado el programa de instalación se ve así

Cita:

[Files]
Source: "D:\Installers\AliasManager\AliasManager.exe"; DestDir: "{app}"

[Icons]
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"

[Run]
Filename: "{app}\AliasManager.exe"; Parameters: "/ADD MANAGER ""{app}""\tables PARADOX"

[UninstallRun]
Filename: "{app}\AliasManager.exe"; Parameters: "/DEL MANAGER"

Ya he probado instalando, reinstalando cambiando el path del sistema y desinstalando.

Hizo todo lo que se esperaba.

Saludos.

roman 18-10-2006 18:10:31

Yo añadiría el StrToOem al FParams. Haciendo una prueba, si se ejecuta el programa desde la línea de comandos y se le pasa una ruta que tenga acentos, no la lee correctamente.

// Saludos

David 19-10-2006 18:26:01

Cita:

Empezado por egostar
[Files]
Source: "D:\Installers\AliasManager\AliasManager.exe"; DestDir: "{app}"

[Icons]
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"

[Run]
Filename: "{app}\AliasManager.exe"; Parameters: "/ADD MANAGER ""{app}""\tables PARADOX"

[UninstallRun]
Filename: "{app}\AliasManager.exe"; Parameters: "/DEL MANAGER"

Aquí hay algo que no entiendo y es donde pones el alias .

Imaginemos que tengo un alias , llamado Alias1 , dónde lo pondría ?

Con respecto a lo que dice román , de poner StrToOem(FParams) , a cual hay que ponerle esta función , quizás sólo a este :

DbiAddAlias(nil, PChar(StrToOem(GAlias)),
PChar(StrToOem(FDrvName)),
PChar(StrToOem(FParams)), True);

Un saludo

egostar 19-10-2006 18:31:56

Cita:

Empezado por David
Aquí hay algo que no entiendo y es donde pones el alias .

Imaginemos que tengo un alias , llamado Alias1 , dónde lo pondría ?

Con respecto a lo que dice román , de poner StrToOem(FParams) , a cual hay que ponerle esta función , quizás sólo a este :

DbiAddAlias(nil, PChar(StrToOem(GAlias)),
PChar(StrToOem(FDrvName)),
PChar(StrToOem(FParams)), True);

Un saludo

Aqui te muestro donde.

Cita:

[Run]
Filename: "{app}\AliasManager.exe"; Parameters: "/ADD ALIAS1 ""{app}""\tables PARADOX"

[UninstallRun]
Filename: "{app}\AliasManager.exe"; Parameters: "/DEL ALIAS1"

Saludos

David 24-10-2006 16:15:18

La instalación ya me funciona perfectamente .

Pero puestos a mejorar en este post , me pregunto si seria posible una instalación en red con los alias y todo .

Recuerdo que para instalar paradox en red , hay que instalar en BDE en los dos ordenadores . Hay que crear 2 unidades mapeadas , por ejemplo J e I . Hay que crear una carpeta dentro del directorio de la aplicación llamada por ejemplo net.

Los alias , ya no apuntan a app/tablas , sino a J:/tablas (J:\ unidad mapeada donde esta el programa ) y además en el BDE , en la página de Configuración , en Drivers -> Native -> Paradox , hay que poner la unidad mapeada I , en Net Dir , que corresponde a la carpeta {app\net} .

Hacer esto para instalar paradox en red no es dificil , lo haces una vez o dos y ya lo sabes para otras , pero pregunto , habría alguna posibilidad de hacer esto con el instalador Inno Setup .

O esto ya es demasiado :D

Lepe 25-10-2006 00:52:07

Simplemente no uses unidades mapeadas.

Puedes usar rutas del tipo : "\\nombreservidor\nombrecarpeta".

Al ser compartida con acceso global, tambien comparte todas las subcarpetas. Esa carpeta tendrá una subcarpeta que se llama "net" y dentro es donde redireccionas el NETFILEDIR de tu session en paradox.

Al realizar la instalación con innosetup, lo mejor es hacerlo en una memoria USB, de esa forma tu cliente puede elegir qué ordenador de la red actuará como servidor, en un archivo se guarda la configuración de la instalación "Servidor", y despues al instalar en modo cliente se lee de ese archivo. Todo queda configurado correctamente.

Los alias pueden ser creados dinámicamente con Database.Session.AddStandardAlias así que tampoco es problema.

El problema de TODO es elegir un camino de los 300 que llevan al mismo fin.

Saludos.


La franja horaria es GMT +2. Ahora son las 23:40:56.

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