Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   FireMonkey (https://www.clubdelphi.com/foros/forumdisplay.php?f=50)
-   -   fmx dll form (https://www.clubdelphi.com/foros/showthread.php?t=95706)

balger 27-05-2022 23:16:43

fmx dll form
 
Hola a todos.
Tengo el sig. caso.
en un DLL el procedimiento exportado

Código Delphi [-]
procedure Showxxx; stdcall;
var
  f: Txxx;

begin
  f := Txxx.Create(nil); (FMX)
  f.ShowModal(
    procedure(ModalResult: TModalResult)
    begin
    end);
end;

exports
  Showxxx;

end.

en Txxx

Código Delphi [-]
procedure Txxx.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ModalResult := mrOk;
  Action := TCloseAction.caFree;
end;

El codigo anterior funciona bien desde un exe (no dll)
Cuando cierro el form, en la barra de tareas de Windows se puede observar la vertana abierta (sin imagen). Y al liberar la dll se produce un error de "Access violation".
Estoy usando D10.3 y Firemonkey.

dec 28-05-2022 09:09:41

Hola a todos,

No estoy seguro, pero, ¿tal vez sea porque la variable "f" es una variable local en el procedimiento "Showxxx"? Sería fácil de probar: en lugar de usar es variable local, podrías situar la variable fuera del procedimiento "Showxxx". Por otro lado, mientras escribo se me ocurre, que, si vas a mostrar el formulario de forma "modal", entonces tú mismo podrías usar "f.Free" en el mismo procedimiento "Showxxx".

Yo creo que probaría primero con lo último, es decir, con liberar tú mismo con "f.Free", luego de haber mostrado el formulario, de forma que "Action := TCloseAction.caFree;" no fuese necesario. Si pruebas moviendo la variable "f" afuera del procedimiento "Showxxx", también podría omitirse el uso de "Action := TCloseAction.caFree;", acaso, utilizando la cláusula "finalization" de la unidad / archivos de proyecto, es decir, liberar la ya variable "global" en dicha cláusula "finalization".

P.D. En la cláusula "finalization", si al final te decantas por esto, tendrás que comprobar que la instancia del formulario existe realmente en la variable (f <> nil), puesto que al final eso es lo que parece que está ocurriendo: "Action := TCloseAction.caFree;" está intentando liberar una instancia que no existe, ya digo, si no me equivoco, porque dicha instancia se guarda ahora mismo en la variable local "f", y, esta se libera automáticamente cuando se sale del procedimiento "Showxxx".


La franja horaria es GMT +2. Ahora son las 20:02:33.

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