Similar respuesta, pero con otra técnica:
Código Delphi
[-]
var ListaVentanas :TobjectList;
procedure FormPrincipalCreate();
begin
ListaVentanas := TobjectList.Create(True);
end;
function CrearUnaNueva:integer;
var F:Tform2;
begin
F := Tform2.Create(nil);
Result := ListaVentanas.Add(F);
end;
Procedure SetFocusToWindow(const indice:integer);
begin
if Assigned(ListaVentanas) and (ListaVentanas.Count >indice) then
TForm2(ListaVentanas.items[indice]).SetFocus;
end;
Procedure FormPrincipalClose(::;
begin
freeandnil(ListaVentanas);
end;
ListaVentanas es un Array pero de objetos, así no creamos variables para cada una de las ventanas, por contra, tendremos que acceder a través de su "indice".
Dependiendo de la implementación, quizás se pueda acceder a través de ListaVentanas.IndexOf
Busca por TobjectList, se ha explicado muchas veces su uso
Saludos