Тема: Мерцание
Показать сообщение отдельно
  #3  
Старый 29.11.2009, 19:32
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Вообще для анимации ни TImage, ни TTimer не подходят, я бы на твоем месте выбрал бы как минимум вместо TImage - TPaintBox, а вместо таймера использовал бы обычный цикл, вот пример данной реализации:

Код:
type

  TPigs = array of TJpegImage; //проолжаю идею Страдальца)

  TForm1 = class(TForm)
    Button1: TButton;       //кнопка старта и остановки анимации анимации
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FIsAnimation:boolean;    //определяет, включена ли анимация
    FAnimStopKadr:Integer;  //время задержки кадра
    FPigs:TPigs;                 // сами кадры
  public
    procedure UploadPigs;    //загрузка кадров
    procedure DestroyPigs;  //выгрзука кадров
    procedure StartAnimPigs;   //запуск анимации
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FIsAnimation:=false;  //при старте анимация отключена!
  FAnimStopKadr:=100; //задержка кадра 100 мс
  UploadPigs;  //загружаем картинки
end;

procedure TForm1.StartAnimPigs;
var
  b:byte;
begin
  b:=0;
  while FIsAnimation do
    begin
    PaintBox1.Canvas.Draw(0,0,FPigs[b]);
    Inc(b);
    if b > High(FPigs) then b:=0;
    Sleep(FAnimStopKadr);
    Application.ProcessMessages;
    if Application.Terminated then FIsAnimation:=false;
    end;
end;

procedure TForm1.UploadPigs;  //загрузка картинок в массив
var
  b:byte;
begin
  SetLength(FPigs, 5);
  for b:=Low(FPigs) to High(FPigs) do
    begin
    FPigs[b]:=TJPEGImage.Create;
    //файлы с картинками pig1.jpg, pig2.jpg и т. д..
    FPigs[b].LoadFromFile(ExtractFilePath(Application.ExeName)+'pig'
                                   +IntToStr(b+1)+'.jpg');
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FIsAnimation:=not FIsAnimation;
  if FIsAnimation then StartAnimPigs;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FIsAnimation:=false;
  Application.ProcessMessages;
  DestroyPigs;
end;

procedure TForm1.DestroyPigs;
var
  b:byte;
begin
  for b:=Low(FPigs) to High(FPigs) do
    FPigs[b].Destroy;
  SetLength(FPigs, 0);
end;

Проверил, все работает на ура)
Ответить с цитированием