Форум: "KOL";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизTKOLButton + TKOLAction = EAccessViolation at 00000000 Найти похожие ветки
← →
Андрей (2004-07-27 21:04) [0]Натолкнулся на странный глюк.
В проекте одна форма. На форме несколько панелей.
Ставлю на панель кнопку, назначаю ей экшен (любой из имеющихся).
При закрытии формы получаю ошибку
EAccessViolation in module electro.exe at 00000000
Access violation at address 00000000. Read of address 00000000.
Убираю у кнопки экшен - все работает нормально.
Назначаю этот экшен пункту меню - без проблем.
Все случается, даже если экшен пустой. Даже если запустить
программу и нажать только на крестик.
в OnCreate/OnDestroy никаких наворотов, выделений динамической памяти
или создания/уничтожения объектов нет.
D6, XPsp1a
← →
Андрей (2004-07-27 21:39) [1]В дополнение:
Ошибка происходит в DestroyChildren, который вызывается в конце процедуры TerminateExecution, в App.RefDec
На пустом проекте повторить ошибку не удалось
Перезагрузка проекта, Delphi, Windows не помогает
← →
Yury Sidorov (2004-07-28 11:45) [2]Убери из своего проекта весь свой код, оставь только интерфейс и убедись что ошибка воспроизводится. Затем, вышли его мне на адрес yury_sidorov at maul.ru
← →
mdw (2004-07-28 14:47) [3]В свое время столкнулся с багами в TKOLAction. Отправлял Кладову, но обновления пока не было.
Предлагаю изменения:
1. destructor TAction.Destroy;
там присутствует строчка
FControls.ReleaseObjects;
но ReleaseObjects вызывает метод Free, для указателя на объект, в то время, как в FControls лежат указатели на запись (PControlRec)
. Ну, а вызов Free для записи..., последствия непредсказуемы.
Я так понимаю, вместо FControls.ReleaseObjects; должно быть FControls.Release;
2. В procedure RegisterIdleHandler
procedure RegisterIdleHandler( const OnIdle: TOnEvent );
begin
if IdleHandlers = nil then begin
IdleHandlers := NewList;
Убрать следующие две строки, т.к. столкнулся с ситуацией когда
UnRegisterIdleHandler вызывается уже после "AutoFree", сответственно
идет обращение к разрушеному IdleHandlers, результат
сответствующий....
// if Applet <> nil then
// Applet.Add2AutoFree(IdleHandlers);
end;
with TMethod(OnIdle) do
begin
IdleHandlers.Add(Code);
IdleHandlers.Add(Data);
end;
ProcessIdle := @ProcessIdleProc;
end;
3. В procedure UnRegisterIdleHandler
procedure UnRegisterIdleHandler( const OnIdle: TOnEvent );
var
i: integer;
begin
i := FindIdleHandler(OnIdle);
if i <> -1 then
with IdleHandlers{-}^{+} do
begin
Delete(i);
Delete(i);
end;
Добавить строчку, чтобы IdleHandlers всеже разрушался:
if IdleHandlers.Count = 0 then Free_And_Nil(IdleHandlers);
end;
← →
Yury Sidorov (2004-07-28 21:18) [4]1. В оригинальном коде было:
for i:=0 to FControls.Count - 1 do
Dispose(FControls.Items[i]);
На FControls.ReleaseObjects; было заменено Кладовым. Насколько это корректно, нужно спрашивать у него.
2. А можно пример программы, когда UnRegisterIdleHandler вызывается уже после "AutoFree"? Если убрать предложенные строки, то будет утечка памяти в случае, если в программе не будет вызовов UnRegisterIdleHandler.
3. Разрушать можно, но сильной необходимости в этом нет. Плюс лишний код.
← →
Vladimir Kladov (2004-07-29 00:58) [5]Для object (не class который) Dispose = FreeMem. К тому же применение Dispose увеличивает код на 1,5 К байта. И работает с вариантами. Зачем козе баян? Почему сразу просто было не использовать Free?
← →
Андрей (2004-07-29 06:22) [6]Ну и?
Я тут вычистил из программки весь код, какой смог.
И послал ее Yury Sidorov, поскольку проблема осталась.
Значит, у меня вроде руки не кривые.
1. Дальше то что делать?
Самому править KOL и потом отслеживать корректность своих правок в следующих версиях? Это и есть баян.
2. А если другого выхода нет, то где искать глюк?
Что касается Idle, так я их вообще не использую. Вроде как и дефайн соответствующий прописал.
Если дело в TAction.Destroy, то почему для кнопок на ToolBar и пунктов меню все работает нормально, а у обычных кнопок и BitButton не работает?
← →
Yury Sidorov (2004-07-29 11:48) [7]Что-то я не получил письмо. В указанном адресе опечатка :)
Нужно yury_sidorov at mail.ru
← →
Yury Sidorov (2004-07-29 11:55) [8]2 Vladimir Kladov:
А если сделать версию KOL с использованием классов (для FPC например), то тогда использование Free вместо Dispose будет некорректным.
Получается, что не нужно использовать New/Dispose для выделения памяти под структуры, а нужно использовать GetMem/FreeMem ?
← →
Андрей © (2004-07-29 12:41) [9]Меня тоже смутил адрес...
Но я набрал в браузере - редиректнулся.
Ну, думаю, почтовик может и быть на этом адресе.
Рабочий день закончится (У меня МСК+3), тогда из дома пришлю
← →
Vladimir Kladov (2004-07-29 17:40) [10]не надо Dispose и New тоже не надо. Для выделения просто памяти есть GetMem и AllocMem, для освобождения FreeMem. Free делает освобождение для объектов и классов. Вариант надо освобождать присвоением nil. Все.
← →
Yury Sidorov (2004-07-30 21:45) [11]Андрей, у меня работает. И со старыми KOL/MCK 1.85 и с новыми 1.92
Правда у меня не установлены KOLTrackBar и KOLMHXP и я их выбросил из проекта.
← →
Андрей © (2004-07-31 17:57) [12]Как и предлагал mdw [3], в TAction.Destroy вместо FControls.ReleaseObjects; стало FControls.Release;
Теперь у меня все работает, хотя я ничего и не менял.
А как было в 1.85? Я обновлялся с 1.80 сразу на 1.90, потом на 1.91
Ну и респекты за заботу...
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c