Delphi - multiples instancias de una ventana

 
Vista:

multiples instancias de una ventana

Publicado por oscar (14 intervenciones) el 29/03/2006 23:07:01
hola

necesito crear multiples instancias de una ventana (NO MDI), para ello hice lo siguiente:

myventana: Tmyventana;

function TForm1.creaVentana;
begin
myfrmViewer := TfrmViewer1.Create(Application);
end;
---------------------------------------
procedure Tmyventana.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

pero al partecer no me permite crear mas de una instancia de la clase (o sea del formulario) y la aplicacion genera una excepcion y termina.
Como hacerlo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:multiples instancias de una ventana

Publicado por Sebastian (2 intervenciones) el 30/03/2006 14:10:35
Supongo que en tu "codigo" myfrmViewer es una variable local a TForm1, entoces cuando queres crea mas de una instacia estas asignando algo a la variable ya inicializada ( o instancia, como prefieras llamarla ).
por si no me explique bien:
cuando creas la 1er instancia mufrmviewer vale nil, y le asignas algo, pero cuado queres crear la segunda estas pisando a la primera: por eso es que pincha.
lo que podes hacer es:
function TForm1.creaVentana;
begin
try
myfrmViewer.free;
except ...
end;
myfrmViewer := TfrmViewer1.Create(Application);
end;

o si queres multiples instancias SIMULTANEAS me parece que vas a tener que usar identificadores distintos (myfrmViewer1, myfrmViewer2, ...) o bien lo siguiente

function TForm1.creaVentana;
var myfrmViewer : Tfrmviewer;
begin
myfrmViewer := TfrmViewer1.Create(Application);
.....
//Quizas tengas que asignarle un Parent MyfrmViewer.Parent := Activeform.mdichild... o
// o algo parecido a eso para poder liberarlo mas adelante
end;

Esta ultima solucion es distinta de la primera poque cada vez que entra a la funcion crea una nueva referencia a una clase TfrmViewer, y no es siempre la misma como te sucedia antes. igual te dejo una alternativa a lo de arriba:

function TForm1.creaVentana;
begin
with TfrmViewer1.Create(Application) do
begin
.....
//Quizas tengas que asignarle un Parent MyfrmViewer.Parent :=
// Activeform.mdichild... o Self, o algo parecido a eso para poder liberarlo mas
// adelante
end;//Esto puede que funcione desde el compilador y no tan bien desde el .exe fijate
end;

otra cosa no se me ocurre
espero que te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar