Ver Mensaje Individual
  #8  
Antiguo 17-05-2015
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 28
Lepe Va por buen camino
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
    { Private declarations }
  protected
    procedure Notification(AComponent: TComponent;
      Operation: TOperation); override;

  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Notification(AComponent: TComponent;
  Operation: TOperation);
  var indice: Integer;
begin

// AComponent es el componente del Form que se va a liberar. Todavía está vivo.
// Operation puede ser opInsert (que se va a insertar en el Form) o bien opRemove (que se va a quitar del Form)
  inherited Notification(AComponent, Operation);
  if (AComponet is TFrame) and (operation = opRemove) then begin
    indice := TFrame(Acomponet).Tag;
    vLista[indice].vFrame := nil ;
  end;
end;

Saludos!
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita