Вот пример, который получает ссылку на класс и назначает значения новому классу того же типа. Имейте в виду, что вам необходимо сделать некоторое преобразование типов, чтобы с полученным типом класса можно было сделать что-либо полезное, поскольку возвращаемый класс имеет тип TClass.
typeTLabelClass = class ofTLabel;
procedureTForm1.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
propertyCompany: string readFCompany writeFCompany;
propertyPhone: LongInt readFPhone writeFPhone;
end;
Вы можете зарегистрировать класс для потоковой системы следующим образом:
RegisterClass(TCustomer);
который позволяет знать как осуществлять поточность для TCustomer, но не регистрирует его в Палитре Компонентов.
После регистрации классов, вы можете реплицировать их следующим образом:
procedureTForm1.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;
– Rick Rogers
Получение ссылки на класс из объекта II
Мне необходимо получить ссылку на класс из объекта…
TObject.ClassType
var
ClassRef: TComponentClass;
NewComp: TComponent;
begin
TClass(ClassRef) := Sender.ClassType;
NewComp := ClassRef.Create(Self);
…
– Pat Ritchey
Работа с комментариями в большом куске кода
В Паскале существует 2 способа обозначить комментарии – {} и (* *). Вы можете вставлять один комментарий в другой (осуществлять вложенность). Следовательно, вставляя (* в начале вашего блока, и *) в конце, вы все еще можете работать с вложенными комментариями типа { }.
Вызовите диалог редактирования полей (Fields Editor), дважды щелкнув на компоненте TTable или TQuery, расположенном на вашей форме (или выбрав в контекстном меню пункт Fields Editor). Добавьте все поля, с которыми вы хотите работать в форме (даже если вы хотите, чтобы они были невидимы, но вам необходим к ним доступ – для таких полей установите свойство visible в false). Затем щелкните на «Define…» (определить) для добавления вычисляемого поля. Введите имя вычисляемого поля, отличающееся от имен других полей таблицы, выберите тип (вероятно, StringField) и задайте длину (20 будет в самый раз). Убедитесь в том, что напротив поля 'calculated' стоит галочка. Затем создайте для вашего объекта TTable или TQuery обработчик события 'OnCalcFields'. В этом обработчике вы берете значения реальных полей таблицы, делаете вычисления, и помещаете результаты в объект вычисляемого поля, который вы только что создали. После этого значение выводится в TDBGrid, или в элементе управления TDBText, если вы решили использовать форму вместо табличной сетки.
Наша функция должна достичь цели, обрабатывая значения лет и месяцев. Поскольку не все месяцы имеют одно и то же количество дней, я просто брал среднее число, поэтому результат может быть не очень точен, но большинство людей это удовлетворяет:
Читать дальше