Delphi - Пользовательская тема не создается
У меня тут небольшая проблема. У меня есть пользовательский класс, который наследует класс TPersistent, внутри (приватный раздел) этого пользовательского класса, у меня есть пользовательский TThread с переопределенным методом Execute, который срабатывает каждые (1000 мс). Все отлично работает, пока я не перенесу свои 2 пользовательских класса в новый блок...
type
TMyThread= class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class(TPersistent)
private
T: TMyThread;
protected
constructor Create;
public
destructor Destroy; override;
end;
implementation
procedure TMyThread.Execute;
begin
while not Self.Terminated do begin
Sleep(1000);
MessageBox(0, 'test', nil, MB_OK)
end;
end;
constructor TMyClass.Create;
begin
inherited Create;
t := TMyThread.Create(False);
end;
destructor TMyClass.Destroy;
begin
t.Terminate;
t.WaitFor;
FreeAndNil(t);
inherited Destroy;
end;
Приведенный выше код прекрасно работает в модуле основного проекта, но когда я перемещаю его в новый модуль, код потока больше не работает, я получаю AV, когда пытаюсь освободить объект TMyClass. Я думаю, что поток не создается вообще, и именно поэтому я получаю AV, когда я пытаюсь освободить его... но почему? не должно иметь значения, в каком модуле находится код...
Раздел 1:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
p: TMyClass;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
p.Free; //Getting an AV
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
p := TMyClass.Create;
end;
end.
Модуль 2:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TMyClass = class(TPersistent)
private
T: TMyThread;
protected
constructor Create;
public
destructor Destroy; override;
end;
implementation
procedure TMyThread.Execute;
begin
while not Self.Terminated do begin
Sleep(1000);
MessageBox(0, 'test', nil, MB_OK)
end;
end;
constructor TMyClass.Create;
begin
inherited Create;
t := TMyThread.Create(False);
end;
destructor TMyClass.Destroy;
begin
t.Terminate;
t.WaitFor;
FreeAndNil(t);
inherited Destroy;
end;
end.
1 ответ
Конструктор TMyClass.Create
объявлен защищенным. Это означает, что это не видно из другого устройства. следовательно TMyClass.Create
не выполняется, и вместо этого вы звоните TObject.Create
, В свою очередь это означает, что поток никогда не создается, и вы сталкиваетесь с ошибкой во время выполнения, когда деструктор работает, потому что T
является nil
,
Объявите конструктор с public
видимость.