Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Hay alternativa a DoubleBuffered? (https://www.clubdelphi.com/foros/showthread.php?t=75222)

Panasys 05-08-2011 21:22:26

Hay alternativa a DoubleBuffered?
 
Hola amigos, he utilizado bastante DoubleBuffered en mis apps debido a que utilizo imágenes que se cargan o cambian en tiempo de ejecución.

El parpadeo desaparece o por lo menos es mucho menor, pero la interfaz cambia mucho, los panels pasan a blanco y no toman el color del form, los botones tienen un borde no muy estetico, fallan los labels que muestran distinta informacion segun las variables del momento etc etc. :eek:

Si no lo uso, tengo el parpadeo :(

Bien y entonces ? :confused:

Hay alguna alternativa? o es eso o nada? (Uso Delphi 7 y Win7)

Un abrazo.

Javier

maeyanes 05-08-2011 21:33:16

Hola...

Solo úsala en los componentes donde en realidad se necesite evitar el parpadeo. La mayoría de los controles funcionan de forma correcta con DoubleBuffered desactivado.



Saludos...

Panasys 05-08-2011 23:01:53

Pero no se usarlo por componente :(

Podrias ayudarme?

En el form lo activo desde el Create.

Pero en un TIMage no me aparece como una opcion o propiedad.

Gracias

Javier

ecfisa 05-08-2011 23:21:15

Hola Panasys.

Algo que te va a aligerar la carga de imágenes desde disco (LoadFromFile) es hacer una carga previa en un TList de las imágenes que vayas a utilizar.

Te hice un ejemplo general, pero lo podés modificar sin mucho problema para adaptarlo a tu necesidad.
Código Delphi [-]
...
uses Jpeg;

procedure CargarImagenes(Ruta, Ext: string; Lst: TList; SLst: TStrings);
var
  P: TPicture;
  B: TBitMap;
  SR: TSearchRec;
begin
  Lst.Clear;
  P:= TPicture.Create;
  try
    Ruta:= IncludeTrailingPathDelimiter(Ruta);
    if FindFirst(Ruta+Ext, faArchive, SR) = 0 then
    begin
      repeat
        P.LoadFromFile(Ruta+SR.Name);
        B:= TBitMap.Create;
        B.Height:= P.Graphic.Height;
        B.Width := P.Graphic.Width;
        B.Canvas.Draw(0,0,P.Graphic);
        Lst.Add(B);
        SLst.Add(SR.Name);
      until FindNext(SR) <> 0;
      FindClose(SR);
    end;
  finally
    P.Free;
  end;
end;

Un ejemplo de llamada:
Código Delphi [-]
procedure TForm1.btnCargarClick(Sender: TObject);
var
  i: Integer;
  LstImg: TList;
  TS: TStrings;
begin
  LstImg:= TList.Create;
  TS:= TStringList.Create;
  try
    CargarImagenes('C:\TEMP', '*.JPG', LstImg, TS);
    for i:= 0 to LstImg.Count -1 do
    begin
      Image1.Picture.Bitmap:= LstImg[i];
      ShowMessage(TS[i]);
    end;
  finally
    LstImg.Free;
    TS.Free;
  end;
end;
Claro que en el momento de la carga se produce una demora, pero es una sola vez, además si hay que mostrar otra vez una imágen,
no hay que ir al disco a buscarla...

Saludos.

Panasys 06-08-2011 17:39:41

Me parece una excelente idea y el codigo buenisimo, lo voy a probar, esto funcionaria para PNG?

Ya tengo el componente PNG en mi D7 instalado, ya que creo iconos que el usuario cambia en una pantalla y tienen transparencias.

Despues estas imagenes tendran las propiedades Drag and Drop para que el usuario las acomode donde le queden bien.

Lo voy a probar y mil gracias. Igual sigo sin saber como usar DoubleBuffered en cada componente sin agregarlo directamente al form.

Sera que no lo trae el D7?

Un abrazo y gracias como siempre.

Javier

ecfisa 06-08-2011 21:45:30

Hola Panasys.

Cita:

Ya tengo el componente PNG en mi D7 instalado, ya que creo iconos que el usuario cambia en una pantalla y tienen transparencias.
Realmente no lo sé, también uso D7 pero no tengo ese componente :(, vas a tener que probar...

Cita:

Igual sigo sin saber como usar DoubleBuffered en cada componente sin agregarlo directamente al form.
Si al inicio del form haces:
Código Delphi [-]
begin
  DoubleBuffered:= True
end;
La propiedad será aplicada a todos los componentes que desciendan de TWinControl y pertezcan a dicho form, es decir que si no lo hacés el valor por defecto será False. Luego podrás poner la propiedad DoubleBuffered en True en cada componente, siempre que descienda de la clase TWinControl por supuesto.

Un saludo. :)

Panasys 06-08-2011 22:57:56

Gracias ! :D

Mas claro imposible ! :)

Ahora me pondre a trabajar.

El componente es el MPNG, lo unico que hace es que el TImage te acepte PNG.

No te agrega nada a la paleta, anda bien.

Saludos y gracias nuevamente.

Javier


La franja horaria es GMT +2. Ahora son las 10:03:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi