Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Я рехнулся или 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.013 c
15-1157819399
PSPF2003
2006-09-09 20:29
2006.10.01
Смена IP адреса


2-1158099340
Ref
2006-09-13 02:15
2006.10.01
тыблицы ADO


1-1156108386
Out
2006-08-21 01:13
2006.10.01
Перехват сообщений


4-1148436426
not ZX
2006-05-24 06:07
2006.10.01
msocommandbardock


15-1158038544
Michael5
2006-09-12 09:22
2006.10.01
При загрузке WinXP на этапе ввода пароля пользователя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский