M>Так вот, если выделенная строка закоментирована — все нормально. Но если нет — то вылетает сообщение: Access vilation at address XXX in modul 'Operplan.dll'
M>Почему???
1) Чему равно значение переменной frmOperPlan ?
2) в любом случае (правильнее и красивее) лучше писать так:
Hello, tim_!
You wrote on Tue, 23 Dec 2003 10:23:11 GMT:
t> Что самое интересное, так это то, что ошибка обращения по адресу t> происходит внутри собственного обработчика события, где, как казалось t> бы, переменная уже должна была быть правильно инициализирована.
не должна. С чего бы это переменная обязательно должна указывать на объект?
По сути получается так, что в методе FormShow класса TfrmOperPlan используется переменная ( frmOperPlan.Height := 162;) которая к классу толком-то и отношения не имеет...
Что мешает программисту сделать так:
var
FRM : TfrmOperPlan;
begin
FRM := TfrmOperPlan.Create(Application);
FRM.FormShow(nil);
end;
и что по твоему сделает вышеприведенное присваивание?
Правильно, AV, если, конечно, frmOperPlan не инициализирована. Если инициализирована, то соответственно значение будет присвоено другому объекту, а вовсе не тому на который ссылается переменная FRM.
t> Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить t> как случается так, что вызов события объекта происходит до создания t> его экземпляра или после его уничтожения.
Уважаемуму Magic нужно перестать использовать левые переменные внутри методов класса, без особой на это надобности, что он, судя по всему, уже понял.
Что самое интересное, так это то, что ошибка обращения по адресу происходит внутри собственного обработчика события, где, как казалось бы, переменная уже должна была быть правильно инициализирована.
Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить как случается так, что вызов события объекта происходит до создания его экземпляра или после его уничтожения.
Здравствуйте, Diouzshev, Вы писали:
D>Hello, tim_! D>You wrote on Tue, 23 Dec 2003 10:23:11 GMT:
t>> Что самое интересное, так это то, что ошибка обращения по адресу t>> происходит внутри собственного обработчика события, где, как казалось t>> бы, переменная уже должна была быть правильно инициализирована. D>не должна. С чего бы это переменная обязательно должна указывать на объект? D>По сути получается так, что в методе FormShow класса TfrmOperPlan используется переменная ( frmOperPlan.Height := 162;) которая к классу толком-то и отношения не имеет...
Вот в том-то и дело, что переменная не имеет совершенно никакого отношения к классу, а по сути является лишь указателем. Я лишь сказал, что (выражаясь более примитивно) frmOperPlan := nil или frmOperPlan := TfrmOperPlan(Random(MaxInt)) ну и т. д. вызовет ту же ошибку в обработчике. D>Что мешает программисту сделать так:
D>
D>и что по твоему сделает вышеприведенное присваивание? D>Правильно, AV, если, конечно, frmOperPlan не инициализирована. Если инициализирована, то соответственно значение будет присвоено другому объекту, а вовсе не тому на который ссылается переменная FRM.
При чем тут ваш пример?! Sender в прилагаемом коде вообще не используется. Речь шла о переменной frmOperPlan!
t>> Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить t>> как случается так, что вызов события объекта происходит до создания t>> его экземпляра или после его уничтожения.
D>Уважаемуму Magic нужно перестать использовать левые переменные внутри методов класса, без особой на это надобности, что он, судя по всему, уже понял.
D>With best regards, Alexander Diouzshev-Maltsev.
Здравствуйте, AlexVinS, Вы писали:
AVS>Согласен, но сам предпочитаю явно nil писать. А,_вообще_, этот указатель мог быть уже не один раз инициализирован и очищен.
Не-а... судя по месту возникновения исключения, а также исходя из атмосферного давления, относительной влажности и скорости полета ворон за окном — ни разу
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Так вот, если выделенная строка закоментирована — все нормально. Но если нет — то вылетает сообщение: Access vilation at address XXX in modul 'Operplan.dll'
Здравствуйте, tim_, Вы писали:
_>Здравствуйте, Diouzshev.
_>Что самое интересное, так это то, что ошибка обращения по адресу происходит внутри собственного обработчика события, где, как казалось бы, переменная уже должна была быть правильно инициализирована.
С чего бы? если посмотреть код проекта, то мы увидим вот такую чтрочку:
причем, судя по описанию ошибки форма — главная и строчки
Application.ShowMainForm := false;
в коде проекта нету.
Соответственно, сразу после создания происходит вызов TfrmOperPlan.Show (причем — до присвоения, ибо присвоение происходит в одной из последних строк Application.CreateForm, если вообще не последней.
А обработчик FormShow вызывается как реакция на событие OnShow, которое происходит внутри (а где же еще) процедуры TWinControl.Show (или даже TControl.Show — не помню).
_>Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить как случается так, что вызов события объекта происходит до создания его экземпляра или после его уничтожения.
Э-э-э нет... на самом деле — в процессе создания
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, AlexVinS, Вы писали:
AVS>Здравствуйте, Hacker_Delphi, Вы писали:
H_D>>Здравствуйте, mrhru, Вы писали:
M>>>1) Чему равно значение переменной frmOperPlan ? H_D>>Зуб даю — nil...
AVS>Если автор темы приведет полное сообщение об AV, то будет понятно потеряешь ты зуб или нет
AVS>А, вообще, там может и мусор быть.
не может... в Delphi даже в доке написано, что стандарт ГАРАНТИРУЕТ nil в неинициализированых глобальных и member указателях. в данном случае как раз глобальный
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, tim_, Вы писали:
_>>Здравствуйте, Diouzshev.
_>>Что самое интересное, так это то, что ошибка обращения по адресу происходит внутри собственного обработчика события, где, как казалось бы, переменная уже должна была быть правильно инициализирована. H_D>С чего бы? если посмотреть код проекта, то мы увидим вот такую чтрочку: H_D>
H_D>причем, судя по описанию ошибки форма — главная и строчки H_D>
H_D>Application.ShowMainForm := false;
H_D>
H_D>в коде проекта нету. H_D>Соответственно, сразу после создания происходит вызов TfrmOperPlan.Show (причем — до присвоения, ибо присвоение происходит в одной из последних строк Application.CreateForm, если вообще не последней. H_D>А обработчик FormShow вызывается как реакция на событие OnShow, которое происходит внутри (а где же еще) процедуры TWinControl.Show (или даже TControl.Show — не помню).
_>>Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить как случается так, что вызов события объекта происходит до создания его экземпляра или после его уничтожения. H_D>Э-э-э нет... на самом деле — в процессе создания
Ну, мы теперь с вами гадать тут будем, как и что у задавшего вопрос инициализируется, криэйтится, вызывается... Где у него там nil а где и мусор, а скорее всего там главная форма, а может, и нет... Что он мог бы прописать до, а что после, а что просто не написал...
Все это, конечно, хорошо и интересно, возможно даже, увлекательно, но не кажется ли вам, коллеги, что мы несколько углубились в вопрос и занялись интеллектуальной мастурбацией (извините за сравнение )?
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, AlexVinS, Вы писали:
AVS>>Здравствуйте, Hacker_Delphi, Вы писали:
H_D>>>Здравствуйте, mrhru, Вы писали:
M>>>>1) Чему равно значение переменной frmOperPlan ? H_D>>>Зуб даю — nil...
AVS>>Если автор темы приведет полное сообщение об AV, то будет понятно потеряешь ты зуб или нет
AVS>>А, вообще, там может и мусор быть. H_D>не может... в Delphi даже в доке написано, что стандарт ГАРАНТИРУЕТ nil в неинициализированых глобальных и member указателях. в данном случае как раз глобальный
Согласен, но сам предпочитаю явно nil писать. А,_вообще_, этот указатель мог быть уже не один раз инициализирован и очищен.
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, AlexVinS, Вы писали:
AVS>>Согласен, но сам предпочитаю явно nil писать. А,_вообще_, этот указатель мог быть уже не один раз инициализирован и очищен. H_D>Не-а... судя по месту возникновения исключения, а также исходя из атмосферного давления, относительной влажности и скорости полета ворон за окном — ни разу