Проблемка с TCustomTimer[Решено]

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

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

Ответить
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Проблемка с TCustomTimer[Решено]

Сообщение Maxizar »

Решил я тут сделать компонент, анимированную иконку в трее. Написал Класс: TAnimateTrayIcon = class(TCustomTrayIcon)...
Смысл прост вместо Одной Icon используем TCustomImageList, и собственно таймер TCustomTimer.
Протестил все работает, решил создать компонент. Создал пакет, иконку выбрал и т.п. Установил. И тут ждал меня БАГ.
При добавлении компонента на форму в свойствах прописывается TCustomTimer. (вот тут я вообще не понял почему).

Код: Выделить всё

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, AniTrayIcon;

type

  { TForm1 }

  TForm1 = class(TForm)
    AnimateTrayIcon1: TAnimateTrayIcon;
    CustomTimer1: TCustomTimer;  //- прописалось само ПОЧЕМУ??
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

end.

И при выключении программы ошибка на строчке из модуля AnimateTrayIcon.

Код: Выделить всё

destructor TAnimateTrayIcon.Destroy;
begin

  Timer.Free; //Вот тут.
  Timer:=Nil;
  FIcons:=Nil;
  FAnimate:=False;
  FIconIndex:=0;
  FAnimateInterval:=0;

  inherited Destroy;
end;

В чем может быть проблема: ведь если ничего не пихать в пакет и не делать компоненту.. то все просто ОК.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Maxizar 09.10.2010 15:39:49, всего редактировалось 1 раз.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Обратите внимание на строку 165 в файле anitrayicon.pas.

Код: Выделить всё

Timer:=TCustomTimer.Create(TheOwner);

В данном случае вы создаёте таймер с овнером которым является форма. Вот автоматически и появляется таймер в декларации.
При создании таймера в качестве овнера необходимо указывать тот компонент в который он инкапсулирован или не заморачиваться и просто передавать значение nil.

Код: Выделить всё

Timer:=TCustomTimer.Create(self);
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Да Mr.Smart Вы правы. Теперь все работает, выкладываю компонент в разделе Компоненты и примеры
Ответить