|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблема с OnDataAvailable компонетнта TIdTelnet
Доброго времени суток.
Ситуация следующая нужен простой телнет клиент в задачи которого входит залогониться на устройство, выполнить там набор команд и отключиться от него при этом происходящее надо выводить на экран. Код:
Telnet: TIdTelnet; Data: TMemo; SndTxt: TEdit; Обработка OnDataAvailable выглядит так: Код:
procedure TForm1.TelnetDataAvailable(Sender: TIdTelnet; const Buffer: String); begin Data.Lines.Add(Buffer); end; Проблема такая если символы на устройство отправлять так: Код:
Procedure TForm1.SndTxtKeyPress(Sender: TObject; var Key: Char); var i: integer; Begin Telnet.SendCh(key); End; А если так: Код:
if key=#13 then Begin s:=SndTxt.Text; for i :=1 to length(SndTxt.Text) do begin Telnet.SendCh(s[i]); end; Telnet.SendCh(#13); sndtxt.Clear; end; End; Кто-нибудь может мне сказать что я делаю не так? И как нужно? |
#2
|
||||
|
||||
Добавть в тело цикла Application.ProcessMessages, мыслится что не обрабатывается ответ.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
||||
|
||||
А у вас случаем не D2009 стоит?
Вы проверяли, что лежит в s[i] перед отправкой? Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
Цитата:
И почему тогда первый вариант работает нормально? Цитата:
|
#6
|
||||
|
||||
Цитата:
Код:
if key=#13 then Begin s:=SndTxt.Text; for i :=1 to length(SndTxt.Text) do begin Telnet.SendCh(s[i]); Application.ProcessMessages; end; Telnet.SendCh(#13); sndtxt.Clear; end; End; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
|||
|
|||
Помотрел снифером что происходит при работе программы. С виду все ОК, вижу данные которые уходят на устройство и приходят с него, все команды работают нормально. Складывается ощущение что OnDataAvailable срабатывает только один раз... может его надо как-то вызывать после отправления данных на устройство?
|
#8
|
||||
|
||||
Возникла такая мысль, а что если неработает потому-что вы не переменную типа char туда посылаете, а ссылку на элемент массива типа char. Что если сделать локальную переменную и ее пытаться заслать:
Код:
Var Ch: char; ... if key=#13 then Begin s:=SndTxt.Text; for i :=1 to length(SndTxt.Text) do begin Ch := s[i]; Telnet.SendCh(Ch); Application.ProcessMessages; end; Telnet.SendCh(#13); sndtxt.Clear; end; End; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
|||
|
|||
Пробовал... то же самое...
|
#10
|
||||
|
||||
Еще такой вариант, может слишком быстро идет запись в Telnet?
Попробуйте после каждого посланого символа делать паузу: Код:
if key=#13 then Begin s:=SndTxt.Text; for i :=1 to length(SndTxt.Text) do begin Telnet.SendCh(s[i]); Sleep(100); end; Telnet.SendCh(#13); sndtxt.Clear; end; End; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#11
|
|||
|
|||
Цитата:
|