Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как избавиться от сообщений об ошибках?


Автор: Alexzz 27.7.2008, 20:56
Осваиваю связь через Tserversocket и Tclientsocket. Если например пытаться соединиться с другим компом, но там в тот момент не запущена программа, то возникает ошибка. Ну это нормально. Не нормально то, что прога при этом выдаёт мессагу об ошибке сокета. Формы try - except не помогают, так как соединение очевидно обрабатывается в другом потоке, который автоматически создаётся. У компонентов есть событие onError, если я прописываю туда обработчик, то выполняется и он, и затем всё равно выдаётся мессага.

Вопрос - как избавиться от сообщений об ошибках?

Автор: VICTAR 27.7.2008, 21:48
Какая ошибка? 
В onError помогает Error := 0
ps для таких вопросов есть раздел Сети

Автор: Alexzz 27.7.2008, 22:31
VICTAR, вопрос не по ошибке, с ней всё понятно - если не с кем соединяться, то возникает ошибка. Вопрос о том, что-бы сделать обработчик ошибок и не бегать к компу жать на ок по каждой проблеме.

Процедуре обработки ошибки передаётся переменная ErrorCode. Ты её имел в виду? Или именно Error?

Ща попробую.

з.ы. вопрос то не по сетям а по обработке ошибок.

Добавлено через 6 минут и 33 секунды
Ура!!! Огромное спасибо!

ErrorCode:=0; в обработчике решило проблему.

Автор: Dobermann 4.12.2008, 22:11
Не стал новую тему создавать.
Чёт с EConvertError неполучается...
Как сделать, чтобы в эдит нельзя было буквы вводить??? Всмысле как обработать эту ошибку?!
У меня на эдите strtoint стоит, т.е. нужно чтобы выскакивало не системное сообщение, а мое!

Автор: Christoph 4.12.2008, 22:40
А так нельзя?

Код

Try
 ...
  except 
    on EConvertError Do
      begin
       ...\\ Обработка ошибки
      end;

Автор: Dobermann 4.12.2008, 22:52
Код

try 
strtoint(edit1.text)
except
 on e: EConvertError do
   begin
     showmessage(e.message+ ' asdf')
   end;
end; 

Сперва вылетает мое сообщение, а затем все равно системное...

Автор: Christoph 4.12.2008, 23:15
В такой ситуации не может вылетать ошибка, просто ты запустил под отладкой Ф9 нажал, а ты скомпиль и запусти отдельно ехе, все работает  smile 

Автор: MetalFan 4.12.2008, 23:15
1. Пользуй TryStrToInt.
2. Для разрешения ввода только цифр в едит установить стиль ES_NUMBER

Автор: Dobermann 4.12.2008, 23:29
Цитата(Christoph @  4.12.2008,  23:15 Найти цитируемый пост)
В такой ситуации не может вылетать ошибка, просто ты запустил под отладкой Ф9 нажал, а ты скомпиль и запусти отдельно ехе, все работает  

И даже в скомпилинной тоже вылетает! =(
Цитата

'' is not a valid integer value

Цитата(MetalFan @  4.12.2008,  23:15 Найти цитируемый пост)
1. Пользуй TryStrToInt.

А как его правильно в моем случае использовать???
Цитата(MetalFan @  4.12.2008,  23:15 Найти цитируемый пост)
2. Для разрешения ввода только цифр в едит установить стиль ES_NUMBER

Чёт не нашел такого значения у свойств...

Автор: Exai1e 4.12.2008, 23:43
Dobermann
Цитата(Dobermann @  5.12.2008,  00:29 Найти цитируемый пост)
А как его правильно в моем случае использовать???

кнопка ф1 на клаве отсутствует ?
http://delphi.about.com/library/rtl/blrtlTryStrToInt.htm

Добавлено @ 23:45
Цитата(Dobermann @  5.12.2008,  00:29 Найти цитируемый пост)
Чёт не нашел такого значения у свойств... 

Код

var defs: Dword;
  defs := GetWindowLong(edtSearch.Handle, GWL_STYLE);
  SetWindowLong(edtSearch.Handle, GWL_STYLE, defs or ES_NUMBER);

Автор: THandle 4.12.2008, 23:46
Цитата(Dobermann @  4.12.2008,  23:29 Найти цитируемый пост)
А как его правильно в моем случае использовать???

Код


procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  if TryStrToInt(Edit1.Text, I) then
    { ...
      Преобразовали. В I - число.
    }
end;



Цитата(Dobermann @  4.12.2008,  23:29 Найти цитируемый пост)
Чёт не нашел такого значения у свойств... 


Это стиль.

Код

SetWindowLong(Edit1.Handle, GWL_STYLE,
  GetWindowLong(Edit1.Handle, GWL_STYLE) Or ES_NUMBER);


Добавлено через 2 минуты и 32 секунды
Цитата(Dobermann @  4.12.2008,  23:29 Найти цитируемый пост)
А как его правильно в моем случае использовать???


Кстати оно во всех случаях одинаково используется...



Автор: Christoph 4.12.2008, 23:49
Код

SetWindowLong(Edit1.Handle, GWL_STYLE, GetWindowLong(edit1.Handle, GWL_STYLE) or ES_NUMBER)



http://delphi.about.com/library/rtl/blrtlTryStrToInt.htm

Та я пока написал smile уже написали все smile я просто не видел предыдущие посты  smile 

Автор: Exai1e 4.12.2008, 23:50
ps. кто еще даст ответ ? или 3х уже достаточно ;)  smile 

Автор: Dobermann 5.12.2008, 01:05
Цитата(Exai1e @  4.12.2008,  23:50 Найти цитируемый пост)
ps. кто еще даст ответ ? или 3х уже достаточно ;)

Мерси мальчики =*
Цитата

SetWindowLong(Edit1.Handle, GWL_STYLE,
  GetWindowLong(Edit1.Handle, GWL_STYLE) Or ES_NUMBER);

Вот это работает!
А если у меня 5 эдитов, то надо в пяти таких сообщениях стиля указывать по очереди все 5 эдитов???
Можно это автоматизировать или зациклить??? Или еще что-нибудь...
Т.е.:
Цитата

