Вы задаете два вопроса, поэтому я отвечу на них двумя.
Ваш первый вопрос об использовании TTimers; они всегда запускаются в главном потоке.
Скорее всего, ваше исключение является нарушением прав доступа.
Если это так, это обычно вызывается одним из следующих:
- a- ваша родительская форма уже
уничтожен, когда ваш TTimer стреляет.
- b- у вас еще нет ссылки на
ваша родительская форма, когда ваш TTimer
пожары.
b это просто: просто проверьте, если ваша ссылка ноль .
a сложнее и зависит от того, как вы ссылаетесь на родительскую форму.
Как правило, вы хотите убедиться, что ваша ссылка становится нулевой, когда родитель уничтожается или удаляется.
Если вы ссылаетесь на родительскую форму через глобальную переменную (в этом примере через Form2 ), то вам нужно, чтобы TForm2 сделал переменную Form2 nil , используя событие OnDestroy, например:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormDestroy(Sender: TObject);
begin
Form2 := nil;
end;
end.
Если вы используете ссылку на поле родительской формы (например, FMyForm2Reference ), то вам следует добавить метод уведомления, подобный этому:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2;
type
TForm1 = class(TForm)
private
FMyForm2Reference: TForm2;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) then
if (AComponent = FMyForm2Reference) then
FMyForm2Reference := nil;
end;
end.
С уважением,
Jeroen Pluimers