Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Zeos Lib - Configuracion manual de componentes (https://www.clubdelphi.com/foros/showthread.php?t=92611)

The Cid James 10-12-2017 11:57:37

Zeos Lib - Configuracion manual de componentes
 
Buenas de nuevo, me encuentro utilizando zeos lib y delphi 10.2 y tengo una duda sobre el componente tzconnecion, este es en enlace que conecta con las base de datos y tiene las siguientes propiedades, entre otras
  • Hostname (nombre o direccion del host)
  • Database - nombre de la base de datos)
  • Library location (por defecto busca la libraria de la base de datos en system32) sino se encuentra aqui o no la reconoce se puede ingresar la ruta del dll de forma manual
  • User - usuario con el que se conecta a la base de datos
  • password - contraseña del usuario de la base de datos.
Estas propiedades obviamente no siempre son las mismas y quisiera saber como puedo hacer que el usuario pueda cambiarlas de ser necesario, mayormente porque quiero que el soft corra en distintas maquinas conectandose a un unico server y porque por algun motivo con versiones de windows 64 zeos lib no reconoce el dll en la carpeta system32 por mas que este y tampoco en syswow64 por lo que estuve probando.



Saludos y desde ya muchas gracias

Casimiro Notevi 10-12-2017 14:19:18

Cita:

Empezado por The Cid James (Mensaje 523267)
... por algun motivo con versiones de windows 64 zeos lib no reconoce el dll en la carpeta system32 por mas que este y tampoco en syswow64 por lo que estuve probando.

En un windows 64 bits, los programas, controladores, bibliotecas dll, etc. de 64 bits van en system32.
En un windows 64 bits, los programas, controladores, bibliotecas dll, etc. de 32 bits van en syswow64.

Aunque la lógica diría que es al revés. Son las ocurrencias de microsoft.

The Cid James 10-12-2017 16:55:59

Cuando instale zeos lib copie los dll manualmente a dicha carpeta en una VM con windows de 64 bits y no hubo ningun caso no los tomo, probe lo mismo en una vm con windows de 32 bits y lo tomo normalmente, de todas formas quisiera saber como parametrizar estas propiedades para guardarlas en otro lado como en un .ini segun lo que me comento alguien mas me comento. Ni siquiera se si es posible parametrizar esto en esos componentes

bucanero 11-12-2017 10:36:36

hola,
En cuanto a las DLLs como te ha comentado Casimiro, estando en las carpetas de windows debería de cogerlas sin problemas, otra opción es dejar dichas DLLs en la misma carpeta que el ejecutable y en ninguno de estos casos usar la opción LibraryLocation del componente, salvo que quieras usar otra localización distinta de estas dos (las opciones por defecto).

Para el tema de la configuración por parte del usuario es muy recomendable que marques la opción DesingConnection a true, esta opción te permite mantener la conexión activa en tiempo de diseño pero no conecta automáticamente al crear el componente, esto es necesario si la configuración de diseño va a ser distinta que la configuración en ejecución.

Y aquí te dejo un ejemplo de como puedes hacer para que el usuario pueda configurar la conexión y guardar y recuperar dicha configuración:


Código Delphi [-]
uses dialogs, Forms, Vcl.Controls, inifiles, unit2;

{$R *.dfm}


{ TDataModule3 }
function TDMConnection.ConfigurarDBConnection: Boolean;
var
  FormConfig:TFormDBConfig;
begin
  /// Aqui se muestra un Form con los campos de la conexion, para que el usuario
  /// los pueda modificar y despues guardar dicha configuracion en un fichero INI
  FormConfig:=TFormDBConfig.create(application);
  try
    FormConfig.showModal;
    Result:=(FormConfig.modalResult=mrOk);
  finally
    FormConfig.free
  end;
  if result then
    SaveDBConfig;
end;

procedure TDMConnection.DataModuleDestroy(Sender: TObject);
begin
  ZConnection1.Disconnect;
end;

function TDMConnection.DBConectar: Boolean;

var
  intento:LongInt;
begin
  intento:=0;
  if loadDBConfig then
    repeat
      try
        ZConnection1.Connect;
      except
        // Error en el proceso de conexion
        On E:Exception do
          MessageDlg(E.message, mtError, [mbOK], 0);
      end;
      inc(intento);
      /// se sale:
      ///   si se ha conectado correctamente,
      ///   si se ha intentando conectar 3 o mas veces sin exito
      ///   o si no se ha conseguido conectar y se ha cancelado la ventana de configuración
    until ZConnection1.Connected or (intento>=3) or not ConfigurarDBConnection;
end;

function TDMConnection.loadDBConfig: Boolean;
var
  ConfigFile:TIniFile;
  ASection:String;
begin
  Result:=False;
  ConfigFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  try
    with ZConnection1 do begin
      ASection:=ZConnection1.Name;
      Database := ConfigFile.ReadString(ASection, 'database', database);
      Catalog := DataBase;
      HostName := ConfigFile.ReadString(ASection, 'HostName', HostName);
      Port := ConfigFile.ReadInteger(ASection, 'Port', Port);
      protocol := ConfigFile.ReadString(ASection, 'protocol', protocol);
      LibraryLocation:= ConfigFile.ReadString(ASection, 'LibraryLocation', LibraryLocation);
      /// Para el Usuario/password es conveniente aplicar algun algoritmo de codificacion/descodificacion
      User := ConfigFile.ReadString(ASection, 'User', User);
      password := ConfigFile.ReadString(ASection, 'password', password);
      Result:=true;
    end;
  finally
    ConfigFile.Free;
  end;
end;

function TDMConnection.SaveDBConfig: Boolean;
var
  ConfigFile:TIniFile;
  ASection:String;
begin
  Result:=False;
  ConfigFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  try
    with ZConnection1 do begin
      ASection:=ZConnection1.Name;
      ConfigFile.WriteString(ASection, 'database', database);
      ConfigFile.WriteString(ASection, 'HostName', HostName);
      ConfigFile.WriteInteger(ASection, 'Port', Port);
      ConfigFile.WriteString(ASection, 'protocol', protocol);
      ConfigFile.WriteString(ASection, 'LibraryLocation', LibraryLocation);
      /// Para el Usuario/password es conveniente aplicar algun algoritmo de codificacion/descodificacion
      ConfigFile.WriteString(ASection, 'User', User);
      ConfigFile.WriteString(ASection, 'password', password);
      Result:=true;
    end;
  finally
    ConfigFile.Free;
  end;
end;

Y para usarlo solo es necesario poner

Código Delphi [-]
  if not DMConnection.DBConectar then begin
    MessageDlg('No ha sido posible conectarse a la BBDD', mtError, [mbOK], 0);
    exit;
  end;
  MessageDlg('Conexion OK', mtInformation, [mbOK], 0);

Importante en ZEOS guardar también los campos protocol y port (protocolo y puerto) son los que indican el sistema de base de datos que se va utilizar, y que DLLs va a necesitar para conectar, (ZEOS permite conectar a múltiples motores de bases de datos)

Un saludo

The Cid James 11-12-2017 18:56:10

Cita:

Empezado por bucanero (Mensaje 523290)
hola,
En cuanto a las DLLs como te ha comentado Casimiro, estando en las carpetas de windows debería de cogerlas sin problemas, otra opción es dejar dichas DLLs en la misma carpeta que el ejecutable y en ninguno de estos casos usar la opción LibraryLocation del componente, salvo que quieras usar otra localización distinta de estas dos (las opciones por defecto).

Para el tema de la configuración por parte del usuario es muy recomendable que marques la opción DesingConnection a true, esta opción te permite mantener la conexión activa en tiempo de diseño pero no conecta automáticamente al crear el componente, esto es necesario si la configuración de diseño va a ser distinta que la configuración en ejecución.

Y aquí te dejo un ejemplo de como puedes hacer para que el usuario pueda configurar la conexión y guardar y recuperar dicha configuración:


