Вы задаете два вопроса, поэтому я отвечу на них двумя ответами.
Ваш первый вопрос касается использования 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.
С уважением,
Йерун Плаймерс
person
Jeroen Wiert Pluimers
schedule
01.02.2009