| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > DefineProperties и TCustomEdit |
| Автор: Proxin 27.2.2016, 01:12 |
| Столкнулся со странной ошибкой. Пишу свой ТЕдит на базе ТКастомЭдит, перекрываю в протектедах ДефайнПропертиз. И вот в чём загвоздка - исполнение кода в тестовом проекте туда попросту не доходит, точнее, при загрузке приложения вообще ни для каких контролов кроме главной формы, ДефайнПропертиз не выполняется. В чём может быть загвоздка? |
| Автор: Proxin 27.2.2016, 22:45 | ||
Вроде разобрался, но возникла следующая проблема. При использовании WriteComponent при последующем пользовании дизайнером ( сохранении формы с моим компонентом) вылетает ошибка out of memory. Код совершенно обычный
|
| Автор: Proxin 27.2.2016, 23:56 |
| Опытным путём выяснилось, что ошибка - переполнение буфера после использования WriteComponent. Никто не сталкивался с этим? |
| Автор: Doga 29.2.2016, 16:03 | ||
| Привет. Когда CodeGear отказалась от справки в формате .HLP, надо сказать, ею(справкой) стало невозможно пользоваться, т.к. вместо справки получилось полное убожество(мягко говоря). Однако о TWriter.WriteComponent они(CodeGear) кое-что все же написали:
Отсюда и переполнение буфера. Как то так... |
| Автор: Proxin 1.3.2016, 01:02 |
| А как тогда быть, если я хочу сохранить в DFM TComponent, который не является публикуемым свойством ни одной компоненты? |
| Автор: Doga 1.3.2016, 13:09 | ||||||
| Не вижу ничего сложного. Определяете методы для чтения и сохранения свойств компонента и с помощью DefineProperty(...) назначаете их для конкретного свойства. Например:
И в соответствующем файле DFM можно видеть следующие строки:
Кста, в догонку, Writer.Root тоже нельзя вызывать:
Вообще, как это делается, можно подсмотреть в исходниках Delphi или компонентах других разработчиков. |
| Автор: Proxin 1.3.2016, 14:22 |
| Это я знаю, что можно писать ручками все нужные значения. Но неужели нет способа вызывать WriteComponent? В статье про TReader/TWriter на этом форуме WriteComponent упоминаяется, и не стоит никаких предупреждений по его использованию. |
| Автор: Doga 1.3.2016, 20:16 |
| Да, хорошая статья - http://forum.vingrad.ru/forum/topic-250409/unread-1/hl/treader+twriter/index.html Отличная наглядная иллюстрация, прекрасно объясняет как это работает. Конечно, никто не может помешать нам создать свои собственные локальные Reader, Writer и в режиме RunTime сохранять компоненты в свои собственные файлы или загружать компоненты из них. Но для реализации возможности сохранения свойств в DFM, я считаю, необходимо соблюдать соответствующие правила. Все визуальные компоненты сами умеют сохранять/читать свои свойства. Надо только предоставить им такую возможность. Хотелось бы разобраться в концепции Вашего компонента и увидеть полный код методов используемых для чтения/записи свойств. Кста, больше чем на три кнопки в составе Edit'а, меня не хватило |
| Автор: Proxin 1.3.2016, 20:48 |
| В общем, стандартный TReader/TWiriter - не подходит. Если хотите всамделишные кнопки - энамьте все бублики через ртти и пишите в бинарную дату, потом парсьте её в ридере, с созданием компонента по имени класса и прочим фабричным весельем. Я удивлён, как вообще они стандартный TToolBar писали. Могли бы для себя добавить нормальную работу в дизайне. А в компоненте у меня ничего сложного - два тулбара class(TWinControl) и хук на ресайз эдита. Кнопки храню с помощью TList, сам пишу, сам читаю. Потому что коллекциями это реализовывать - грабли через грабли. |
| Автор: dnek 4.3.2016, 21:59 | ||
А директивы stored для свойства Вам не хватает? Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/DefineProperties-i-TCustomEdit-id56d0ce66ae20151f298b4567#findElement_E7045_56d9db2dae2015b76a8b48c8_0 |