PDA

Ver la Versión Completa : Herencia externa de componentes (BPL)(RTTI)


jednavlop
05-11-2010, 04:55:07
Hola a todos.! Este es el primer tema que hago.. espero que no sea el ultimo.
Tengo algunas pequeñas dudas... Quisiera y les agradeceria mucho si me ayudaran .

He cargado 2 paquetes dinamicos. Cada paquete contiene un formulario.

¿Es posible hacer que un formulario herede del otro? ¿Como lo lograria?

He visto algunos ejemplos en este foro donde definen metodos con abstract y virtual... ¿Para que sirven estos?

¿Es posible llamar a un procedimiento o funcion pasandole parametros?

Estoy empezando en esto. De antemano gracias

Neftali [Germán.Estévez]
05-11-2010, 11:47:27
Hola a todos.!


Hola y bienvenidoa los foros.


He cargado 2 paquetes dinamicos. Cada paquete contiene un formulario.
¿Es posible hacer que un formulario herede del otro? ¿Como lo lograria?


En diseño basta con que crees un formulario que herede del anterior, no importa que estén en diferentes packages; Lo que sí povocará eso es que el segundo package quedará "ligado" de forma estática al primero.
Es normal, ya que se el formulario del package2 deriva del formulario del package1, al cargar el package2 se cargará el package1 (puesto que lo has utilizado en diseño para la herencia).


He visto algunos ejemplos en este foro donde definen metodos con abstract y virtual... ¿Para que sirven estos?


Son "variaciones" que se aplican al funcionamiento de un método/procedimiento de un objeto.

Abstract indica que el método no está definido en el actual clase y que deberá ser obligatoriamente redefinido en las clases "hijas" que deriven de esta.

Virtual indica que el método/procedimiento de la clase actual (el que está marcado así) puede ser sobreescrito (override) en las clases hijas (derivadas de la actual).


¿Es posible llamar a un procedimiento o funcion pasandole parametros?


Sí.


function suma(num1, num2:integer):integer;

...

res := suma(3,5);


Tal vez no entendí bien esta última pregunta... :o

jednavlop
05-11-2010, 15:04:50
Tal vez no entendí bien esta última pregunta...

Gracias por responder,, me has aclarado mucho el tema.
No me explique bien en la ultima pregunta, lo que quiero saber es como llamar a una funcion o procedimiento que este dentro de una clase obtenida de un paquete externo dinamico, claro pasandole parametros.

// SaludOS y gracias

Neftali [Germán.Estévez]
05-11-2010, 17:34:50
Luego con tranquilidad pensé que podía ser eso... ;)
En mi caso lo hago así (te orto un trozo de programa para que veas el funcionamiento):


...
const
RUNBROWSE_METHOD = 'RunBrowse';
var
_FormBrowse:TForm;
_FormBrowseClass:TFormClass;
Routine: TMethod;
begin

// recuperar el proceso y asi el formulario de browse
_FormBrowseClass := YTrazProc.FormBrowseClass;
// Creamos el form para acceder a los métodos
_FormBrowse := _FormBrowseClass.Create(Self);
// Bloque de proteccion para liberar
try
// Acceso a la rutina
Routine.Data := Pointer((_FormBrowse as _FormBrowseClass));
// Devuelve la dirección de un método published
Routine.Code := (_FormBrowse as _FormBrowseClass).MethodAddress(RUNBROWSE_METHOD);

finally
// Liberamos el form
FreeAndNil(_FormBrowse);
end;

// No ha encontrado el código de la rutina...
if (Routine.Code = nil) then begin
Exit;
end;

// hacer la llamada al RunBrowse
i := TExecuteRunBrowse(Routine)(_FormBrowseClass,
[ATTR_TYTRAZA],
[Traza],
[tsEqual],
[False],
['FechaHora']);

FFormBrowseTraz := YTrazProc.FormBrowse;
end;
end;


He quitado algun trozo que sobra, pero las operaciones básicas están.
El tipo del procedimietno está definido con todos los parámetros:


//: Tipo para ejecutar un método de clase RunBrowse
TExecuteRunBrowse = function (FormBrowseClass: TFormClass;
AttrName : Array of string;
AttrValue : Array of Variant;
Operator : Array of TSQLOperator;
IsNot : Array of Boolean;
...): Integer of object;

jednavlop
05-11-2010, 18:37:14
BINGO!,, funciona!. ya he podido llamar a una metodo con parametros.

Te agradesco por la ayuda Neftali.

//SaludOS