Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.036 c
1-1107081470
Neznaika
2005-01-30 13:37
2005.02.13
Луна


3-1105960214
Orc
2005-01-17 14:10
2005.02.13
Не полное добавление записей update в цикле.


10-1083094910
Netrix
2004-04-27 23:41
2005.02.13
Передача строки по COM идёт слишком медленно!


4-1104265790
slart
2004-12-28 23:29
2005.02.13
Что-то не понимаю разницы


3-1105636223
tytus
2005-01-13 20:10
2005.02.13
Как лучше удалить записи из БД?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский