Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Я рехнулся или Delphi?


Страницы:   1 2 3

IGray ©   (2006-09-11 12:07:00) 

Взгляните плииз на простейший код - почему он работает так, как будто try..except там вообще нет?!
В чем дело - есть гипотезы?
Заранее спасибо!
-----------------------------------------

implementation

{$R *.dfm}

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 Write(1); // провоцируем исключение EInOutError (к примеру)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TreeView1.Items.AddChild(nil, 'Node0');
 try
   TreeView1.Selected := TreeView1.Items[0];
 except
   beep; // должно "пикнуть", но не пищит!
 end; // исключение вообще не перехватывается!
end;

end.


IGray   (2006-09-11 14:05:00) [21]


> Плохиш ©  [30]
> Приводи сюда список вызовов и пойдём прямо по строчкам.


TForm1.TreeView1Change(???,???)
Project1


> han_malign


Спасибо! Это что ж получается - дефолтный обработчик вызывается раньше моего?!!! Дурдом... И в каком же хелпе такая дикость описана....

А главное - как это обойти-то...


Плохиш   (2006-09-11 13:43:00) [22]


> han_malign ©   (11.09.06 13:41) [29]
>
> > стек вызовов посмотри и всё поймёшь
>
> - одно но - не забудь включить Use debug DCUs

Какое это отношение имеет к списку вызовов?


Плохиш   (2006-09-11 13:42:00) [23]


> IGray   (11.09.06 13:38) [28]


> > На строчке
> > >  Write(1); // провоцируем исключение EInOutError (к
> примеру)
> > стек вызовов посмотри и всё поймёшь
>
> Я посмотрел - и не понял на что ты намекаешь, может пора
> развеятьснять ореол загадочности?

Приводи сюда список вызовов и пойдём прямо по строчкам. Много времени не займёт, там их всего две.


han_malign   (2006-09-11 13:41:00) [24]


> стек вызовов посмотри и всё поймёшь

- одно но - не забудь включить Use debug DCUs
и попадешь в аккурат в han_malign © (11.09.06 13:22) [26]


IGray   (2006-09-11 13:38:00) [25]


> Плохиш©   (11.09.06 13:12) [24]
> То, что IDE-делфи останавливает выполнение программы при
> возникновении исключений, если это не отключено в настройках.
>  После чего выполнение программы можно продолжить путём
> нажатия кнопок F7/F8/.. О чём в сообщении и пишется, но
> крютые прогеры, или читать не научились, или языков не знают,
>  но вопить о глюках могут.

Я уже 10 лет это всё знаю, так что хватит наезжать - попробуй код сначала, если по делу сказать что хочешь, а хелпы не ты один читать умеешь.


> На строчке
> >  Write(1); // провоцируем исключение EInOutError (к примеру)
> стек вызовов посмотри и всё поймёшь

Я посмотрел - и не понял на что ты намекаешь, может пора развеятьснять ореол загадочности?


> Reindeer Moss Eater©   (11.09.06 13:14) [25]
> ... use the $I+ directive to enable I/O checking ...

Это я всё знаю..
Естественно I/O checking у меня включен (по умолчанию)
О чем собственно и свидетельствует то, что исключение возникает, и доходит до дефолтного обработчика.

---------------
Сейчай выяснил, что с обработчиком Edit1Change прикол тот же самый:-(


Плохиш   (2006-09-11 13:28:00) [26]


> han_malign ©   (11.09.06 13:22) [26]

На строчке

>  Write(1); // провоцируем исключение EInOutError (к примеру)

стек вызовов посмотри и всё поймёшь.


han_malign   (2006-09-11 13:22:00) [27]

O!!! Вот здесь оно и отлавливается...
procedure TWinControl.MainWndProc(var Message: TMessage);
begin
  try
   try
     WindowProc(Message);
   finally
     FreeDeviceContexts;
     FreeMemoryContexts;
   end;
  except
   Application.HandleException(Self);
 end;

end;


Reindeer Moss Eater   (2006-09-11 13:14:00) [28]

... use the $I+directive to enable I/Ochecking ...


Плохиш   (2006-09-11 13:12:00) [29]


> IGray   (11.09.06 13:06) [22]


> думаешь я 10 лет без справки по дельфе шарюсь? ;)
> Если я что пропустил - скажи прямо плииз.

То, что IDE-делфи останавливает выполнение программы при возникновении исключений, если это не отключено в настройках. После чего выполнение программы можно продолжить путём нажатия кнопок F7/F8/.. О чём в сообщении и пишется, но крютые прогеры, или читать не научились, или языков не знают, но вопить о глюках могут.


IGray   (2006-09-11 13:08:00) [30]

сорри - криво процитировал..


IGray   (2006-09-11 13:06:00) [31]


