A ver. Creo que ya nos liamos.
El código que pones no es correcto según la aclaración que hice en el último mensaje.
En frm1, para abrir el segundo formulario pones:
Código Delphi
[-]
if frm2 = nil then
begin
frm2 := Tfrm2.Create(Self);
end;
frm2.Show;
En el evento OnClose del segundo formulario pones:
Código Delphi
[-]
procedure Tfrm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
frm2 := nil;
end;
Si el segundo formulario está abierto entonces frm2 es distinto de nil y la condición en el primer código evita que se cree de nuevo.
Cuando cierras el segundo formulario, la asignación Action := caFree hace que el formulario se destruya y la asignación frm2 := nil vuelve a poner a nil la variable con la que te refieres al formulario. Entonces, cuando vuelves a intentar abrirlo, la condición (frm2 = nil) es ahora cierta y se vuelve a crear.
En cualquiera de los dos casos el formulario se muestra. Si ya existía, frm2.Show garantiza que se ponga al frente en caso de haber estado oculto por otra ventana.
// Saludos