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 11-11-2005
pepecharlie67 pepecharlie67 is offline
Miembro
 
Registrado: nov 2005
Posts: 48
Poder: 0
pepecharlie67 Va por buen camino
Ayuda!!Cambiar valor de una variable en biblioteca

Hola,tengo un problema. Estoy creando una aplicacion no grafica y os muestro mi problema.A ver,creo una unidad donde declaro una variable booleana(esta variable la declaro en la parte de interfaz),la meto en la libreria donde tengo que inicializarla con un valor. Has ta aqui todo bien pero,¿como cambio su valor en la aplicacion?Se que es con las funciones get y set pero no se como utilizarlas.
AYUDENME!!
Muchas gracias por adelantado.
Responder Con Cita
  #2  
Antiguo 11-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Libreria le llamas a una dll o bien a un archivo .pas

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 11-11-2005
pepecharlie67 pepecharlie67 is offline
Miembro
 
Registrado: nov 2005
Posts: 48
Poder: 0
pepecharlie67 Va por buen camino
Libreria le llamo a .dll.A ver te cuento.Tengo una unidad donde la declaro y la inicializo en la biblioteca, y quiero cambiar su valor desde la aplicacion no grafica(creo que me expresado bien).
Gracias
Responder Con Cita
  #4  
Antiguo 12-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No estoy muy puesto en estos temas (como en tantos otros) pero, haciendo alguna prueba, llegué hasta donde voy a motrar sin demasiados problemas: es probable que pueda hacerse de mejor forma, no lo pondré yo en duda, pero, en fin, esto que ahora verás parece funcionar a simple vista:

Lo primero es crear un archivo "dll". Nota que la variable en este caso no está en una unidad aparte, pero, se declara en el propio archivo principal del proyecto "dll", de otro modo, es decir, si declaráramos la variable en otra unidad creo que la cosa funcionaría de la misma forma.

Código Delphi [-]
 library Ejemplo;
 
 {$R *.res}
 
 var
   FVariable: string;
 
 function GetVariable : string;
 begin
   Result := FVariable;
 end;
 
 procedure SetVariable(valor: string);
 begin
   if (FVariable <> valor) then
     FVariable := valor;
 end;
 
 exports GetVariable;
 exports SetVariable;
 
 begin
   FVariable := 'ClubDelphi.com';
 end.
Ese sería el código del proyecto "DLL". ¿Cómo acceder a la variable "FVariable" y cambiar su valor? Pues qué tal si declaramos las funciones que nos interesan de la "DLL" en la aplicación en donde tengamos necesidad de ellas, tal que de este modo:

Código Delphi [-]
   function GetVariable : string; external 'Ejemplo.dll' name 'GetVariable';
   procedure SetVariable(valor: string); external 'Ejemplo.dll' name 'SetVariable';
Y, en realidad, eso es todo. Haciendo algunas pruebas, como he dicho, aunque pueda haber mejores formas, que no lo discuto, he podido acceder a la variable declarada e inicializada en la "DLL" y también cambiar su valor. Si te sirvió de algo tanto rollo me alegro.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 12-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Si estas programando para Win32 y trabajas con Threads, esa variable tiene que ser declarada como:

Código Delphi [-]
threadvar
  Fvariable:string

Si estas programando para 16 bits, debes saber que esa variable se comparte para todos los Threads.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 13-11-2005
pepecharlie67 pepecharlie67 is offline
Miembro
 
Registrado: nov 2005
Posts: 48
Poder: 0
pepecharlie67 Va por buen camino
Ok,muchas gracias por vuestro tiempo. En principio me ha servido de ayuda. Pero una cosa sigo sin tener clara,a ver os cuento..

Lo que aparece en mi unidad 1(UNIT 1) es:
INTERFACE
.
.
VAR
V:boolean;
.
.
IMPLEMENTATION
.
.
END.

