Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Получение ссылки на класс из объекта

Delphi , Компоненты и Классы , Классы

Получение ссылки на класс из объекта

Автор: Rick Rogers

Мне необходимо получить ссылку на класс из объекта. Например, если у меня есть ссылка на объект (например, указатель на экземпляр TLabel), то мне необходимо получить ссылку на класс (например, ссылка на класс TLabel) для того, чтобы мне еще создать необходимое количество объектов данного класса. Другими словами, мне нужно дублировать экземпляры классов, создаваемые кем-то еще.

Класс, о котором идет речь, в Delphi не зарегистрирован (его нет в палитре), поэтому GetClass('TLabel') не работает, даже если экземпляры класса существуют, работать с ними можно только через RTTI. Вдобавок к этому, у меня нет даже кода класса, поэтому работа через RTTI - единственный выход.

Вот пример, который получает ссылку на класс и назначает значения новому классу того же типа. Имейте в виду, что вам необходимо сделать некоторое преобразование типов, чтобы с полученным типом класса можно было сделать что-либо полезное, поскольку возвращаемый класс имеет тип TClass.


type
  TLabelClass = class of TLabel;

procedure TForm1.Button1Click(Sender: TObject);
var
  Ref: TLabelClass;
  New: TLabel;
begin
  Ref := TLabelClass(Label1.ClassType);
  New := Ref.Create(Self);
  New.Parent := Self;
  New.Caption := 'Фантастика!';
end;

Реплицирование класса может быть осуществлено одним из двух способов. Во-первых, вы можете воспользоваться методом Assign (который требует, чтобы ваши классы были наследниками TPersistent). Данный способ заключается в использовании метода Assign, работающего с TPersistentClass:


New.Assign(Label1);

Второй способ заключается в использовании автоматической поточности компонента (этот способ требует, чтобы ваши классы являлись наследниками TComponent, и чтобы они были зарегистрированы для потоковой системы).

В вашем вопросе вы исходили из неправильного предположения; классы могут регистрироваться потоковой системой И НЕ регистрироваться в Палитре Компонентов; обычно эти две вещи связаны, но не обязательно. Например, скажем, у вас имеется следующий класс:


TCustomer = class(TComponent)
  private
    FCompany : string;
    FPhone : LongInt;
  published
    property Company: string read FCompany write FCompany;
    property Phone: LongInt read FPhone write FPhone;
end;

Вы можете зарегистрировать класс для потоковой системы следующим образом:


RegisterClass(TCustomer);

, который позволяет знать как осуществлять поточность для TCustomer, но не регистрирует его в Палитре Компонентов.

После регистрации классов, вы можете реплицировать их следующим образом:


procedure TForm1.Button1Click(Sender: TObject);
var
  Ref : TComponentClass;
  New : TComponent;
  Stream : TMemoryStream;
begin
  Ref := TComponentClass(Label1.ClassType);
  New := Ref.Create(Self);
  Stream := TMemoryStream.Create;
  try
    Stream.WriteComponent(Label1);
    Stream.Position := 0;
    Stream.ReadComponent(New);
  finally
    Stream.Free;
  end;
end;

Статья Получение ссылки на класс из объекта раздела Компоненты и Классы Классы может быть полезна для разработчиков на Delphi и FreePascal.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Классы ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100
29.03.2024 12:20:50/0.010617017745972/2