AV на ComboBox
7 отговора
245 прегледа
AV на ComboBox
Здравейте,
От много време имам един "малък" проблем с една моя програма, което се оказа бъг в VCL-а, за версиите на Делфи и Буилдера до 6 включително. Проблема е само за ComboBox и се изразява в това, че дава съобщение "Access violation of address 00098053" при клик с мишката в комбо бокса. Ако се използват стрелките - няма проблем. Това важи само за Win2000. Най лошото е, че грешката не се появява винаги и не мога да я симулирам. Повече информация по този проблем : [линк]
Лошото е че пиша на Буилдера и не мога да прекомпилирам с версия в която проблема е решен. Мисля вместо стандартният TComboBox да използвам аналога му от LMD-Tools SE 7.03 -> [линк]
въпреки, че не съм сигурен, дали компонентите не са наследници на съотв. контроли от VCL-a и грешката да се появи отново.
За жалост не можах да намеря някакво приемливо решение на проблема в мрежата, освен че е оправен в Д7, което много не ми помага. Някакви идеи, предложения и т.н. ?
От много време имам един "малък" проблем с една моя програма, което се оказа бъг в VCL-а, за версиите на Делфи и Буилдера до 6 включително. Проблема е само за ComboBox и се изразява в това, че дава съобщение "Access violation of address 00098053" при клик с мишката в комбо бокса. Ако се използват стрелките - няма проблем. Това важи само за Win2000. Най лошото е, че грешката не се появява винаги и не мога да я симулирам. Повече информация по този проблем : [линк]
Лошото е че пиша на Буилдера и не мога да прекомпилирам с версия в която проблема е решен. Мисля вместо стандартният TComboBox да използвам аналога му от LMD-Tools SE 7.03 -> [линк]
въпреки, че не съм сигурен, дали компонентите не са наследници на съотв. контроли от VCL-a и грешката да се появи отново.
За жалост не можах да намеря някакво приемливо решение на проблема в мрежата, освен че е оправен в Д7, което много не ми помага. Някакви идеи, предложения и т.н. ?
Re: AV на ComboBox
В Delphi5 не съм забелязал да има проблем с комбо бокса.
Но след като "вградих" в Delphi5 комбо бокса от Delphi7,започна от време на време да се появява "Access violation of address .....", но успях да фиксирам къде точно е проблема и го "заобиколих" чрез "tray ... except".
Интересното е, че проблема се появяваше само в офиса(Win XP), а вкъщи, тогава бях с Win98, нямаше проблеми.
Не съм сигурен дали моя проблем съвпада с твоя, но ако искаш мога да потърся къде точно сложих "try...except" и да видиш дали ще свърши работа и при теб.
Но след като "вградих" в Delphi5 комбо бокса от Delphi7,започна от време на време да се появява "Access violation of address .....", но успях да фиксирам къде точно е проблема и го "заобиколих" чрез "tray ... except".
Интересното е, че проблема се появяваше само в офиса(Win XP), а вкъщи, тогава бях с Win98, нямаше проблеми.
Не съм сигурен дали моя проблем съвпада с твоя, но ако искаш мога да потърся къде точно сложих "try...except" и да видиш дали ще свърши работа и при теб.
Редактирано от SAGE_BS на
Re: AV на ComboBox
От това, което прочетох, проблемът е само за Win2000 и версии на Делфи/Буилдера до 6 вкл. На моето служебно PC с WinXP, на което ми е Буилдера такава грешка никога не се появява. Пробвах с try/catch в събитието OnDropDown(), но поне в Буилдера "Access violation of address ... " не се прихваща от try/catch код. Интересно би било да видя, как си решил проблема. Всяка помощ е добре дошла, защото съм в глуха улица.
Re: AV на ComboBox
При мен проблема беше тук:
===================================
procedure TCustomCombo.WndProc(var Message: TMessage);
begin
......................................
with Message do
case Msg of
....................................
WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
begin
try //добавено от мен
SetTextColor(WParam,ColorToRGB(Font.Color));
SetBkColor(WParam,ColorToRGB(Brush.Color));
Result := Brush.Handle;
except//
Exit;//
end;//
...............................
=====================================
Предполагам, че при теб е нещо друго, но не пречи да опиташ. Лошото е, че грешката не се появява всеки път, а това прави откриването и отстраняването много трудно. Може да сложиш "try..except" и в другите елементи на "case Msg of .... end;".
===================================
procedure TCustomCombo.WndProc(var Message: TMessage);
begin
......................................
with Message do
case Msg of
....................................
WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
begin
try //добавено от мен
SetTextColor(WParam,ColorToRGB(Font.Color));
SetBkColor(WParam,ColorToRGB(Brush.Color));
Result := Brush.Handle;
except//
Exit;//
end;//
...............................
=====================================
Предполагам, че при теб е нещо друго, но не пречи да опиташ. Лошото е, че грешката не се появява всеки път, а това прави откриването и отстраняването много трудно. Може да сложиш "try..except" и в другите елементи на "case Msg of .... end;".
Re: AV на ComboBox
Това за жалост няма да помогне. try/catch в Буилдера или try/except(?) аналога му в Делфито не може да прихване Access violation.
Днес гледах кога ще се появи на Вин2000 PC-тата отново тази грешка. Хубавото е, че веднъж почне ли да се появява, спасението е рестарт на РС-то, иначе програмите писани с VCL гърмят. Замених един от стандартните VCL ComboBox с аналога му от LMD-Tools SE 7.03 и ....оооо радост ! Онзи красив прозорец с AV вече не се появява.
Днес гледах кога ще се появи на Вин2000 PC-тата отново тази грешка. Хубавото е, че веднъж почне ли да се появява, спасението е рестарт на РС-то, иначе програмите писани с VCL гърмят. Замених един от стандартните VCL ComboBox с аналога му от LMD-Tools SE 7.03 и ....оооо радост ! Онзи красив прозорец с AV вече не се появява.
Re: AV на ComboBox
По дяволите! Онази гадна грешка изкочи отново. Днес цял предиобяд се рових в и-нета за да намеря как се оправя този бъг на VCL, но няма спасение. На едно място видях, че в Д7 и нагоре грешката е отстранена, даже борландци са добавили коментар в кода на VCL за тази грешка - ...\Source\VCL\Controls.pas
функцията е FindControl(...)
Сериозно се замислям да добавя кода от съотв. ф-я в Д7 в моята 6-та версия на VCL. Добавени са няколко реда с проверки.
Въпроса ми е : има ли начин да прекомпилирам VCL-а , така че направените корекции да се отразят в компонентите от палитрата ? Ако това може да стане предполагам, че няма да имам допълнителни проблеми от това, че работя на Буилдера, защото има и Делфи компилатор.
функцията е FindControl(...)
Сериозно се замислям да добавя кода от съотв. ф-я в Д7 в моята 6-та версия на VCL. Добавени са няколко реда с проверки.
Въпроса ми е : има ли начин да прекомпилирам VCL-а , така че направените корекции да се отразят в компонентите от палитрата ? Ако това може да стане предполагам, че няма да имам допълнителни проблеми от това, че работя на Буилдера, защото има и Делфи компилатор.
Re: AV на ComboBox
Май по добрият вариант ще е да направя собствен компонент наследник на TComboBox, като единствената промяна ще да припокрия грешната ф-я FindControl(...)
Re: AV на ComboBox
И това със създаването на нова контрола наследник на TComboBox не е добра идея, защото ф-ята FindControl() от ...\Source\VCL\Controls.pas не е пряко свързана с определена контрола. Вариантите са два:
- да се включи коригирана версия на Controls.pas към проекта и този файл да е в директорията на проекта. В този случай ехе файла нараства с около 1 Мв.
- да се направят корекциите в ...\Source\VCL\Controls.pas да се прекомпилира и получениият файл Controls.dcu да се копира в/у оригиналния в ...\Lib\Obj
.... и се надявам, че точно това съобщения повече няма да го видя.
- да се включи коригирана версия на Controls.pas към проекта и този файл да е в директорията на проекта. В този случай ехе файла нараства с около 1 Мв.
- да се направят корекциите в ...\Source\VCL\Controls.pas да се прекомпилира и получениият файл Controls.dcu да се копира в/у оригиналния в ...\Lib\Obj
.... и се надявам, че точно това съобщения повече няма да го видя.