![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Чoо |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
Здравствуйте. Совсем замучался. Проблема заключается в том, что код после компиляции то работает как надо без ошибок, то при следующей компиляции появляются ошибки при выходе из редактора (по esc или enter).
Если программу не править, вроде бы ошибка не появляется, если начать добавлять формы, процедуры и прочее, то ошибка может опять появится, но может и не появиться. ![]() вот код (лишнее убрал):
первый раз ошибка начала появляться, когда я в записи:
добавил строчку
даже если к этому полю записи не обращаться, появлялись ошибки. Потом я решил все поля записи сделать фиксированными, тоесть сделал так:
все заработало как надо. Ошибок не наблюдалось. Скорее всего совпадения, потому что сегодня продолжил работать над программой (то что в архиве - маленький кусочек) опять появились эти ошибки. Вернул как было:
(если у вас ошибка не вылетает, попробуйте раскоментируйте эту запись, соотв. старую закоментируйте) ошибка не появляется. Начал окрашивать строки таблицы в соотв полю brashcolor:integer; , опять появилась ошибка. Вобщем похоже на танцы с бубном. Что это может быть? Криво написал код? (да он тут голый, но тоже пока экспериентировал над ним, ошибка то появлялась, то исчезала). Среда разработки выбрасывает фокусы? Рад любому совету, спасибо. Добавлено через 5 минут и 42 секунды да, это программа ни чего не делает, потому что я ее выдернул из той, которая делает странность еще и в том, что даже если ошибка появляется, то все работает: редактирование отменятся, если мы отменяем, если мы сохраняем изменения, то они вносятся в таблицу и в базу данных. Добавлено через 9 минут и 3 секунды вложение: Присоединённый файл ( Кол-во скачиваний: 24 )
2.ZIP 6,81 Kb-------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
||||||||||
|
|||||||||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
||||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
Rrader, посмотрел, спасибо. Решение вопроса сводится к убиранию:
вот только не знаю как это скажется на работоспособности программы в целом (программу пишу не только для себя). Саму форму я создаю при вызове этого редктора (в котором использую компонент VTView), после закрытия формы ее уничтожаю. -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Чoо, лучше возьмите оттуда мой редактор. Он является наследником TEdit и лишен этой проблемы вылета.
Правда там SetBounds нужно переопределить по-нормальному, а не через reintroduce, но это пустяки |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
Rrader, ну если работает без ошибок, воспользуюсь им, пасиб. С SetBounds разберусь.
а природа ошибки все же интересна, в той теме ее тоже не открыли (смайл). Разве что намекнули, что возможно происходит обращение к уничтоженому или скрытому редактору -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| RomanEEP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
Природа ошибки очень проста - в вызове FTree.EndEditNode() и FTree.CancelEditNode в обработчике редактора OnKeyDown. Дерево спокойно убивает редактор, а потом возвращается в процедуру обработки события компонента, которого давно нет. В этом лекго убедиться поставив точку останова на TVTCustomEditor.Destroy;
Выход - завершать редактировать узел асинхронно, например, с помощью PostMessage() ЗЫ: Поскольку редактор является интерфейсом, то можно хранить ссылочку на него где-нибудь, деструктор вызываться не будет и тогда можно даже без PostMessage() обойтись. Это сообщение отредактировал(а) RomanEEP - 14.12.2009, 20:20 |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
RomanEEP, ну да, процедура OnKeyDown выполняется, доходит до FTree.EndEditNode(), после уничтожается редактор и происходит возврат в OnKeyDown, после окончания которой вылетает ошибка.
пункт "ЗЫ" пока для меня сложен, даже не представляю что сделать, хотя как завершить редактирование ассинхронно, тоже не понятно -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| RomanEEP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 5 Всего: 8 |
асинхронно означает отправить PostMessage(WM_USER + xxx); например форме где стоит дерево а вобработчике сообщения WM_USER + xxx вызывать EndEdit()
Второй вариант еще проще - обьяви, например в главной форме ссылку на редактор и сохраняй в неё созданый редактор
|
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
RomanEEP, сделал так, как вы написали. Вобщем что получается, все работает, а вот деструктор вызывается после второго создания редкатора. Тоесть:
1. Создался редактор, сохранили ссылку. 2. Закончили редактировать, деструктор не вызвался. 3. Начали редактировать новый узел, создался редактор, вызвался деструктор, который уничтожил предыдущий редактор. Так и должно быть? Добавлено @ 21:19 кстати, обязательно FEditor: IVTEditLink; объявлять как поле, соответственно надо создавать методы, что бы работать с ним? Я просто в раздел объявления переменных первой формы запихнул это Добавлено через 5 минут и 54 секунды а не, в раздел переменных нельзя, вылетает ошибка при закрытии программы Это сообщение отредактировал(а) Чoо - 15.12.2009, 21:20 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
а... вываливается ошибка, потому что при закрытии программы вызывается все тот же деструктор, в то время как ссылка Fedit указывает на NIL
вобщем все-равно вызывается деструктор -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
что бы не засорять статью по VT, спрошу тут. назрел еше один вопрос. уже второй день бьюсь и не пойму, как с помощью Drag&Drop перетащить строчку из одного VT в другой? в статье расписано, как это сделать, если у нас одна колонка. Не вопрос, если строка состояит из одной колонки все номрально переносится. Более того, если несколько колонок, но строку переносим в пределах одного компонента VT, переносится содержимое всех столбцов. Однако, если попытаться из одного VT перетащить строку в другой VT, то строка перетащится, но в другом VT (в который мы перетащили строку) отобразится только содержимое первого столбца, содержимое остальных столбцов будет потеряно. Буду рад любому своету.
структура данных в обоих VT идентична Это сообщение отредактировал(а) Чoо - 20.12.2009, 21:06 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Скорее всего, у Вас активна опция TreeOptions>StringOptions>SaveCaptions. Из-за этого в любом случае происходит загрузка и сохранение строки из первого столбца. В том числе и при Drag&Drop, где вызывается ProcessOLEData (само собой, если не используется VCL Drag&Drop). Так вот, в этом ProcessOleData загрузка брошенного нода производится из IStream. Вам нужно реализовать события OnLoadNode и OnSaveNode, в которых сохранять в поток (и загружать, соответственно) все данные из NodeData. Кстати, в этом случае будет совсем не лишним отключить опцию SaveCaptions. Это сообщение отредактировал(а) kami - 20.12.2009, 23:20 |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
Спасибо за ответ. звучит сложно. Да, указанная вами опция включена.
Остальное пробую осмыслить. Добавлено через 4 минуты и 24 секунды у меня еще такой момент. VT.NodeDataSize := SizeOf(TRNode); в самом VT 2 колонки, однако в записи TRNode больше 2 х полей. Содержимое "скрытых" полей так же важно сохранить. -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: нет Всего: 4 |
разобрался.. Убил время, нет что бы проверить после реализации указанных вами двух событий, искал как инициализировать эти события
Вроде все просто и работает -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Ну, первая часть ответа была на "копание" в исходниках TBaseVirtualTree, если нужно понять, как это вообще работает. Потому что связь Drag&Drop с OnSave/OnLoadNode совсем не очевидна Ну, а потом уже был непосредственно совет - сделать обработчики этих событий... Вот и славно Последнее предложение (про убирание опции SaveCaptions, если объявлены OnLoad|SaveNode) остается в силе - эта опция не только добавляет лишние данные к потоку, но и вызывает OnNewText и т.п для каждого загружаемого нода, что при указанных обработчиках не только не полезно, но я бы сказал даже вредно, особенно при большом дереве... Теперь, кстати, можете очень легко и просто сохранять и загружать все дерево, просто сказав vt.SaveToStream|LoadFromStream - сохранится и загрузится в точности как и было. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |