PDA

Ver la Versión Completa : Zeos Lib - Configuracion manual de componentes


The Cid James
10-12-2017, 12:57:37
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, 15:19:18
... 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, 17: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, 11: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:


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

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, 19:56:10
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:


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?

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, 10:55:03
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.


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:

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/foros/showthread.php?t=24075

Un Saludo

The Cid James
12-12-2017, 23: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 (https://www.clubdelphi.com/foros/showthread.php?t=1470) y un par mas que encontre en el foro y otros lados y no logro comprender que tipo de varialbe es

MiFichero := TiniFile.Create (Fichero);

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

Casimiro Notevi
13-12-2017, 00:11:22
http://www.clubdelphi.com/foros/showthread.php?t=91005&highlight=TiniFile

The Cid James
13-12-2017, 00:21:15
http://www.clubdelphi.com/foros/showthread.php?t=91005&highlight=TiniFile

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, 10:26:50
Poco podemos decir si no vemos tu código.

bucanero
13-12-2017, 11:20:10
Y tampoco puedo crear el archivo ini de esta forma :confused:
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:


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, 11:32:44
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

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 [-] (https://www.clubdelphi.com/foros/#) 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
14-12-2017, 00:58:44
No encontre forma al final tambien lei esto http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_TIniFile_and_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, 10:37:22
No puede ser, eso es algo básico y elemental.

The Cid James
14-12-2017, 13: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

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, 13:45:06
Crea un proyecto nuevo, pon un botón, y en el onclick del mismo copia esto:
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, 20:13:58
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

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...