Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.05.2009, 18:51
Renorquortek Renorquortek вне форума
Прохожий
 
Регистрация: 20.05.2009
Сообщения: 5
Репутация: 10
Печаль Проблема с 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  
Старый 20.05.2009, 19:02
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Добавть в тело цикла Application.ProcessMessages, мыслится что не обрабатывается ответ.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 20.05.2009, 19:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А у вас случаем не D2009 стоит?
Вы проверяли, что лежит в s[i] перед отправкой?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 20.05.2009, 19:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Добавть в тело цикла Application.ProcessMessages, мыслится что не обрабатывается ответ.
Но в финале-то он должен все равно мемо заполненым иметь, а тут что-то другое.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 20.05.2009, 20:27
Renorquortek Renorquortek вне форума
Прохожий
 
Регистрация: 20.05.2009
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Добавть в тело цикла Application.ProcessMessages, мыслится что не обрабатывается ответ.
Попробую это сделать завтра, т.к. исходники на работе. А в какое место цикла это надо добавить?
И почему тогда первый вариант работает нормально?
Цитата:
А у вас случаем не D2009 стоит?
Вы проверяли, что лежит в s[i] перед отправкой?
Использую Delphi 7. Добавлял в цикл перед отправкой showmessage(s[i]), честно посимвольно выводится строка введенная в SndTxt.
Ответить с цитированием
  #6  
Старый 20.05.2009, 20:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
А в какое место цикла это надо добавить?
Добавить надо так:
Код:
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  
Старый 21.05.2009, 11:32
Renorquortek Renorquortek вне форума
Прохожий
 
Регистрация: 20.05.2009
Сообщения: 5
Репутация: 10
По умолчанию

Помотрел снифером что происходит при работе программы. С виду все ОК, вижу данные которые уходят на устройство и приходят с него, все команды работают нормально. Складывается ощущение что OnDataAvailable срабатывает только один раз... может его надо как-то вызывать после отправления данных на устройство?
Ответить с цитированием
  #8  
Старый 21.05.2009, 12:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Возникла такая мысль, а что если неработает потому-что вы не переменную типа 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  
Старый 21.05.2009, 12:17
Renorquortek Renorquortek вне форума
Прохожий
 
Регистрация: 20.05.2009
Сообщения: 5
Репутация: 10
По умолчанию

Пробовал... то же самое...
Ответить с цитированием
  #10  
Старый 21.05.2009, 19:20
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Еще такой вариант, может слишком быстро идет запись в 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  
Старый 23.05.2009, 11:18
Renorquortek Renorquortek вне форума
Прохожий
 
Регистрация: 20.05.2009
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Еще такой вариант, может слишком быстро идет запись в Telnet?
Да, была такая мысль... Но не помогает. И снифир показывает что данные от устройства идут, они просто не отображаются...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter