Pregunta

Tengo un problema con una interfaz que consiste en varios cuadros (normalmente 25) dentro de un TSCrollbox.

Hay 2 problemas, y espero que uno sea una consecuencia del otro ...

Fondo:

Cuando se inicia la aplicación, creo 25 cuadros, cada uno que contiene aprox. 20 controles, que luego se poblan con la información predeterminada. El usuario puede hacer clic en un control para limitar la búsqueda a un subconjunto de información en el que liberé y recree mis marcos (ya que la búsqueda puede devolver <25 registros)

El problema:

Si renuncié a la aplicación después de la búsqueda inicial, toma aprox. 5 segundos para regresar a Delphi. Después de la segunda búsqueda (y eliminar / recrear de los marcos) toma aprox. 20 segundos)

Si bien podría reescribir la aplicación para crear solo los marcos una vez, me gustaría entender lo que está sucediendo.

Aquí está mi rutina de creación:

procedure TMF.CreateFrame(i: Integer; var FrameBottom: Integer);
var
   NewFrame: TSF;
begin
   NewFrame := TSF.Create(Self);
   NewFrame.Name := 'SF' + IntToStr(i);
   if i = 0 then
      NewSF.Top := 8
   else
      NewSF.Top := FrameBottom + 8;
   FrameBottom := NewFrame.Top + NewFrame.Height;
   NewFrame.Parent := ScrollBox1;
   FrameList.Add(NewFrame);
end;

Y aquí está mi rutina de eliminación:

procedure TMF.ClearFrames;
var
   i: Integer;
   SF: TSF;
begin
   for i := 0 to MF.FrameList.Count -1  do
   begin
      SF := FrameList[i];
      SF.Free;
   end;
   FrameList.Clear;
end;

¿Qué me estoy perdiendo?

¿Fue útil?

Solución

A medida que toma el control sobre la asignación de memoria de los cuadros que está creando al liberarlos, por lo que no es necesario proporcionarlo como parámetro del propietario en el constructor Crear. Pase nulo en su lugar para evitar que el propietario intente liberar el marco.

Además, no me guste el aspecto de su rutina Clearframes. Prueba esto en su lugar:

while FrameList.count > 0 do
begin
    TSF(Framelist[0]).free;
    Framelist.delete(0);
end;
Framelist.clear;

Otros consejos

Si desea saber por qué su aplicación está tardando tanto en hacer algo, intente perfilarla. Intenta correr Perfilador de muestreo contra tu programa. El archivo de ayuda explica cómo limitar el perfil a solo una sección específica de su aplicación, que podría usar solo para obtener resultados de muestreo en las piezas de compensación o creación. Esto debería mostrarle dónde está pasando la mayor parte de su tiempo y eliminar muchas de las conjeturas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top