Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Multi Line property


jonni ©   (2005-02-26 00:49:00) 

мне нужно зоздать Property для компонента в которое я могу помещать многострочный текст. Что-то наподобие TMemo.
Причём это нужно делать в Designe-time.

На сколько я понимаю, это можно сделать так:
property Text:TStrings read FTexts write SetFtext(const Values:Tstrings). правильно ли это??

Подскажите пожалуйста как это можно правильно реализовать.


Юрий Зотов   (2005-02-26 23:46:00) [1]

> jonni ©   (26.02.05 19:46) [2]

Без SetText и Assign в нем получим утечку памяти (после прямого присвоения ссылки на внешний объект потеряется и зависнет внутренний объект, который был создан в конструкторе). Кроме того, при уничтожении нашего компонента будет уничтожен и внешний объект, а это вряд ли правильно.

> GuAV ©   (26.02.05 21:55) [4]

Похоже, что это может быть связано с чтением DFM и работой редакторов свойств. Так уж написан код VCL.


GuAV   (2005-02-26 21:55:00) [2]

Юрий Зотов ©   (26.02.05 9:37) [1]
В SetText:
FText.Assign(Value);


Кстати, почему так делают ? Причём не только для TStrings. Если св-во не предназначено для назначения другого объекта, то почему бы не оставиь его Readonly. А конструкция Text.Assign(MyText) выглядит прозрачнее чем Text := MyText, т.к. из последней вроде бы следует что отвественность за освобождение MyText уже лежит на компоненте, а потпытка его освободить после присвоения приведет к непредсказуемым результатам..


Anatoly Podgoretsky   (2005-02-26 19:52:00) [3]

Можно, но это опасно, поскольку будут две ссылки на один и тот же объект, не контролируемые. В предложенном тебе варианте создается копия.


jonni   (2005-02-26 19:46:00) [4]

Юрий Зотов ©   (26.02.05 09:37) [1]
Большое спасибо за ответ.

а можно ли сделать просто:

property Text: TStrings read FText write FЕext;

т.е. без SetFtext ?????

У меня предок TComponent..... у него вроде нет такого свойства.... поэтому не перекрою....


Юрий Зотов   (2005-02-26 09:37:00) [5]

private
 FText: TStrings;
 procedure SetText(const Values: TStrings);
...
published
 property Text: TStrings read FText write SetFtext;
end;

В конструкторе:
 FText := TStringList.Create;

В деструкторе
 FText.Free;

В SetText:
 FText.Assign(Value);

И все. Только проверьте, не перекроет ли Ваше свойство одноименное свойство предка (потому что, например, у TControl свойство Text ужу есть).


Наверх

Титульная страница Поиск, карта сайта Написать письмо