Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Access violation at address 004037D6 in module ....  [new]
FIL23
Member

Откуда:
Сообщений: 392
Ситуация такова,

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

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

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.

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

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

type
  TGroupBox = class(StdCtrls.TGroupBox)
  protected
    procedure WndProc( var Message: TMessage ); override;
end;


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

procedure TGroupBox.WndProc(var Message: TMessage );
begin
   if Message.Msg = WM_SIZE then
    begin

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


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

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

почему так?
11 мар 19, 17:27    [21829515]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
Vlad F
Member

Откуда:
Сообщений: 706
FIL23,

Имхо, патамучта inherited два раза (не по феншую)).
А и к тому же, не до конца понятно, что там у тя в SetSizeObject().
11 мар 19, 17:43    [21829533]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
FIL23
Member

Откуда:
Сообщений: 392
Vlad F,

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

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;
11 мар 19, 17:57    [21829561]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
Arioch
Member

Откуда:
Сообщений: 10675
FIL23,

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

потом смотри где конкретно твое исключение произошло
11 мар 19, 18:12    [21829586]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
Arioch
Member

Откуда:
Сообщений: 10675
Arioch
включи Use Debug DCU и включи трассировку стека исключений


ну и Debug Info, понятное дело, в EXE надо включать
11 мар 19, 18:13    [21829588]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10782
FIL23
ни чего особенного
Теперь мы должны угадать что такое perSender и fmTemplateOfInventory и когда, кем и чем они инициализируются
11 мар 19, 18:14    [21829593]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
Arioch
Member

Откуда:
Сообщений: 10675
код вообще на отъе^W скорую руку сбацан

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

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

> (perSender as TControl)

довольно затратная функция, но кэшировать в локальной переменной - это ж вместо копипаста надо 2 строки написать
11 мар 19, 18:24    [21829612]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
Arioch
Member

Откуда:
Сообщений: 10675
не говоря о коане, чем вообще различаются эти две строки ???

FIL23
    fmTemplateOfInventory.JvSpinEditWidth.Value     :=(perSender as TControl).Width;

FIL23
 fmTemplateOfInventory.JvSpinEditWidth.Value     :=(perSender as TWinControl).Width;
11 мар 19, 18:25    [21829613]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
Arioch
Member

Откуда:
Сообщений: 10675
и наконце ещё вопрос, а какие события этот TRx[Jv]SpinEdit вызовет в процессе этого присваивания?
11 мар 19, 18:26    [21829617]     Ответить | Цитировать Сообщить модератору
 Re: Access violation at address 004037D6 in module ....  [new]
Arioch
Member

Откуда:
Сообщений: 10675
Arioch
довольно затратная функция, но кэшировать в локальной переменной


но ещё лучше кэшировать не результат функции as, а результат функции .BoundsRect
11 мар 19, 18:28    [21829620]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить