La mejor manera de lograr esto es hacer que la forma que desea abrir se compruebe realmente para ver si ya existe. Para hacerlo, tu formulario debe declarar un procedimiento de clase. Declarado como un procedimiento de clase, el proceso puede invocarse independientemente de si el formulario existe o no.
Añadir a la sección pública de su forma
class procedure OpenCheck;
entonces el procedimiento se parece a esto
Class procedure TForm1.OpenCheck;
var
f: TForm1;
N: Integer;
begin
F := Nil;
With Application.MainForm do
begin
For N := 0 to MDIChildCount - 1 do
begin
If MDIChildren[N] is TForm1 then
F := MDIChildren[N] as TForm1;
end;
end;
if F = Nil then //we know the form doesn't exist
//open the form as the 1st instance/add a new constructor to open as 1st
else
//open form as subsequent instance/add new constructor to open as subsqt instance
end;
Añadir unidad de Form1 a la cláusula usos de su mdiframe.
Para abrir el formulario, llame al procedimiento de su clase, que a su vez llamará al constructor del formulario.
TForm1.OpenCheck;
Una palabra de advertencia usando procedimientos de la clase, no tienen acceso a cualquiera de los componentes/propiedades de la forma. Dado que el formulario en realidad no tiene que ser instanciado, acceder a ellos produciría una violación de acceso/eso es hasta que sepa que F no es nulo. Luego puede usar F. para acceder a los componentes/propiedades del formulario.
¿Por qué estás probando '> 0'? Seguramente la lógica correcta es '<> 0'. No es que ese sea tu problema, solo un lado. –
@David, a partir de Delphi 4, con la introducción de un tipo entero sin signo de 32 bits, los identificadores en Delphi no están firmados, por lo que técnicamente no hace diferencia. –
@Rob Sé que no importa el comportamiento, pero lógicamente es muy diferente. '> 0' implica que el orden es importante. '<> 0' indica que' 0' es un valor centinela. –