Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access violation at address 004037D6 in module .... / 10 сообщений из 10, страница 1 из 1
11.03.2019, 17:27
    #39784612
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
Ситуация такова,

Я создаю динамически компоненты и потом их удаляю.

Но вот беда, во время создания компонент начала появляться ошибка вида.

Project alladmin.exe raised exception class EAccessViolation with message 'Access violation at address 004037D6 in module 'alladmin.exe'. Read of address F685D88B'. Process stopped. Use Step or Run to continue.

Нашел в чем ошибка, теперь надо понять почему она возникает.

Короче, я переопределяю некоторые компоненты.

Код: pascal
1.
2.
3.
4.
5.
type
  TGroupBox = class(StdCtrls.TGroupBox)
  protected
    procedure WndProc( var Message: TMessage ); override;
end;



и пишу для них вот такую процедуру.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TGroupBox.WndProc(var Message: TMessage );
begin
   if Message.Msg = WM_SIZE then
    begin

    SetSizeObject();
    inherited;
    end
   else inherited;
end;



Данное сообщение возникает когда я меняю размер компонента или его местоположения.

Если просто создавать компоненты , то все хорошо, но стоит только один из них подвинуть, то при создании компонентов начинаются сыпаться ошибки ..

почему так?
...
Рейтинг: 0 / 0
11.03.2019, 17:43
    #39784615
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
FIL23,

Имхо, патамучта inherited два раза (не по феншую)).
А и к тому же, не до конца понятно, что там у тя в SetSizeObject().
...
Рейтинг: 0 / 0
11.03.2019, 17:57
    #39784621
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
Vlad F,

ни чего особенного просто выставление значений в Эдиты

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure SetSizeObject();   
begin

if (perSender is TWinControl) then
  begin
  fmTemplateOfInventory.JvSpinEditWidth.Value     :=(perSender as TWinControl).Width;
  fmTemplateOfInventory.JvSpinEditHeight.Value    :=(perSender as TWinControl).Height;
  fmTemplateOfInventory.JvSpinEditBottomDown.Value:=(perSender as TWinControl).Top;
  fmTemplateOfInventory.JvSpinEditLeftRight.Value :=(perSender as TWinControl).Left
  end else
    if (perSender is TControl) then
      begin
      fmTemplateOfInventory.JvSpinEditWidth.Value     :=(perSender as TControl).Width;
      fmTemplateOfInventory.JvSpinEditHeight.Value    :=(perSender as TControl).Height;
      fmTemplateOfInventory.JvSpinEditBottomDown.Value:=(perSender as TControl).Top;
      fmTemplateOfInventory.JvSpinEditLeftRight.Value :=(perSender as TControl).Left
      end;
end;
...
Рейтинг: 0 / 0
11.03.2019, 18:12
    #39784630
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
FIL23,

включи Use Debug DCU и включи трассировку стека исключений ( например Jcl Debug или Eureka или madExcept или mORMot или много кто ещё )

потом смотри где конкретно твое исключение произошло
...
Рейтинг: 0 / 0
11.03.2019, 18:13
    #39784631
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
Ariochвключи Use Debug DCU и включи трассировку стека исключений

ну и Debug Info, понятное дело, в EXE надо включать
...
Рейтинг: 0 / 0
11.03.2019, 18:14
    #39784633
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
FIL23ни чего особенногоТеперь мы должны угадать что такое perSender и fmTemplateOfInventory и когда, кем и чем они инициализируются
...
Рейтинг: 0 / 0
11.03.2019, 18:24
    #39784641
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
код вообще на отъе^W скорую руку сбацан

> fmTemplateOfInventory.JvSpinEditBottomDown.Value := (integer value)

у TRxSpinEdit .Value - это Double, а для целочисленных лучше использовать .AsInteger

> (perSender as TControl)

довольно затратная функция, но кэшировать в локальной переменной - это ж вместо копипаста надо 2 строки написать
...
Рейтинг: 0 / 0
11.03.2019, 18:25
    #39784642
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
не говоря о коане, чем вообще различаются эти две строки ???

FIL23
Код: pascal
1.
    fmTemplateOfInventory.JvSpinEditWidth.Value     :=(perSender as TControl).Width;


FIL23
Код: pascal
1.
 fmTemplateOfInventory.JvSpinEditWidth.Value     :=(perSender as TWinControl).Width;
...
Рейтинг: 0 / 0
11.03.2019, 18:26
    #39784644
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
и наконце ещё вопрос, а какие события этот TRx[Jv]SpinEdit вызовет в процессе этого присваивания?
...
Рейтинг: 0 / 0
11.03.2019, 18:28
    #39784646
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Access violation at address 004037D6 in module ....
Ariochдовольно затратная функция, но кэшировать в локальной переменной

но ещё лучше кэшировать не результат функции as, а результат функции .BoundsRect
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access violation at address 004037D6 in module .... / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]