SetWindowLong(Edit1.Handle,...
SetWindowLong(Edit2.Handle,...
SetWindowLong(Edit3.Handle,...
SetWindowLong(Edit4.Handle,...
SetWindowLong(Edit5.Handle,...


Автор: Christoph 5.12.2008, 10:26
Выделить все Edit в Object TreeView и затем создать событие OnEnter и это событие будет общим для всех Edit ов

Вот что получится:

Код

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  SetWindowLong(Edit1.Handle, GWL_STYLE, GetWindowLong(edit1.Handle, GWL_STYLE) or ES_NUMBER) ;
  SetWindowLong(Edit2.Handle, GWL_STYLE, GetWindowLong(edit2.Handle, GWL_STYLE) or ES_NUMBER);
  SetWindowLong(Edit3.Handle, GWL_STYLE, GetWindowLong(edit3.Handle, GWL_STYLE) or ES_NUMBER);
  SetWindowLong(Edit4.Handle, GWL_STYLE, GetWindowLong(edit4.Handle, GWL_STYLE) or ES_NUMBER);
  SetWindowLong(Edit5.Handle, GWL_STYLE, GetWindowLong(edit5.Handle, GWL_STYLE) or ES_NUMBER)
end;

Автор: THandle 5.12.2008, 10:35
Christoph, зачем каждый раз при вхождении назначать всем Edit'ам стили??? smile Этого достаточно сделать один раз в том же OnCreate, ну или хотя бы сделать как-то так, хотя тоже глупость:

Назначить всем Edit'ам один OnEnter и написать что-то типа:

Код

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  if (Sender is TEdit) then
    if GetWindowLong(TWinControl(Sender).Handle, GWL_STYLE) and ES_NUMBER = 0 then
      SetWindowLong(TWinControl(Sender).Handle, GWL_STYLE, GetWindowLong(TWinControl(Sender).Handle, GWL_STYLE) or ES_NUMBER) ;
end;


Хотя постоянные проверки... Надо в OnCreate всем Edit'ам и устанавливать стиль smile

Автор: Dobermann 5.12.2008, 10:36
Ну я так и понял... smile 

Автор: Christoph 5.12.2008, 10:39
ыыы не подумал smile а зачем делать проверки? ты боишся что в Сендере будет что то другое валяться? smile
 
Кста по поводу то что не работает блок try except, ниже проект


Автор: Dobermann 5.12.2008, 11:36
Разобрался!
Просто у меня еще и после try - except шло повторное считывание с эдитов =) чёт я его не заметил...
Сё работает! Пасыбо!  smile 

Автор: Exai1e 5.12.2008, 12:46
Цитата(Christoph @  5.12.2008,  11:39 Найти цитируемый пост)
ты боишся что в Сендере будет что то другое валяться? 

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

Автор: Dobermann 5.12.2008, 12:52
Цитата(Exai1e @  5.12.2008,  12:46 Найти цитируемый пост)
код выглядт приятнее у хэндла и правильнее.

Да, только вот у меня 10 точек, по 2 координаты - и того 20 эдитов...

Автор: THandle 5.12.2008, 12:59
Dobermann, присвой всем Edit'ам в которые нужно вводить только цифра Tag := 1;

В OnCreate пробегайся по контролам и если это TEdit и его Tag = 1, то ставь ему стиль.

Добавлено через 9 минут и 5 секунд
Кстати, а не лучше использовать TStringGrid??

Автор: Dobermann 5.12.2008, 17:21
Цитата(THandle @  5.12.2008,  12:59 Найти цитируемый пост)
Кстати, а не лучше использовать TStringGrid??

Неа, я так делал, с эдитами красивее =)

Цитата(THandle @  5.12.2008,  12:59 Найти цитируемый пост)
Dobermann, присвой всем Edit'ам в которые нужно вводить только цифра Tag := 1;В OnCreate пробегайся по контролам и если это TEdit и его Tag = 1, то ставь ему стиль.

Вообще не понял...ни что - чему присваивать, ни с контролами =(

Автор: THandle 5.12.2008, 17:36
Цитата(Dobermann @  5.12.2008,  17:21 Найти цитируемый пост)
Неа, я так делал, с эдитами красивее =)


http://podgoretsky.com/OtherParts/DM/BadTips.aspx
Пункт 7.


Цитата(Dobermann @  5.12.2008,  17:21 Найти цитируемый пост)
Вообще не понял...ни что - чему присваивать, ни с контролами =( 



Всем Edit'ам присваивай Tag. Свойство у них такое. В единичку ставь. А потом бегай по ним как нить так(не лучший вариант имхо):
Код


procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ControlCount - 1 do
    if (Controls[I] is TEdit) then
      if Controls[I].Tag = 1 then
        SetWindowLong(TWinControl(Controls[I]).Handle, GWL_STYLE,
          GetWindowLong(TWinControl(Controls[I]).Handle, GWL_STYLE) or ES_NUMBER);
end;

Автор: MetalFan 5.12.2008, 18:37
а еще лучше поставь "купи" и поставь 2009 делфю, там вроде уже это св-во добавлено в VCL

Автор: Dobermann 5.12.2008, 19:11
Цитата(MetalFan @  5.12.2008,  18:37 Найти цитируемый пост)
а еще лучше поставь "купи" и поставь 2009 делфю, там вроде уже это св-во добавлено в VCL

У меня борландская 7-ая

Автор: xfoby 20.4.2009, 19:09
Christoph, не издевайся над человеком...зачем это в onEnter? ставь это в onCreate, а для зацикливания поработай с ControlIndex у родительского контрола smile

Автор: Christoph 20.4.2009, 20:19
ыч не понял smile и не помню про что тут говорили

Автор: xfoby 21.4.2009, 01:11
Хахахаха)) Christorph, я ту мессагу написал сразу после поста про изменение стиля по onEnter...долго не мог понять, что у меня с инетом - сообщение не отображалось xD
а теперь появилось...очень своевременно xD xD

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)