Не работает анимация на Ubunta

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не работает анимация на Ubunta

Сообщение zoltanleo » 04.11.2013 00:11:30

Чет лыжи не едут, куски кода из Дельфей пробую перетащить в CodeTyphon 4.5. В Виндах все прекрасно работает, в Ubuntu 13.04 компилятор ругается

Изображение

и вместо анимации выдает следующее

Изображение

хотя в Винде это выглядит так

Изображение

=====================================================

Вот куски кода

1. Запуск потока
Код: Выделить всё
procedure TFrmMain.Button1Click(Sender: TObject);
var ThisThread: TMyThread;
begin
  //запускаем подключение в потоке
  BoolFlag:= True;

  ThisThread:= TMyThread.Create(False);
  ThisThread.Priority:= tpLower;
  ThisThread.FreeOnTerminate:= True;

  ExecuteSplash('Запускаем процесс',BoolFlag, TmpStr);
end;         


2. Имитируем бурную деятельность в дополнительном потоке
Код: Выделить всё
{ TMyThread }

procedure TMyThread.Execute;
var i: Integer;
begin
  i:= 0;
  while i < 1000 do
    begin
      inc(i);
      TmpStr:= IntToStr(i);
      sleep(10);
    end;
  Terminate;//прибиваем поток
  BoolFlag:= False;// даем сигнал кончать анимацию
end; 


3. Рисуем анимашки, отвлекая внимание
Код: Выделить всё
procedure TFrmMain.ExecuteSplash(const AStr: string; var ThreadFlag: Boolean; var PrmStr: String);
var DotCount, NumFrame: Integer;
    ListDisabled : TList;
begin
  DotCount:= 1;//счетчик точек в строке
  NumFrame:= 0;//номер текущей картинки TImageList
  ListDisabled := Screen.DisableForms(FrmSplash);//"замораживаем" все окна, кроме сплаша и запоминаем их в список

  with FrmSplash do
    begin
      //отрисовываем сплаш посередине родителя
      Top:= Self.Top + (Self.Height - Height) div 2;
      Left:= Self.Left + (Self.Width - Width) div 2;
      Show; //показываем сплаш-окно
    end;

  while ThreadFlag do
    //крутим цикл, пока не завершится дополнительный поток
    begin
        if FrmSplash.ImgListSplash.Count <> 0 //если список с картинками не пуст
          then
            begin
              if NumFrame = 2 then
                begin
                  Inc(DotCount);//увеличиваем кол-во точек в конце текста через каждые 2 кадра анимации
                  if DotCount > 4 then // если точек больше 4, то начинаем добавлять с одной
                    DotCount := 1;
                end;
            end
          else //если список пуст, то будет отображаться статичная иконка приложения
            begin
              Inc(DotCount);
              Sleep(400);
              if DotCount > 4 then DotCount := 1;
            end;

      //запускаем анимацию в сплаш-окне
      with FrmSplash do
        begin
          SetImageFromImgList(ImgListSplash, NumFrame, ImgSplash); //процедура присваивает TImage очередную  картинку 
                                                                                                       // из TImageList   
        LblMsg.Caption:= PrmStr;//для наглядности работы отслеживаем инкремент i из TMyThread.Execute

          StatTxtSplash.Caption := Trim(AStr);
         
          //"анимируем" надпись, прибавляя в конце ее точки (от 1 до 3)
          case DotCount of
            2: StatTxtSplash.Caption := StatTxtSplash.Caption + ' .';
            3: StatTxtSplash.Caption := StatTxtSplash.Caption + ' ..';
            4: StatTxtSplash.Caption := StatTxtSplash.Caption + ' ...';
          end;
        end;
      Sleep(100);

      Inc(NumFrame);
      if NumFrame > pred(FrmSplash.ImgListSplash.Count) then NumFrame := 0;//начинаем с первой картинки,
                                                                                                                     //если добрались до  последней
    end;
  Screen.EnableForms(ListDisabled); //"размораживаем" окна из списка

  FrmSplash.Hide;
end; 


Что я делаю не так?

зы. архив с проектом приаттачил, если у кого вдруг будет желание пощупать самому.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Re: Не работает анимация на Ubunta

Сообщение Vadim » 04.11.2013 06:53:39

{$ UseCThreads} не пробовали ставить?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Не работает анимация на Ubunta

Сообщение zoltanleo » 04.11.2013 12:53:44

Vadim писал(а):{$ UseCThreads} не пробовали ставить?


Это в "где"? В проектном файле оно вроде есть
Код: Выделить всё
{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, u_FrmMain, u_splash
  { you can add units after this };
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Re: Не работает анимация на Ubunta

Сообщение svk12 » 04.11.2013 13:45:51

Как-то так:
Код: Выделить всё
{$mode objfpc}{$H+}
{$DEFINE UseCThreads}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, u_FrmMain, u_splash
  { you can add units after this };
svk12
постоялец
 
Сообщения: 409
Зарегистрирован: 09.06.2008 18:42:47

Re: Не работает анимация на Ubunta

Сообщение zoltanleo » 04.11.2013 15:55:36

svk12 писал(а):Как-то так:


Ага, спасибо. Добавил эту директиву (плюс Application.ProcessMessages в "анимационный" цикл ) и вроде текст стал анимироваться. А вот картинка пропала

Изображение

Может еще чего добавить или Линь принципиально против анимации? :shock:

Update: все, нашел причину!

Я грузил в ImageList не иконки, а png-картинки. А присваивал TImage картинки из ImageList как иконки. Винда на это смотрела сквозь пальцы, а вот Линь показывать их не захотел. Изменил метод загрузки картинок с GetIcon на GetBitmap и все заработало
Изображение

Всем спасибо за участие и помощь.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 228

Рейтинг@Mail.ru