Código Delphi [-]
uses dialogs, Forms, Vcl.Controls, inifiles, unit2;

{$R *.dfm}


{ TDataModule3 }
function TDMConnection.ConfigurarDBConnection: Boolean;
var
  FormConfig:TFormDBConfig;
begin
  /// Aqui se muestra un Form con los campos de la conexion, para que el usuario
  /// los pueda modificar y despues guardar dicha configuracion en un fichero INI
  FormConfig:=TFormDBConfig.create(application);
  try
    FormConfig.showModal;
    Result:=(FormConfig.modalResult=mrOk);
  finally
    FormConfig.free
  end;
  if result then
    SaveDBConfig;
end;

procedure TDMConnection.DataModuleDestroy(Sender: TObject);
begin
  ZConnection1.Disconnect;
end;

function TDMConnection.DBConectar: Boolean;

var
  intento:LongInt;
begin
  intento:=0;
  if loadDBConfig then
    repeat
      try
        ZConnection1.Connect;
      except
        // Error en el proceso de conexion
        On E:Exception do
          MessageDlg(E.message, mtError, [mbOK], 0);
      end;
      inc(intento);
      /// se sale:
      ///   si se ha conectado correctamente,
      ///   si se ha intentando conectar 3 o mas veces sin exito
      ///   o si no se ha conseguido conectar y se ha cancelado la ventana de configuración
    until ZConnection1.Connected or (intento>=3) or not ConfigurarDBConnection;
end;

function TDMConnection.loadDBConfig: Boolean;
var
  ConfigFile:TIniFile;
  ASection:String;
begin
  Result:=False;
  ConfigFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  try
    with ZConnection1 do begin
      ASection:=ZConnection1.Name;
      Database := ConfigFile.ReadString(ASection, 'database', database);
      Catalog := DataBase;
      HostName := ConfigFile.ReadString(ASection, 'HostName', HostName);
      Port := ConfigFile.ReadInteger(ASection, 'Port', Port);
      protocol := ConfigFile.ReadString(ASection, 'protocol', protocol);
      LibraryLocation:= ConfigFile.ReadString(ASection, 'LibraryLocation', LibraryLocation);
      /// Para el Usuario/password es conveniente aplicar algun algoritmo de codificacion/descodificacion
      User := ConfigFile.ReadString(ASection, 'User', User);
      password := ConfigFile.ReadString(ASection, 'password', password);
      Result:=true;
    end;
  finally
    ConfigFile.Free;
  end;
end;

function TDMConnection.SaveDBConfig: Boolean;
var
  ConfigFile:TIniFile;
  ASection:String;
begin
  Result:=False;
  ConfigFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  try
    with ZConnection1 do begin
      ASection:=ZConnection1.Name;
      ConfigFile.WriteString(ASection, 'database', database);
      ConfigFile.WriteString(ASection, 'HostName', HostName);
      ConfigFile.WriteInteger(ASection, 'Port', Port);
      ConfigFile.WriteString(ASection, 'protocol', protocol);
      ConfigFile.WriteString(ASection, 'LibraryLocation', LibraryLocation);
      /// Para el Usuario/password es conveniente aplicar algun algoritmo de codificacion/descodificacion
      ConfigFile.WriteString(ASection, 'User', User);
      ConfigFile.WriteString(ASection, 'password', password);
      Result:=true;
    end;
  finally
    ConfigFile.Free;
  end;
end;


Y para usarlo solo es necesario poner

Código Delphi [-]

  if not DMConnection.DBConectar then begin
    MessageDlg('No ha sido posible conectarse a la BBDD', mtError, [mbOK], 0);
    exit;
  end;
  MessageDlg('Conexion OK', mtInformation, [mbOK], 0)

Importante en ZEOS guardar también los campos protocol y port (protocolo y puerto) son los que indican el sistema de base de datos que se va utilizar, y que DLLs va a necesitar para conectar, (ZEOS permite conectar a múltiples motores de bases de datos)

Un saludo