> Плохиш ©   (11.09.06 13:02) [19]
>
> > novill ©   (11.09.06 12:59) [18]
> > Почему его там нет? Почему при появлении exception в процессе
>
> > выполнения  блока try ... except вызывает стандарный обрабочик
>
> > исключения, а не описанный в блоке except?
>
> А F7/F8 нажимать не пробовал? LMD


> Reindeer Moss Eater ©   (11.09.06 12:54) [17]
> Не ловит, потому что его там уже нет.

Если бы его там не было - дефолтный обработчик бы не вазывался.

> >но пока всё говорит не в пользу Delphi..
> А может все же справку открыть?

думаешь я 10 лет без справки по дельфе шарюсь? ;)
Если я что пропустил - скажи прямо плииз.


han_malign   (2006-09-11 13:05:00) [32]

procedure TCustomTreeView.SetSelected(Value: TTreeNode);
begin
 if Value <> nil then
   Value.Selected := True
 else
    TreeView_SelectItem(Handle, nil);
end;

procedure TTreeNode.SetSelected(Value: Boolean);
begin
 if not Deleting and (Handle <> 0) and (ItemId <> nil) then
   if Value <> Selected then
   begin
     if Value then TreeView_SelectItem(Handle, ItemId)
     else if Selected then TreeView_SelectItem(Handle, nil);
   end
   else if (TreeView.MultiSelect) and (TreeView.FSelections.Count > 1) then
     TreeView.Select(Self, []);
end;

procedure TCustomTreeView.CNNotify(var Message: TWMNotify);
var
 Node: TTreeNode;
 MousePos: TPoint;
 R: TRect;
 DefaultDraw, PaintImages: Boolean;
 TmpItem: TTVItem;
 LogFont: TLogFont;
begin
 with Message do
   case NMHdr^.code of
........................................
      TVN_SELCHANGEDA, TVN_SELCHANGEDW:
       with PNMTreeView(NMHdr)^ do
         if FChangeTimer.Interval > 0 then
         with FChangeTimer do
         begin
           Enabled := False;
           Tag := Integer(GetNodeFromItem(itemNew));
           Enabled := True;
         end
         else
           Change(GetNodeFromItem(itemNew));
........................................
end;

procedure TCustomTreeView.OnChangeTimer(Sender: TObject);
begin
 FChangeTimer.Enabled := False;
 Change(TTreeNode(FChangeTimer.Tag));
end;

даже если FChangeTimer.Interval = ChangeDelay = 0, исключение уходит  в недра User32(?) в обработку очередисообщений, а как оно(Delphi-йское) там обрабатывается я уже не знаю...


novill   (2006-09-11 13:04:00) [33]

> [19] Плохиш ©   (11.09.06 13:02)

а ты?


Плохиш   (2006-09-11 13:02:00) [34]


> novill ©   (11.09.06 12:59) [18]
> Почему его там нет? Почему при появлении exception в процессе
> выполнения  блока try ... except вызывает стандарный обрабочик
> исключения, а не описанный в блоке except?

А F7/F8 нажимать не пробовал? LMD


novill   (2006-09-11 12:59:00) [35]

> [14] Elen ©   (11.09.06 12:48)

понятно, что так исключение ловится, вопрос в другом.

> [15] Reindeer Moss Eater ©   (11.09.06 12:49)

Почему его там нет? Почему при появлении exception в процессе выполнения  блока try ... except вызывает стандарный обрабочик исключения, а не описанный в блоке except?

Может, процитируешь справку по Дельфи, где такое поведение описано?


Reindeer Moss Eater   (2006-09-11 12:54:00) [36]

>но пока всё говорит не в пользу Delphi..

А может все же справку открыть?


IGray   (2006-09-11 12:53:00) [37]


> Elen
> Потому что  TreeView1.Selected := TreeView1.Items[0];
> не вызывает обработку TForm1.TreeView1Change.
если Selected=nil, то вызывает - 100%

> И вообще смотри [5] - это правильнее
врядли, так как в большинстве случаев правильнее пропустить исключение "наверх", но вопрос-то не в этом вообще, и не в том, как правильно "пискнуть" (это я для примера написал), а в том, что обработка исключений в Delphi вроде как сбоит 8-(



> Desdechado[2]
> брякпойнт ставил?
ставил - на beep вообще не попадает - сразу на дефолтный обработчик уходит :-(



> Dmitrij_K[3]
> >  Я рехнулся или Delphi?
> в 99% случаях ты
знаю, и очень надеюсь, что и сейчас так, но пока всё говорит не в пользу Delphi..


Reindeer Moss Eater   (2006-09-11 12:49:00) [38]

Не ловит, потому что его там уже нет.


Elen   (2006-09-11 12:48:00) [39]


> novill ©

так работает

procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.AddChild(nil, 'Node0');

  TreeView1.Selected := TreeView1.Items[0];
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
try
Write(1); // провоцируем исключение EInOutError (к примеру)
except
  beep;
end; //

end;


novill   (2006-09-11 12:47:00) [40]

как описано в [0] Не ловит исключение.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо