Как получить класс из объекта Delphi 6 для присвоения переменной метакласса?

У меня есть переменная Metaclass Delphi 6, которая обслуживает свойство компонента для компонента сервера времени разработки:

type
  TClientClass = class of TClient;
...
FClientClass: class of TClientClass;
FClientObj: TClient;

У меня есть другой компонент времени разработки, который является клиентским компонентом. Во время разработки я назначаю конкретный экземпляр компонента «Клиент», перенесенный в ту же форму, компоненту «Сервер» с помощью свойства «клиент» сервера через Редактор свойств среды IDE. Однако я также хочу назначить переменной FClientClass базовый класс конкретного компонента, который я назначаю FClientObj через свойство client. Это делается для того, чтобы компонент Server мог создавать новые экземпляры компонента Client во время выполнения, используя FClientClass.Create.

Я не могу понять, как назначить базовый класс объекта "client" для элемента данных FClientClass, когда я устанавливаю элемент данных FClientObj через установщик свойств компонента Server:

procedure setClientClass(theClient: TClient);
begin
    // Assign the "client" property.  This works.
    FClientObj := theClient;

    // Assign the class of the "client" object to the Metaclass variable.
    // THIS DOESN'T WORK: incompatible types error from the compiler.
    FClientClass := theClient;
end;

Я почти уверен, что проблема в том, что я пытаюсь присвоить объект TClient переменной Metaclass of TClient. Я просто не знаю правильный синтаксис для назначения. Я не хочу просто делать:

FClientClass := TClient;

потому что я хочу разрешить назначение конкретных компонентов в будущем, которые могут быть потомками TClient.

Каков синтаксис для правильного выполнения задания? Я надеюсь, что это проще, чем делать что-то сложное с библиотекой RTTI, как, например , ответ Мальте в этой теме:

Как я могу создать объект Delphi из ссылки на класс и обеспечить выполнение конструктора?

delphi,class,components,metaclass,

1

Ответов: 1


7 принят

Я верю, что вы ищете TObject.ClassType. Используйте это так:

procedure setClientClass(theClient: TClient);
begin
  FClientObj := theClient;
  FClientClass := TClientClass(theClient.ClassType);
end;

Примечание 1: я предполагаю, что вы имеете в виду, FClientClass: TClientClassа не FClientClass: class of TClientClass.

Примечание 2: я только скомпилировал это в своей голове; Я надеюсь, что это работает на реальном компиляторе.

Дельфы, класс, компоненты, метаклассом,
Похожие вопросы