Primero que nada muchas gracias por tomarte el tiempo de explicarme, en ese caso si es que entiendo el ejemplo, estaria abriend ola configuracion en un formulario en el caso de que al abrir la aplicacion no conecte el momento de abrir?

Código Delphi [-]
begin   Result:=False;   ConfigFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'))
En cuanto al comentario en el que recomendas algun tipo de codificacion cuales serian los usados normalmente, desconozco los metodos de ofuscacion de codigo, y los hash md5 de "one way" estan totalmente descartados para algo asi :D

bucanero 12-12-2017 09:55:03

Cita:

Empezado por The Cid James (Mensaje 523304)
Primero que nada muchas gracias por tomarte el tiempo de explicarme, en ese caso si es que entiendo el ejemplo, estaria abriend ola configuracion en un formulario en el caso de que al abrir la aplicacion no conecte el momento de abrir?

Correcto, intenta leer la configuración del fichero INI, y en caso de no existir dicho fichero, va a obtener por defecto los parametros introducidos en tiempo de diseño. Si tras intentar conectar se produce algún error, entonces mostrara una ventana de configuración para que el usuario introduzca la configuración correcta.

Cita:

Empezado por The Cid James (Mensaje 523304)
En cuanto al comentario en el que recomendas algun tipo de codificacion cuales serian los usados normalmente, desconozco los metodos de ofuscacion de codigo, y los hash md5 de "one way" estan totalmente descartados para algo asi :D

El algoritmo MD5 es de tipo HASH y aquí este tipo de algoritmos no sirven puesto que no son métodos reversibles, y para la conexión se necesita descodificar los datos.

En cuanto al idoneo, pues aquí esta la cuestión, ya dependen del nivel de seguridad que necesites, si solamente pretendes que esos datos no estén accesibles al primer curioso que le de por abrir el fichero INI, te puede servir algo tan simple como:

Código Delphi [-]
    uses ... , Soap.EncdDecd; 
    
    // para leer los datos
    User     := decodeString(ConfigFile.ReadString(ASection, 'User', User));
    password := decodeString(ConfigFile.ReadString(ASection, 'password', password));

    // para guardar los datos
    ConfigFile.WriteString(ASection, 'User', EncodeString(User));
    ConfigFile.WriteString(ASection, 'password', EncodeString(password));

Pero si necesitas mas nivel de seguridad, ya sera necesario entrar de lleno en el tema de cifrado de datos con librerías mas especificas y usando llaves de cifrado. En este hilo se habla bastante sobre este tema:

http://clubdelpra.cluster003.ovh.net...ad.php?t=24075

Un Saludo

The Cid James 12-12-2017 22:31:12

Creo que con eso me bastaria es para una materia de la facu

Por otro lado estuve leyendo esta guia escrita por Franker Sobre archivos .ini y un par mas que encontre en el foro y otros lados y no logro comprender que tipo de varialbe es

Código Delphi [-]
 MiFichero := TiniFile.Create (Fichero);

Y tampoco puedo crear el archivo ini de esta forma :confused:
Código Delphi [-]
var    ini: TIniFile;  begin    ini := TIniFile.Create('C:\archivo.ini');
end;

Casimiro Notevi 12-12-2017 23:11:22

http://www.clubdelphi.com/foros/show...light=TiniFile

The Cid James 12-12-2017 23:21:15

Cita:

Empezado por Casimiro Notevi (Mensaje 523364)

Tambien lei esa guia, igual esto intentado crearlo, no leerlo ya tengo el uses declarado de hecho copila pero al precionar no crea el archivo en la direccion que le asigne

Casimiro Notevi 13-12-2017 09:26:50

Poco podemos decir si no vemos tu código.

bucanero 13-12-2017 10:20:10

Cita:

Empezado por The Cid James (Mensaje 523361)
Y tampoco puedo crear el archivo ini de esta forma :confused:
Código Delphi [-]
var    ini: TIniFile;  begin    ini := TIniFile.Create('C:\archivo.ini');
end;

