Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > SynUniHighlighter и SynEdit > Проблемы с SynUniHighlighter


Автор: x_art 24.1.2008, 23:33
Очень часто при закрытии формы с редактором вылетает ошибка Access violation at address ....
Стек вызова всегда один и тот же. Никто не подскажет в чем может быть причина?


|00555086|cncsyn.exe|SynUniClasses.pas    |TSynMultiToken      |Clear            |677 |
|00555080|cncsyn.exe|SynUniClasses.pas    |TSynMultiToken      |Clear            |676 |
|005571E3|cncsyn.exe|SynUniRules.pas      |TSynRange           |Clear            |1283|
|00557235|cncsyn.exe|SynUniRules.pas      |TSynRange           |Clear            |1291|
|005571D8|cncsyn.exe|SynUniRules.pas      |TSynRange           |Clear            |1282|
|0055651F|cncsyn.exe|SynUniRules.pas      |TSynRange           |Destroy          |668 |
|0054F8A8|cncsyn.exe|SynUniHighlighter.pas|TSynUniSyn          |Destroy          |173 |
|00428F6D|cncsyn.exe|Classes.pas          |TComponent          |DestroyComponents|9853|
|00428F24|cncsyn.exe|Classes.pas          |TComponent          |DestroyComponents|9844|

Автор: mr.Anderson 25.1.2008, 13:21
x_art, у меня тоже такое было. ОЧЕНЬ внимательно проверь, не совершается ли каких-нибудь неправильных действий с SynEdit'ом (ну или с SynMemo, в зависимости от того, что ты используешь). Здесь виноват именно он, а не SynUniHighlighter. Ищи где-то неправомерные действия. Они происходят, скажем, в середине программы, а проявляют себя только при закрытии. Найти сложно, но нужно.

P.S. Для тестирования попробуй создать чистое приложение, запихать туда SynEdit и SynUniHighlighter, а потом запустить и закрыть программу. Более чем вероятно, что AV ты не получишь, а значит, проблема именно где-то в твоем коде, и скорее всего, коде, относящемся к SynEdit'у.

Автор: x_art 27.1.2008, 13:35
В том то и дело, у что у меня этот баг не вылезает никогда, а вот пользователи раз в неделю жалуются. А что считается неправомерными действиями?

Автор: mr.Anderson 27.1.2008, 14:15
x_art, это я так образно назвал всякие неточности в обращении с памятью, типа обращения к свойствам SynEdit'а, который еще не был создан, создание дочерней формы, где находится SynEdit, которая не находится ни под чьим контролем, и т.п.

Автор: x_art 27.1.2008, 22:04
Если обратиться к свойствам несуществующего SynEdit, то AV будет сразу.

>>создание дочерней формы, где находится SynEdit, которая не находится ни под чьим контролем

а вот это не совсем понял. поясни пожалуйста. 

Автор: mr.Anderson 27.1.2008, 22:27
Например. Есть дочерняя форма. На ней лежит SynEdit. То есть ты его в design-time закинул на форму.

Потом ты хочешь эту форму вызвать. Скажем, по клику на кнопке. И если ты вызовешь его вот так:
Код

procedure ...
var
 Form2 : TForm2;
begin
 Form2 := TForm2.Create( nil );
 Form2.Show(); //или ShowModal()
end;

То велика вероятность получения AV в самый неожиданный момент. У меня он вылазил сразу после закрытия этой самой дочерней формы. Проблема решилась исправлением вышеуказанного фрагмента на такой:
Код

procedure ...
var
 Form2 : TForm2;
begin
 Form2 := TForm2.Create( Application );
 Form2.Show(); //или ShowModal()
end;

Но вообще, отлов AV в случае работы с SynEdit'ом очень сложен, я сам до сих пор отлавливаю их по всем углам в своей программе, где используется SynEdit.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)