Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Limites de Delphi (https://www.clubdelphi.com/foros/showthread.php?t=50382)

walito 15-11-2007 21:28:21

Limites de Delphi
 
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:

Código Delphi [-]
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:

Código Delphi [-]
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:

Código Delphi [-]
constructor Create(AOwner: TComponent; datoExtra: string); reintroduce;

debe ser:

Código Delphi [-]
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:

Código Delphi [-]
var
  Formulario: TForm;

Código Delphi [-]
Formulario := TComponentClass(AClass).Create(Application) as TForm;

Ahora segun entiendo yo lo hago asi:

Código Delphi [-]
var
  Formulario: TFormConPermisos; //Mi clase con el Create modificado

Código Delphi [-]
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?

Código Delphi [-]
constructor TFormConPermisos.CreateConPermisos(AOwner: TComponent; datoExtra: string);
begin
   inherited Create(AOwner);
end;


La franja horaria es GMT +2. Ahora son las 05:29: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