Si usas las ultimas versiones de windows (7 y/o 10), seguramente el problema es que ya no puedes crear el fichero INI en el raíz del disco duro por los temas de permisos y seguridad del propio windows.

O lo guardas en otra carpeta con los permisos correctos para tu usuario o lo puedes guardar en la misma carpeta del proyecto. Para el segundo caso puedes usar este código:

Código Delphi [-]
  ConfigFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));

donde ChangeFileExt(Application.ExeName, '.ini') te va a devolver la misma ruta y nombre de aplicación cambiando la extensión a '.ini'

The Cid James 13-12-2017 10:32:44

Cita:

Empezado por Casimiro Notevi (Mensaje 523370)
Poco podemos decir si no vemos tu código.

Ese era todo el codigo que tenia en un boton para probar si guarda o no

Cita:

Empezado por bucanero (Mensaje 523371)
Si usas las ultimas versiones de windows (7 y/o 10), seguramente el problema es que ya no puedes crear el fichero INI en el raíz del disco duro por los temas de permisos y seguridad del propio windows.

O lo guardas en otra carpeta con los permisos correctos para tu usuario o lo puedes guardar en la misma carpeta del proyecto. Para el segundo caso puedes usar este código:

Código Delphi [-] ConfigFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));


donde ChangeFileExt(Application.ExeName, '.ini') te va a devolver la misma ruta y nombre de aplicación cambiando la extensión a '.ini'

Tengo permisos administrador y tambien intente guardarlo en mis documentos y en D:\, ejecutando delphi como administrador voy a probar en la carpeta del poryecto. Gracias

The Cid James 13-12-2017 23:58:44

No encontre forma al final tambien lei esto http://docwiki.embarcadero.com/RADSt...nd_TMemIniFile pero no puedo crear el archivo incluso en probe en otra pc en la note ... lo peor es que no me tira ningun error

Casimiro Notevi 14-12-2017 09:37:22

No puede ser, eso es algo básico y elemental.

The Cid James 14-12-2017 12:30:32

Mmm si estaba tratando de crear el .ini no importa el lugar donde lo trate de crear no lo crea, y dudo que tenga algo que ver con que uso delphi tokyo


en el boton solo tengo esto

Código Delphi [-]
procedure Tfconfiguracion.Button1Click(Sender: TObject);
var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
     Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
     Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
     if Ini.ReadBool( 'Form', 'InitMax', false ) then
       WindowState := wsMaximized
     else
       WindowState := wsNormal;
   finally
     Ini.Free;
   end;
end;

Casimiro Notevi 14-12-2017 12:45:06

Crea un proyecto nuevo, pon un botón, y en el onclick del mismo copia esto:
Código Delphi [-]
procedure TFmain.Button1Click(Sender: TObject);
var
  ifCfg : TIniFile;
begin
  try
    ifCfg := TIniFile.Create( 'algo.ini' );
    ifCfg.WriteString( 'BaseDatos','Ruta','\datos\' );
  finally
    ifCfg.free;
  end;
end;
En el directorio windows estará 'algo.ini'

bucanero 14-12-2017 19:13:58

Cita:

Empezado por The Cid James (Mensaje 523438)
Mmm si estaba tratando de crear el .ini no importa el lugar donde lo trate de crear no lo crea, y dudo que tenga algo que ver con que uso delphi tokyo


en el boton solo tengo esto

Código Delphi [-]
procedure Tfconfiguracion.Button1Click(Sender: TObject);
var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
     Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
     Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
     if Ini.ReadBool( 'Form', 'InitMax', false ) then
       WindowState := wsMaximized
     else
       WindowState := wsNormal;
   finally
     Ini.Free;
   end;
end;

Con este ejemplo que has puesto no te crea nada porque solo estas intentando leer del fichero INI, pero en ningún momento haces un comando de escritura. Si el fichero no existe con anterioridad con ese ejemplo tampoco te lo va a crear.
Para que se cree debes hacer primeramente un writeString, writeInteger, etc...


La franja horaria es GMT +2. Ahora son las 12:21:38.

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