![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Я рехнулся или Delphi?
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] Не ловит исключение.