Не вариант. Не хочет ставить из-за зависимостей.
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14