Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как присвоить все значения полей одного класса, другому такому же классу 2

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



Автор: Gokhan Ersumer

procedure EqualClassProperties(AClass1, AClass2: TObject);
var
  PropList: PPropList;
  ClassTypeInfo: PTypeInfo;
  ClassTypeData: PTypeData;
  i: integer;
  NumProps: Integer;
  APersistent: TPersistent;
begin
  if AClass1.ClassInfo <> AClass2.ClassInfo then
    exit;
  ClassTypeInfo := AClass1.ClassInfo;
  ClassTypeData := GetTypeData(ClassTypeInfo);
  if ClassTypeData.PropCount <> 0 then
  begin
    GetMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
    try
      GetPropInfos(AClass1.ClassInfo, PropList);
      for i := 0 to ClassTypeData.PropCount - 1 do
        if not (PropList[i]^.PropType^.Kind = tkMethod) then
          {if Class1,2 is TControl/TWinControl on same form, its names must be unique}
          if PropList[i]^.Name <> 'Name' then
            if (PropList[i]^.PropType^.Kind = tkClass) then
            begin
              APersistent := TPersistent(GetObjectProp(AClass1,
                PropList[i]^.Name, TPersistent));
              if APersistent <> nil then
                APersistent.Assign(TPersistent(GetObjectProp(AClass2,
                  PropList[i]^.Name, TPersistent)))
            end
            else
              SetPropValue(AClass1, PropList[i]^.Name, GetPropValue(AClass2,
                PropList[i]^.Name));
    finally
      FreeMem(PropList, SizeOf(PPropInfo) * ClassTypeData.PropCount);
    end;
  end;
end;

Note that this code skips object properties inherited other than TPersistent.

Приведенный код на Delphi предназначен для копирования значений свойств из одной экземпляра класса в другой экземпляр класса того же типа. Процедура EqualClassProperties перебирает свойства обоих классов, пропуская методы и свойства, которые не являются TPersistent. Затем она присваивает значение свойства во втором классе соответствующему свойству в первом классе.

Вот шаг за шагом, что код делает:

  1. Он проверяет, имеют ли два входных класса (AClass1 и AClass2) одинаковые информацию о классе.
  2. Если они это сделали, он получает типовую информацию для обоих классов с помощью GetTypeData и GetPropCount.
  3. Он выделяет память для массива структур информации о свойствах (PPropList) и заполняет его информацией о свойствах из AClass1 с помощью GetPropInfos.
  4. Код затем проходит по каждому свойству в списке, пропуская методы (опознанные как tkMethod).
  5. Для не-методов свойств он проверяет, является ли это свойство объектным типом (опознанным как tkClass). Если это так, он получает значение этого свойства из AClass2 с помощью GetObjectProp, присваивает его временной экземпляру TPersistent (APersistent), а затем присваивает APersistent обратно тому же свойству в AClass1. Это позволяет копировать сложные свойства (например, объекты) между классами.
  6. Если свойство не является объектным типом, он просто устанавливает значение этого свойства в AClass1 с помощью SetPropValue, копируя значение из AClass2.

Код также включает примечание, что он пропускает свойства объектов, унаследованные от TPersistent.

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

type
  TMyClass = class(TPersistent)
    Name: string;
    Age: integer;
  end;

var
  Class1, Class2: TMyClass;

procedure Main();
begin
  SetLength(Class1.Name, 10);
  Class1.Age := 25;

  EqualClassProperties(Class1, Class2); // Копирование свойств из Class1 в Class2

  WriteLn('Class2 Name:', Class2.Name);
  WriteLn('Class2 Age:', Class2.Age);
end;

В этом примере EqualClassProperties используется для копирования значений свойств из Class1 в Class2. Вывод будет:

Class2 Name: 
Class2 Age: 25

В статье описывается процедура EqualClassProperties, которая позволяет присвоить все значения полей одного класса другому такому же классу в Delphi.


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: RTTI ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:57:11/0.0033891201019287/0