Por lo tanto, exporto la variable boolena V.

Ahora al hacer la biblioteca(Lib.dll);


USES
Unit1;

PROCEDURE SetVale(V:boolean);
BEGIN
V:=False;
END;
FUNCTION GetVale:boolean;
BEGIN
GetVale:=V;
END;
EXPORTS SetVale,GetVale;
BEGIN
V:=True;
END;

Bueno esto es lo que contiene mi libreria.
Al hacer la unidad de importacion tengo,
INTERFACE
PROCEDURE SetVale(V);
FUNCTION GetVale:boolean;

IMPLEMENTATION
PROCEDURE SetVale(V);EXTERNAL 'Lib.dll';
FUNCTION GetVale:boolean; EXTERNAL 'Lib.dll';

Bueno hasta aqui todo bien,pero el problema viene cuando quiero acceder a estos subprogramas desde la aplicacion.Lo logico seria llamar a los subprogramas con:

SetVale(V);
V:=GetVale;

pero claro logicamente me dice que v no esta declarada,¿como lo modifico?Muchas gracias por vustro tiempo de verdad.
Responder Con Cita
  #7  
Antiguo 13-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Código Delphi [-]
 PROCEDURE SetVale(V:boolean);
BEGIN
V:=False;
END;
Por tu bien, declaralo así:
Código Delphi [-]
 PROCEDURE SetVale(Value:boolean);
BEGIN
V:=Value;
END;
Comentar que no le dabas el valor a V, sino que lo ponias a false.

En la librería, V no debería estar en la zona de interface, simplemente porque el usuario de la librería jamás va a acceder a la variable directamente, sino a través de Get y SetValue.

No he hecho la prueba, quizás ni siquiera se exporte esa variable, pero intuitivamente, al verla en la zona de interface, puede parecer que si se exporta. Es decir, deberás declararla en la zona de implementation.

Por otra parte, el error que tienes al usar la libreria es de nombres, en tu programa, no uses V para nada, Si necesitas una variable Boolean, declarala con otro nombre. En realidad, cuando usas la libreria, tienes que olvidarte de como está hecha, y solo prestar atención a GetValue y SetValue. Esa abstracción es indispensable para diseñar la dll correctamente, y también para poderla usar (OOP).

Como usuario de una libreria no tienes por qué saber como se llama esa variable, ni te hace falta.


Código Delphi [-]
 SetValue(checkbox1.checked);
 Checkbox2.Checked := GetValue;

Según actives o desactives el check1, se marcará el check2.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 13-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Si me permites un detalle más, cuando hagas una dll, haz también un archivo .pas asociado a él. La libreria queda como ya la has hecho, el archivo .pas sería el siguiente:

Código Delphi [-]
Unit LibExport;

interface

 PROCEDURE SetVale(V:Boolean);
 FUNCTION GetVale:boolean;
implementation

 PROCEDURE SetVale(V);EXTERNAL 'Lib.dll';
FUNCTION GetVale:boolean; EXTERNAL 'Lib.dll';
end.

Imagina que tu librería vas a usarla en 2 programas distintos. Cuando vayas a usarla en el segundo programa, ya no recuerdas el nombre de las funciones ni los parámetros que lleva, entonces, tienes que abrir el primer programa, ver las declaraciones y copiar / pegar en el segundo programa.

Al hacer este .pas, en el segundo programa, solo añades la unidad LibExport y accedes a su contenido; ya puedes ver las declaraciones. De hecho es como lo hace la VCL.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 13-11-2005
pepecharlie67 pepecharlie67 is offline
Miembro
 
Registrado: nov 2005
Posts: 48
Poder: 0
pepecharlie67 Va por buen camino
Ya lo he conseguido arreglar.Muchas gracias a los que se han molestado en ayudarme.Me habeis servido de mucha ayuda.Gracias!
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


La franja horaria es GMT +2. Ahora son las 03:10:59.


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