Re[2]: Странно ведет себя Delphi
От: Аноним  
Дата: 22.12.03 09:39
Оценка: 25 (2) :)
Вероятно, еще правильнее (и красивее)

Height := 162
Re: Странно ведет себя Delphi
От: mrhru Россия  
Дата: 22.12.03 08:28
Оценка: 6 (2) +1
Здравствуйте, Magic, Вы писали:

M>Я в шоке!

M>Код следующий:

M>
M>procedure TfrmOperPlan.FormShow(Sender: TObject);
M>var
M>  year, month, day    : word;
M>begin
M>  frmOperPlan.Height := 162;

M>  OperplanExcel.DBaseName:=dbOperPlan.DatabaseName;
  
M>  OperplanExcel.UserName_ :=dbOperPlan.Params.Values['USER NAME'];
M>  OperplanExcel.Password  :=dbOperPlan.Params.Values['PASSWORD'];
M>  OperplanExcel.BaseName  :=AliasParam(dbOperPlan.AliasName, 0);
M>  OperplanExcel.ServerName:=AliasParam(dbOperPlan.AliasName, 1);

M>  cbMonth.Enabled         := false;
M>  lcFinplan.LookupDisplay := 'name';
M>  lcFinplan.LookupField   := 'finplan_id';
M>  ...
M>


M>Так вот, если выделенная строка закоментирована — все нормально. Но если нет — то вылетает сообщение: Access vilation at address XXX in modul 'Operplan.dll'


M>Почему???


1) Чему равно значение переменной frmOperPlan ?
2) в любом случае (правильнее и красивее) лучше писать так:
  Self.Height := 162;
Re[5]: Странно ведет себя Delphi
От: Diouzshev Россия  
Дата: 23.12.03 13:44
Оценка: +1 -1
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 нужно перестать использовать левые переменные внутри методов класса, без особой на это надобности, что он, судя по всему, уже понял.

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Странно ведет себя Delphi
От: Hacker_Delphi Россия  
Дата: 22.12.03 12:02
Оценка: +1
Здравствуйте, mrhru, Вы писали:

M>1) Чему равно значение переменной frmOperPlan ?

Зуб даю — nil...
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[4]: Странно ведет себя Delphi
От: tim_ Россия  
Дата: 23.12.03 10:23
Оценка: -1
Здравствуйте, Diouzshev.

Что самое интересное, так это то, что ошибка обращения по адресу происходит внутри собственного обработчика события, где, как казалось бы, переменная уже должна была быть правильно инициализирована.
Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить как случается так, что вызов события объекта происходит до создания его экземпляра или после его уничтожения.
Re[6]: Странно ведет себя Delphi
От: tim_ Россия  
Дата: 23.12.03 15:54
Оценка: -1
Здравствуйте, 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>var 
D>  FRM : TfrmOperPlan;
D>begin
D>  FRM := TfrmOperPlan.Create(Application);
D>  FRM.FormShow(nil);
D>end;
D>

D>и что по твоему сделает вышеприведенное присваивание?
D>Правильно, AV, если, конечно, frmOperPlan не инициализирована. Если инициализирована, то соответственно значение будет присвоено другому объекту, а вовсе не тому на который ссылается переменная FRM.

При чем тут ваш пример?! Sender в прилагаемом коде вообще не используется. Речь шла о переменной frmOperPlan!

t>> Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить

t>> как случается так, что вызов события объекта происходит до создания
t>> его экземпляра или после его уничтожения.

D>Уважаемуму Magic нужно перестать использовать левые переменные внутри методов класса, без особой на это надобности, что он, судя по всему, уже понял.


D>With best regards, Alexander Diouzshev-Maltsev.
Re[6]: Странно ведет себя Delphi
От: Hacker_Delphi Россия  
Дата: 24.12.03 05:46
Оценка: :)
Здравствуйте, AlexVinS, Вы писали:

AVS>Согласен, но сам предпочитаю явно nil писать. А,_вообще_, этот указатель мог быть уже не один раз инициализирован и очищен.

Не-а... судя по месту возникновения исключения, а также исходя из атмосферного давления, относительной влажности и скорости полета ворон за окном — ни разу
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Странно ведет себя Delphi
От: Magic Россия  
Дата: 22.12.03 08:21
Оценка:
Я в шоке!
Код следующий:

procedure TfrmOperPlan.FormShow(Sender: TObject);
var
  year, month, day    : word;
begin
  frmOperPlan.Height := 162;

  OperplanExcel.DBaseName:=dbOperPlan.DatabaseName;
  
  OperplanExcel.UserName_ :=dbOperPlan.Params.Values['USER NAME'];
  OperplanExcel.Password  :=dbOperPlan.Params.Values['PASSWORD'];
  OperplanExcel.BaseName  :=AliasParam(dbOperPlan.AliasName, 0);
  OperplanExcel.ServerName:=AliasParam(dbOperPlan.AliasName, 1);

  cbMonth.Enabled         := false;
  lcFinplan.LookupDisplay := 'name';
  lcFinplan.LookupField   := 'finplan_id';
  ...


Так вот, если выделенная строка закоментирована — все нормально. Но если нет — то вылетает сообщение: Access vilation at address XXX in modul 'Operplan.dll'

Почему???
Re: Странно ведет себя Delphi
От: tim_ Россия  
Дата: 22.12.03 10:17
Оценка:
Здравствуйте, Magic, Вы писали:

M>Я в шоке!

M>Почему???

Форма находится в подгружаемой библиотеке?
Re[3]: Странно ведет себя Delphi
От: Diouzshev Россия  
Дата: 23.12.03 08:47
Оценка:
Hello, Hacker_Delphi!
You wrote on Mon, 22 Dec 2003 12:02:56 GMT:

M>> 1) Чему равно значение переменной frmOperPlan ?

HD> Зуб даю — nil...

Зря даешь — ссылка м.б. вникуда

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.8 beta
Re[4]: Странно ведет себя Delphi
От: ArtDenis Россия  
Дата: 23.12.03 09:20
Оценка:
Здравствуйте, Diouzshev, Вы писали:

HD>> Зуб даю — nil...

D>Зря даешь — ссылка м.б. вникуда

Одним зубом стало меньше...
... << RSDN@Home 1.1.0 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Странно ведет себя Delphi
От: AlexVinS Россия  
Дата: 23.12.03 13:49
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, mrhru, Вы писали:


M>>1) Чему равно значение переменной frmOperPlan ?

H_D>Зуб даю — nil...

Если автор темы приведет полное сообщение об AV, то будет понятно потеряешь ты зуб или нет

А, вообще, там может и мусор быть.


Умный человек знает не многое, но нужное
Re[7]: Странно ведет себя Delphi
От: tim_ Россия  
Дата: 23.12.03 15:59
Оценка:
Т.е. Рабочий пример:

var 
  frmOperPlan: TfrmOperPlan;
begin
  frmOperPlan:= TfrmOperPlan.Create(Application);
  frmOperPlan.FormShow(nil);
end;


Не рабочий пример, если нет экземпляра для frmOperPlan:
var 
  FRM: TfrmOperPlan;
begin
  FRM := TfrmOperPlan.Create(Application);
  FRM.FormShow(nil);
end;
Re[8]: Странно ведет себя Delphi
От: Diouzshev Россия  
Дата: 23.12.03 16:45
Оценка:
Hello, tim_!
You wrote on Tue, 23 Dec 2003 15:59:19 GMT:

t> Т.е. Рабочий пример:


t>
 t> var    frmOperPlan: TfrmOperPlan;
 t> begin   frmOperPlan:= TfrmOperPlan.Create(Application);
 t>   frmOperPlan.FormShow(nil);
 t> end;
 t>


t> Не рабочий пример, если нет экземпляра для frmOperPlan:

t>
 t> var 
 t>   FRM: TfrmOperPlan;
 t> begin
 t>   FRM := TfrmOperPlan.Create(Application);
 t>   FRM.FormShow(nil);
 t> end;
 t>


Вот теперь все правильно %)

With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.8 beta
Re[5]: Странно ведет себя Delphi
От: Hacker_Delphi Россия  
Дата: 23.12.03 18:16
Оценка:
Здравствуйте, tim_, Вы писали:

_>Здравствуйте, Diouzshev.


_>Что самое интересное, так это то, что ошибка обращения по адресу происходит внутри собственного обработчика события, где, как казалось бы, переменная уже должна была быть правильно инициализирована.

С чего бы? если посмотреть код проекта, то мы увидим вот такую чтрочку:
Application.CreateForm(TfrmOperPlan, frmOperPlan);

причем, судя по описанию ошибки форма — главная и строчки
Application.ShowMainForm := false;

в коде проекта нету.
Соответственно, сразу после создания происходит вызов TfrmOperPlan.Show (причем — до присвоения, ибо присвоение происходит в одной из последних строк Application.CreateForm, если вообще не последней.
А обработчик FormShow вызывается как реакция на событие OnShow, которое происходит внутри (а где же еще) процедуры TWinControl.Show (или даже TControl.Show — не помню).

_>Ну а все, что нужно сделать вам, уважаемый Magic, так это выяснить как случается так, что вызов события объекта происходит до создания его экземпляра или после его уничтожения.

Э-э-э нет... на самом деле — в процессе создания
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[4]: Странно ведет себя Delphi
От: Hacker_Delphi Россия  
Дата: 23.12.03 18:26
Оценка:
Здравствуйте, 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 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[6]: Странно ведет себя Delphi
От: tim_ Россия  
Дата: 23.12.03 19:16
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, tim_, Вы писали:


_>>Здравствуйте, Diouzshev.


_>>Что самое интересное, так это то, что ошибка обращения по адресу происходит внутри собственного обработчика события, где, как казалось бы, переменная уже должна была быть правильно инициализирована.

H_D>С чего бы? если посмотреть код проекта, то мы увидим вот такую чтрочку:
H_D>
H_D>Application.CreateForm(TfrmOperPlan, frmOperPlan);
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 а где и мусор, а скорее всего там главная форма, а может, и нет... Что он мог бы прописать до, а что после, а что просто не написал...
Все это, конечно, хорошо и интересно, возможно даже, увлекательно, но не кажется ли вам, коллеги, что мы несколько углубились в вопрос и занялись интеллектуальной мастурбацией (извините за сравнение )?
Re[5]: Странно ведет себя Delphi
От: AlexVinS Россия  
Дата: 24.12.03 05:08
Оценка:
Здравствуйте, 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 писать. А,_вообще_, этот указатель мог быть уже не один раз инициализирован и очищен.


Умный человек знает не многое, но нужное
Re[7]: Странно ведет себя Delphi
От: AlexVinS Россия  
Дата: 24.12.03 08:22
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, AlexVinS, Вы писали:


AVS>>Согласен, но сам предпочитаю явно nil писать. А,_вообще_, этот указатель мог быть уже не один раз инициализирован и очищен.

H_D>Не-а... судя по месту возникновения исключения, а также исходя из атмосферного давления, относительной влажности и скорости полета ворон за окном — ни разу

А еще учитывая, что это все происходит в dll ...


Умный человек знает не многое, но нужное
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.