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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.02.2012, 15:12
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию IdTelnet нужна помошь

Не судите строго я в программировании новичок самоучка.
Проблема вот такая
Через телнет соедняюсь с ххх приложением и шлю ему запросы.
Если получать ответ на запросы в обработчике событий TForm1.IdTelnet1DataAvailable то ответ приходит и нет никаких проблем
но мне получить ответ в глобальной переменной типа String
я делаю это так (пример ниже) и после вызова процедуры Send_Telnet(command); в переменной String_response пустота.
Помогите пожалуйста , уже начал головой бится об стену , отблагодарю как смогу.
PHP код:
implementation
{$R *.dfm}
//************************************************************************
procedure TForm1.IdTelnet1DataAvailable(SenderTIdTelnet; const BufferString);
begin
String_response
:= Buffer;
Status_response:= True;
//Form1.caption:=Buffer;
end;
//************************************************************************
procedure TForm1.Send_Telnet(commandstring);
var
:  LongWord;
begin
 IdTelnet1
.Host := 'localhost';
 
IdTelnet1.port := 6060;
 if 
not(idTelnet1.Connectedthen
  
try
    
IdTelnet1.Connect;      
  
except
    ShowMessage
('not connect');
  
end;
 if 
idTelnet1.Connected then
  Begin
    String_response
:='';
    
Status_response:= False;   
    
idTelnet1.WriteLn(command);  
    while  
Status_response do ; 
 
end;
end

если закоментировать в процедуре procedure TForm1.Send_Telnet(command: string); строку String_response:=''; и через Button отправлять запрос , то возврат ответа появляется только пр нажатии на кнопку второй раз

PHP код:
procedure TForm1.Button6Click(SenderTObject);
begin
Form1
.caption:='';
Send_Telnet('<request><get_camera></get_camera></request>');
Form1.caption:=String_response;
String_response:='';
end

Последний раз редактировалось Siropchik, 07.02.2012 в 15:23.
Ответить с цитированием
  #2  
Старый 07.02.2012, 15:15
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну так и объяви глобальную переменную и в IdTelnet1DataAvailable присвой ей Buffer:
Код:
var
  Form1: TForm1;
  GBuffer: String;

implementation

{$R *.dfm}

procedure TForm1.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: String); 
begin 
GBuffer:= Buffer;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 07.02.2012, 15:24
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Так у меня она обьявленна
PHP код:
var
  
Form1TForm1;
  
String_responsestring;
const
PBT_APMRESUMEAUTOMATIC = $0012;
PBT_APMSUSPEND =4;
PBT_APMRESUMESUSPEND =$0007;

implementation
{$R *.dfm
Ответить с цитированием
  #4  
Старый 07.02.2012, 15:40
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

что-то типа этого для начала:
Код:
procedure TForm1.Send_Telnet(command: string); 
var 
i :  LongWord; 
begin 
 IdTelnet1.Host := 'localhost'; 
 IdTelnet1.port := 6060; 
 if not(idTelnet1.Connected) then 
  try 
    IdTelnet1.Connect;       
  except 
    ShowMessage('not connect'); 
  end; 
 while not idTelnet1.Connected do Sleep(0);
  Begin 
    String_response:=''; 
    Status_response:= False;    
    idTelnet1.WriteLn(command);   
    while  not Status_response do Sleep(0);
 end; 
end; 
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 07.02.2012, 15:48
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

С этим кодом программа зависает
PHP код:
if idTelnet1.Connected then
  Begin 
    String_response
:=''
    
Status_response:= False;    
    
idTelnet1.WriteLn(command);   
    while 
not Status_response do Sleep(0); //зависает здесь
  
end

Последний раз редактировалось Siropchik, 07.02.2012 в 16:01.
Ответить с цитированием
  #6  
Старый 07.02.2012, 16:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

значит IdTelnet1DataAvailable не наступает и Status_response:= True; в нем не срабатывает.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 07.02.2012, 16:01
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

А почему while not Status_response , так как в этой переменной значение False то цикл должен прерватся по достижению значения TRUE а не False или я не правильно понимаю http://www.delphisources.ru/pages/fa...While.php.html

Последний раз редактировалось Siropchik, 07.02.2012 в 16:08.
Ответить с цитированием
  #8  
Старый 07.02.2012, 16:06
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну так ты же сам сбрасываешь статус перед посылкой команды, а в событии устанавливаешь. вот цикл после отправки команды и будет крутить пока статус не установиться в событии.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 07.02.2012, 16:08
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Для проверки сделал вот такой цикл, он не зависает
PHP код:
for := 0 to $ffffffff do
    
begin
      
if Status_response then  break;
      
sleep(i);
    
end
Ответить с цитированием
  #10  
Старый 07.02.2012, 16:12
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

так сделай:
Код:
while not Status_response do Application.ProcessMessages;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 07.02.2012, 16:19
Siropchik Siropchik вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 22
Репутация: 10
По умолчанию

Большое спасибо помогло!!!

Последний раз редактировалось Siropchik, 08.02.2012 в 14:43.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter