![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток.
Ситуация следующая нужен простой телнет клиент в задачи которого входит залогониться на устройство, выполнить там набор команд и отключиться от него при этом происходящее надо выводить на экран. Код:
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
|
|||
|
|||
|
Цитата:
|