PDA

Ver la Versión Completa : Limites de Delphi


walito
15-11-2007, 21:28:21
Les cuento que ya me estoy cansando de esto.

Como el titulo dice, quiero saber si lo que estoy haciendo tiene algun limite o no, ya que no me anda o yo soy un verdadero inutil.
Resulta que cuando cargo una libreria BPL necesito pasarle algun parametro al Create. Como es un TForm yo me hice mi clase:


type
TFormConPermisos = class(TForm)
public
constructor Create(AOwner: TComponent; datoExtra: string); reintroduce;
end;


implementation

constructor TFormConPermisos.Create(AOwner: TComponent; datoExtra: string);
begin
inherited Create(AOwner);
end;


Entonces cuando instancio mi BPL el codigo de la funcion es asi:


function TModules.loadModule(moduleName: string): Integer;
var
AClass: TPersistentClass;
Formulario: TFormConPermisos;
begin
{* verifico que el modulo existe, junto con el archivo *}
if
FileExists(ExtractFilePath(ParamStr(0))+moduleName)
and
(moduleName <> '')
then
begin
{* Cargo el modulo a memoria *}
handle := LoadPackage(ExtractFilePath(ParamStr(0))+moduleName);

{* si es un modulo válido *}
if handle <> 0 then
begin
try
AClass := GetClass(CLASSBPL);

try
if AClass <> nil then
begin
LockWindowUpdate(Handle);
EnableAnimation(false);

Formulario := TFormConPermisos(AClass).Create(Application, 'MI DATO EXTRA') as TFormConPermisos;

EnableAnimation(true);
LockWindowUpdate(0);

Formulario.Show;

Result := 0;
end;
except
on E:Exception do
Result := -1;
end;
except
on E:Exception do
Result := -2;
end;
end
else
Result := -3;
end
else
Result := -4;
end;


Esta funciona asi: loadModule('miLibreria.bpl');

Cuando esto se ejecuta, y hace el Create dentro de este nuevo Create en el inherited Create(AOwner); da error de access violation, en realidad ya no se que probar, en google nunca parece que alguien halla realizado esto.

Esta bien la herencia que estoy haciendo?
De que otra forma puedo pasarle parametros?

Gracias y ya no jodo mas.
Si algun dia averiguo como es, va un tutorial para todos ustedes.

Lepe
15-11-2007, 23:45:05
Ese datoExtra ¿es imprescindible para construir la ventana?

En la mayoría de los casos, se puede crear una propiedad del Form para asignar su valor, con métodos Get y Set si se necesita.

Algunas veces queremos ahorrar una línea de código pasando parámetros a métodos, cuando por diseño, no debe ser así. Realmente no sé si es tu caso.

Saludos

walito
16-11-2007, 01:22:10
El dato es necesario ser pasado antes del Show, ya que en teoria ahi tendria que pasar alguna estructura y recibir alguna estructura sobre permisos, estos permisos hacen que se habiliten o no botones segun sus permisos por ejemplo.

Como podrias dices tu hacer el get y set antes del Show?
Todos mis modulos llevarian el mismo metodo set y get, recuerda que yo no pongo en mi USES estas form, ya que son cargados en forma dinamica.

Gracias

Sinaloense
16-11-2007, 06:26:27
tu problema esta aqui:

constructor Create(AOwner: TComponent; datoExtra: string); reintroduce;

debe ser:

constructor Create(AOwner: TComponent; datoExtra: string); reintroduce; overload;

walito
16-11-2007, 14:52:29
Gracias por tu respuesta, ya lo habia probado igual tira access violation :(

Ahora me surgio una duda que seguro esta aca pero no entiendo.

El codigo original que funciona y levanta bien una BPL y muestro el Form es:


var
Formulario: TForm;



Formulario := TComponentClass(AClass).Create(Application) as TForm;


Ahora segun entiendo yo lo hago asi:


var
Formulario: TFormConPermisos; //Mi clase con el Create modificado



Formulario := TFormConPermisos(AClass).Create(Application, 'Mi dato extra');


No se si estoy haciendo bien de castear ACLass asi.

ALgun comentario?

Gracias

duilioisola
16-11-2007, 15:32:34
Yo de esto no se mucho, peeeero:

¿Y si creao otro constructor?


constructor TFormConPermisos.CreateConPermisos(AOwner: TComponent; datoExtra: string);
begin
inherited Create(AOwner);
end;