Не вариант. Не хочет ставить из-за зависимостей.
Upd. Из сырцов собрал. Совсем другое дело! И TPointF теперь есть, и AnchorDockingDsgn присутствует в списке доступных пакетов.
Ну всё, пойду дальше классы осваивать...
			
		Модератор: Модераторы
Можно и самому с помощью RTTI написать,

sign писал(а):Ghaydn писал(а):2. Bar := Foo;
Bar, как уже было сказано выше, стал указателем на Foo
А Foo мы совсем потеряли, но сам экземпляр остался в памяти, но доступа к нему у Вас уже нет. Произошла утечка памяти.
Ghaydn писал(а):https://www.freepascal.org/docs-html/rtl/system/assign.html
Я чего-то не понимаю? Это же вообще для работы с файлами.
Ghaydn писал(а):Record'ы этой беде не подвержены, их можно присваивать сколько влезет, каждый раз будет выделяться новая область памяти
Cheb писал(а):Есть два пути: парсить исходники или обязательную регистрацию всех классов, где перечислять поля в специальном методе. Оба - для титанов духа.
Python писал(а):sign писал(а):Ghaydn писал(а):2. Bar := Foo;
Bar, как уже было сказано выше, стал указателем на Foo
А Foo мы совсем потеряли, но сам экземпляр остался в памяти, но доступа к нему у Вас уже нет. Произошла утечка памяти.
Наоборот как раз. Bar мы потеряли, экземпляр остался в памяти. Если он создавался ранее, конечно. Ведь про это в вопросе ничего не сказано, так что может быть, никаких утечек и не будет.Ghaydn писал(а):https://www.freepascal.org/docs-html/rtl/system/assign.html
Да, перепутал. Мы ж Bar поменяли.Python писал(а):Для копирования у потомков TPersistent - есть метод Assign. Правда, по умолчанию он ничего не делает (точнее, просто вызывает AssignTo, который порождает исключение). Чтобы получить от Assign какую-то пользу, надо перекрыть AssignTo.
  
TPersistent = class(TObject,IFPObserved)
...
public
   ... 
   procedure Assign(Source: TPersistent); virtual;procedure Test1;
var
  MyClass1: TMyClass;
begin
  MyClass := TMyClass.Create;  // тут мы создаём экземпляр класса, при этом выделяется необходимая область памяти, которая инициализируется
                                              // в конструкторе Create требуемыми значениями полей класса
  ...
  MyClass.Pole1 := ...              // различные действия с экземпляром класса
  ...
  MyClass.Free;                       // удаление экземпляра класса, освобождение занятой им памяти.
end;
type
  TFirst = class(TObject)
  public
    Pole1: integer;
    Pole2: string;
   
   constructor Create; virtual;
    procedure Assign(aSource: TFirst); virtual;
    function Clone(aSource: TFirst): TFirst;
    function MyClass: TFirstClass; inline;
  end;
  
  TFirstClass = class of TFirst;
  TSecond = class(TFisrt)
  public
    Pole3: TFisrt;
    Pole4: double;
   
    constructor Create; override;
    destructor Destroy; override;
   
    procedure Assign(aSource: TFirst); override;
  end;
implementation
{TFisrt}
constructor TFirst.Create;
begin
  Pole1 := 10;
  Pole2 := 'fisrt';
end;
procedure TFirst.Assign(aSource: TFirst);
begin
  Pole1 := aSource.Pole1;
  Pole2 := aSource.Pole2;
end;
function Clone(aSource: TFirst): TFirst;
begin
  Result := MyClass.Create;
  Result.Assign(aSource);
end;
function MyClass: TFirstClass; 
begin
  Result := TFisrtClass(ClassType);
end;
{TSecond}
constructor TSecond.Create; override;
begin
  Inherited;
  Pole2 := 'second';
  Pole4 := 0.5;
  Pole3 := TFisrt.Create;
end;
destructor TSecond.Destroy; override;
begin
  Pole3.Free;
  Inherited;
end;
   
procedure TSecond.Assign(aSource: TFirst); override;
begin
  Inherited Assign(aSource);
  if aSource is TSecond then begin
    Pole3.Assign(TSecond(aSource).Pole3);
    Pole4 := TSecond(aSource).Pole4;
  end;
end;
  SecondCopy.Free;
  secondCopy := TSecond(aSource.Clone);
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1