Llego 5 días tarde, pero en fin, daré mi opinión, ya que me doy por aludido en el tema.
Cuando he estado en una situación similar (scrollBox con Tframes), la forma más rápida de sincronizar ambos es:
- Los frames y paneles con Owner al ScrollBox
- Al borrar un panel, refrescar todo
, es decir, hacer un scrollbox.DestroyComponents (que no debería usarse... pero está ahí para ser usado
), y después inicializar el array (poniendo los frames del array a nil, ya que el ScrollBox los liberó). Por ultimo, creo todos los paneles/frames de nuevo.
Otro método (sería lo suyo, pero implica más trabajillo), usar el Notification, me explico:
Cuando un componente del Form se va a liberar, informa a su dueño (si lo tiene) de este hecho, de forma que el dueño, no intentará liberarlo cuando se cierre. Ejemplito:
Un form con un botón y un TEdit, en el botón pones el código "edit1.Free".
Ejecutas el proyecto, pulsas el botón (el Edit desaparece del Form) y cierras el proyecto con la X roja.
No produce ningún error, porque el Edit informó al Form que se iba a liberar y ya el Form lo quitó de su lista de componentes que controla su destrucción.
Si el Form intenta liberar por segunda vez el Edit,daría un Access Violation.
Solo hay un problema: que tu array se entere que el componente frame se ha liberado. Para eso, puedes guardar en el Frame.Tag el índice donde se encuentra en vLista.
No tenemos ese código, pero en algún momento harás algo así:
vLista[n].vFrame := FrameRecienCreada;
pues agregas otra línea:
FrameRecienCreada.Tag := n ;
Y ahora en el form, añades lo siguiente:
Código Delphi
[-]
type TForm1 = class(TForm)
private
protected
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Notification(AComponent: TComponent;
Operation: TOperation);
var indice: Integer;
begin
inherited Notification(AComponent, Operation);
if (AComponet is TFrame) and (operation = opRemove) then begin
indice := TFrame(Acomponet).Tag;
vLista[indice].vFrame := nil ;
end;
end;
Saludos!