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 видимость.

Другие вопросы по тегам