![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Font ы в свойствах [D6, WinXP]
Brain © (2003-01-24 17:42:00)Люди такой трабл,
{private}
FFontCap:TFont;
procedure SetFFontCap(Value:TFont);
{publish}
property FontCap : TFont read FFontCap write SetFFontCap;
implementation
procedure MyButton.SetFFontCap(Value:TFont);
begin
FFontCap:=Value;
end;
constructor Create(AOwner:TComponent);
begin
---//--
FFontCap:=TFont.Create;
end;
destructor Destroy;
begin
FFontCap.free
end;
И список выбора стандартных шрифтов в Object Inspector не
раскрываеться кучу ERROR"ов кидает.
~~~~~~~~~~~~~~~~~~~~~~~`
Зарание блогодарен .... ;)
Brain (2003-01-28 11:07:00) [1]Ок всё понял. Спасибо за объяснения.
Юрий Зотов (2003-01-27 12:14:00) [2]Нет, не так. У Вас FFontCap - это ссылка на ВНУТРЕННИЙ объект, который создается автоматически, в конструкторе. Если написать FFontCap := Value, то ссылка будет переписана и будет указывать уже на какой-то внешний объект, а Ваш внутренний повиснет в памяти (вот она, утечка). Если же теперь этот внешний объект по каким-то причинам окажется уничтоженным, то ссылка на него в FFontCap окажется недействительной и попытка обращения по ней даст ошибку (вот они, глюки).
А если написать FFontCap.Assign(Value), то копируется не ссылка на объект, а его "содержимое" - и все идет нормально. Так нужно поступать всегда, если Ваш объект - внутренний, создаваемый Вашим же кодом.
И наоборот, если Вы вводите именно ссылку на ВНЕШНИЙ объект, создаваемый не Вами, то Assign даст ошибку. В этих случаях нужно именно присвоение. И не помешает предусмотреть механизм автоматического обнуления этой ссылки при удалении объекта, на который она ссылается (у компонентов для этого используются методы Notification и FreeNotification).
Brain (2003-01-27 11:10:00) [3]То есть, я так понял, что не только в этом случае, а вообще, если возможно Assign, то лучше Assign.
Юрий Зотов (2003-01-24 18:44:00) [4]procedure MyButton.SetFFontCap(Value:TFont);
begin
FFontCap.Assign(Value);
end;
Иначе - глюки и утечка памяти.