Ma non serve array.
Nel senso crei la form associata ad un'applicazione. Questa viene messa nella lista dei componenti dell'applicazione. Se fai un array crei un doppione.
Banalmente:
Application.createform (tipoform variabileform);
Variabileform.show;
Nella form puoi mettere un onclose che faccia la pulizia della memoria.
Lavori solo con una varibile alla volta. Il framework fa il resto.😉
Allora.
Di base Form e DataModule sono componenti.
Ogni componente notifica quando viene distrutto. (FreeNotification).
Se il datamodule che istanzi, crea la form, basta mettere una property al datamodule con la form appena creata.
Aggiungi la onClose che distrugga l'istanza l'istanza.
protected procedure TComponent.Notification( AComponent: TComponent; Operation: TOperation); virtual;
A questo metodo arrivano tutte le notifiche di distruzione e creazione dei componenti.
Quindi calando nel contesto il discorso.
TDataModuleController=class(TDataModule)
protected
FView : TForm;
....
public
property TargetView : TForm;
protected
procedure Notification( AComponent: TComponent; Operation: TOperation); override;
...
constructor Create(AOwner : TComponent);
end.
Constructor TDataModuleController.Create;
begin
inherited Create(aOwner);
Application.CreateForm(TForm, FView);
FView.FreeNotification(self);
end;
procedure TDataModuleController.Notification( AComponent: TComponent; Operation: TOperation);
begin
if (operation = opRemove) and (aComponent=FView) then
begin
FView := nil; // pulisci solo il riferimento, non eliminarlo, altrimenti incorri in errori di violazione.
Destroy;
end;
end;
Logicamente tutti i dataset e datasource li devi assegnare correttamente. Altrimenti comanda la configurazione fatta graficamente.
FDataModule.Name := ''; // That will avoid pointing to the same datamodule
Questo serve a non far scattare un errore di "Nome duplicato"...