Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Я рехнулся или Delphi?   Найти похожие ветки 

 
IGray   (2006-09-11 12:07) [0]

Взгляните плииз на простейший код - почему он работает так, как будто 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.


 
Dmitrij_K   (2006-09-11 12:13) [1]


> должно "пикнуть", но не пищит!

Может пишалка не работает.


 
Desdechado ©   (2006-09-11 12:14) [2]

брякпойнт ставил?


 
Dmitrij_K   (2006-09-11 12:18) [3]


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

в 99% случаях ты


 
Сергей М. ©   (2006-09-11 12:19) [4]


> beep; // должно "пикнуть", но не пищит!


Windows.Beep(частота, длительность);


 
Dell3r ©   (2006-09-11 12:19) [5]

Попробуй так. :)
implementation

{$R *.dfm}

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

procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.AddChild(nil, "Node0");
TreeView1.Selected := TreeView1.Items[0];
end;

end.


 
balepa ©   (2006-09-11 12:22) [6]

Из под Дельфи запускал ?


 
novill ©   (2006-09-11 12:31) [7]

Действительно странно. Проверил на D6. Так и есть try except игнорит.


 
Elen ©   (2006-09-11 12:31) [8]


>  почему он работает

Потому что  TreeView1.Selected := TreeView1.Items[0];
не вызывает обработку TForm1.TreeView1Change.
И вообще смотри [5] - это правильнее


 
novill ©   (2006-09-11 12:36) [9]

> >  почему он работает
>
> Потому что  TreeView1.Selected := TreeView1.Items[0];
> не вызывает обработку TForm1.TreeView1Change.

Вызывает, если текущий узел был другим


 
Reindeer Moss Eater ©   (2006-09-11 12:39) [10]

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
{$I-}
Write(1);
if IOResult <> 0 then raise Exception.Create("не забываем читать факинмануал");
{$I+}
end;


 
novill ©   (2006-09-11 12:41) [11]

> [10] Reindeer Moss Eater ©   (11.09.06 12:39)


при

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 raise Exception.Create("что-то исключительное");
end;

ведет себя также ;-)


 
Reindeer Moss Eater ©   (2006-09-11 12:43) [12]

Как так же-то?


 
novill ©   (2006-09-11 12:47) [13]

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


 
Elen ©   (2006-09-11 12:48) [14]


> 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;


 
Reindeer Moss Eater ©   (2006-09-11 12:49) [15]

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


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


> 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:54) [17]

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

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


 
novill ©   (2006-09-11 12:59) [18]

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

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

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

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

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


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


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

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


 
novill ©   (2006-09-11 13:04) [20]

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

а ты?


 
han_malign ©   (2006-09-11 13:05) [21]

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-йское) там обрабатывается я уже не знаю...


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


> Плохиш ©   (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 лет без справки по дельфе шарюсь? ;)
Если я что пропустил - скажи прямо плииз.


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

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


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


> IGray   (11.09.06 13:06) [22]


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

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


 
Reindeer Moss Eater ©   (2006-09-11 13:14) [25]

... use the $I+ directive to enable I/O checking ...


 
han_malign ©   (2006-09-11 13:22) [26]

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

end;


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


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

На строчке

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

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


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


> Плохиш ©   (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 прикол тот же самый :-(


 
han_malign ©   (2006-09-11 13:41) [29]


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

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


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


> IGray   (11.09.06 13:38) [28]


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

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


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


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

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


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


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


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


> han_malign


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

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


 
Reindeer Moss Eater ©   (2006-09-11 14:12) [33]

У тебя же в try/except обернут не тот код, который вызывает исключение.


 
Elen ©   (2006-09-11 14:12) [34]


> IGray

А чем [14] не подходит? Поподробнее обрисуй ссуть...


 
Reindeer Moss Eater ©   (2006-09-11 14:16) [35]

Вокруг какой-то фигни раздули тему....

{$I+}
try
 WriteLn;
except
 ShowMessage("Вот оно пойманое исключение");
end;


 
novill ©   (2006-09-11 14:16) [36]

> [26] han_malign ©   (11.09.06 13:22)
Спасибо

>Плохиш
поищите достойную стену


 
Плохиш ©   (2006-09-11 14:17) [37]


> IGray   (11.09.06 14:05) [32]
> TForm1.TreeView1Change(???,???)
> Project1

А теперь покажи, где здесь находиться TForm1.Button1Click.

По строчкам
Исключение произошло в TForm1.TreeView1Change и не было там подавлено, соответственно оно перерешло в цикл обработки сообщений основной программы, где и было обработано штатным образом. Это является документированной работой системы вындовс. Для изменения состояния чего-либо, этому что-либо посылается сообщение, которое будет когда-то обработано в цикле выборки сообщений.

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

Идти пошагово надо от строки

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


 
Плохиш ©   (2006-09-11 14:20) [38]


> novill ©   (11.09.06 14:16) [36]
> >Плохиш
> поищите достойную стену

Она находиться прямо за вами, можете уже разбегаться.


 
vl_chel ©   (2006-09-11 14:22) [39]

Если повторяюсь прошу извинить
Но если Вы вспомните то пока не закончилось выполнение одного обработчика события другой не начинает выполняться!!!
Поэтому зпись в поле Selected происходит после завершения обработчика TForm1.Button1Click поэтому вы не можете перехватить ситуацию исключения она возникает позднее


 
Reindeer Moss Eater ©   (2006-09-11 14:28) [40]

procedure TForm1.OnMyMsg(var Msg: TMessage);
begin
Writeln;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
{$I+}
try
 Writeln;
except
 ShowMessage("Оппа!");
end;

try
 SendMessage(Handle,WM_MYMSG,0,0);
except
 ShowMessage("С какой стати здесь чего-то ждать?");
end;
end;



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.054 c
4-1148825708
chizra
2006-05-28 18:15
2006.10.01
Как узнать позицию указателя открытого средствами API файла?


15-1158060127
Alex_KV
2006-09-12 15:22
2006.10.01
Нужен алгоритм


1-1156172149
Fay
2006-08-21 18:55
2006.10.01
THintWindow.CalcHintRect


6-1147071006
dmitrlast
2006-05-08 10:50
2006.10.01
Работа с файлами по локальной сети


2-1157703387
Kolan
2006-09-08 12:16
2006.10.01
Где в BDS 2006 находится детектор утечек.