Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

Динамическая привязка OnConnect в КОНСОЛЬНОМ приложении   Найти похожие ветки 

 
Kacnep ©   (2006-07-25 11:29) [0]

Ругается в назначении события на ОнКоннект.

program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils,  IdBaseComponent, IdComponent, IdTCPClient, IdCmdTCPClient, IdCommandHandlers, IdContext;

var
 id_Cl:TIdCmdTCPClient;

procedure AfterConnect(AContext: TIdContext);
begin
 AContext.Connection.IOHandler.Write(ParamStr(2));
 AContext.Connection.Disconnect;
end;

begin
 id_Cl:=TIdCmdTCPClient.Create;
 id_Cl.OnConnect:=AfterConnect;  // ругается не понимает
 id_Cl.Connect(ParamStr(0),ParamStr(1));
end.


 
Сергей М. ©   (2006-07-25 11:34) [1]

AfterConnect() должна быть не регулярной процедурой, а процедурным методом любого класса.


 
Сергей М. ©   (2006-07-25 11:34) [2]

А причем тут консоль ?


 
Kacnep ©   (2006-07-25 11:37) [3]

Ну у меня как то раньше не возникало проблем с динамическим назначением... :((
А в консольном приложении что то как то призадумался...
Так как исправить ошибку? Можешь подсказать?


 
Slym ©   (2006-07-25 11:45) [4]

function Proc2Method(Code, Data: Pointer):TMethod;
begin
 result.Code:=Code;
 result.Data:=Data;
end;

procedure AfterConnect(Self,AContext: TIdContext);
begin
AContext.Connection.IOHandler.Write(ParamStr(2));
AContext.Connection.Disconnect;
end;

begin
id_Cl:=TIdCmdTCPClient.Create;
id_Cl.OnConnect:=ПриведениеТипа(Proc2Method(@AfterConnect,id_Cl));
id_Cl.Connect(ParamStr(0),ParamStr(1));
end;


 
Сергей М. ©   (2006-07-25 11:54) [5]

type
TSomeClass = (..)
  ..
   procedure AfterConnect(AContext: TIdContext);
  ..
end;

...

var
 SomeObject: TSomeClass;

..

 SomeObject := TSomeClass.Create(..);

..

id_Cl.OnConnect := SomeObject.AfterConnect;

p.s.
Давай-ка в "Начинающие", если не понимаешь разницы между регулярной процедурой и процедурным методом класса.


 
Reindeer Moss Eater ©   (2006-07-25 11:57) [6]

Бред очередной.

Зачем событие афтерконнект, если после вызова Коннект следущая строчка кода - это место, где этот самый коннект уже установлен?


 
Kacnep ©   (2006-07-25 11:58) [7]

Спасибо! Скорее всего верно!
Но я Первый раз такое динамическое присвоение вижу :((.
Я пока ждал ответа немного код поменял но теперь вместо
@AfterConnect,id_Cl --- написал селф - но опять ругается.

 with TIdCmdTCPClient.Create do begin
   OnConnect:=TNotifyEvent(Proc2Method(@AfterConnect,self));
   BoundIP:=ParamStr(0);
   BoundPort:=strtoint(ParamStr(1));
   Connect;
   Free;
 end;


Даже если не ответите код верну но все равно Спасибо! За решение ЭТОГО!


 
Reindeer Moss Eater ©   (2006-07-25 12:01) [8]

with TIdCmdTCPClient.Create do begin
  OnConnect:=TNotifyEvent(Proc2Method(@AfterConnect,self));
  BoundIP:=ParamStr(0);
  BoundPort:=strtoint(ParamStr(1));
  Connect;
  //Вот после этого камента и делай все, что хотел сделать в своем AfterConnect
  ......
  //---------------------------------------------------------------


 
Kacnep ©   (2006-07-25 12:02) [9]

Пока писал ответ на первое еще понаприходило :))
2 Ув. Сергей М. спасибо за совет.

2 Reindeer Moss Eater
Все верно - так работало! Но именно захотелось сделать дин. привязку - и с ходу не получилось :(. Вот терь более менее представляю...


 
Kacnep ©   (2006-07-25 12:03) [10]

2 Reindeer Moss Eater

OnConnect:=TNotifyEvent(Proc2Method(@AfterConnect,self)); -это не понимает :)


 
Reindeer Moss Eater ©   (2006-07-25 12:06) [11]

это не понимает :)

Все адекватное программерское сообщество не понимает зачем в консоли при использовании блокирующих сокетов понадобился АферКоннект.

Для изврата что ли?


 
Сергей М. ©   (2006-07-25 12:09) [12]


> Reindeer Moss Eater ©   (25.07.06 12:06) [11]


> зачем в консоли при использовании блокирующих сокетов понадобился
> АферКоннект.


И ты, Брут ?! (!)
Про консоль ?)
Фиолетово же ..


 
Kacnep ©   (2006-07-25 12:19) [13]

Повторюсь!
Без АфтерКонект - прога работала - ну именно захотелось сделать  с динамическим назначением - потому что не предтавлял как. - захотелось разобраться!
Завтра буду писать что нить не с сеткой связаное и опять всплывет ситуация с регулярной процедурой и процедурным методом класса.
В общем на будущее... :)

Спасибо за ответы!


 
Reindeer Moss Eater ©   (2006-07-25 12:21) [14]

Фиолетово же ..

А что делать в консоли, после того, как вызван коннект?
Вся остальная логика реализована в обработчике.
После строки с вызовом коннекта на горизонте виднеется финальный end. со всеми вытекающими.

Крутить бесконечный фиолетовый цикл?


 
Сергей М. ©   (2006-07-25 12:22) [15]


> В общем на будущее


http://www.google.ru/search?q=%D0%94%D0%B5%D0%BB%D1%84%D0%B8+%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%B8%D0%B5+%D0%BC%D0%B5%D0%B6%D0%B4%D1%83+%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D0%BE%D0%B9+%D0%B8+%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ru:official


 
Kacnep ©   (2006-07-25 12:25) [16]

:)) не ну вот вся программа

begin
 if ParamCount<3 then writeln("Usage: srvcommand.exe IP PORT command");
 with TIdCmdTCPClient.Create do begin
   Connect(ParamStr(1),strtoint(ParamStr(2)));
   IOHandler.Writeln(ParamStr(3));
   Free;
 end;
end.


Так что не  бесконечный фиолетовый сёкал...
самое главное что сервер конект принял а команду нет :(. Не получил.


 
Сергей М. ©   (2006-07-25 12:26) [17]


> что делать в консоли, после того, как вызван коннект?


Тоже самое что и не в консоли.


> Крутить бесконечный фиолетовый цикл?


А куда нам без циклов ?)

В том или ином виде - явном ли, скрытом ли - цикл должен и будет фигурировать. Хоть в консоли, хоть в хреноли.

Иль не так ?


 
Kacnep ©   (2006-07-25 12:27) [18]

2 Сергей
Благодарю за совет


 
Slym ©   (2006-07-25 12:27) [19]

Можно и так: TNotifyEvent(Proc2Method(@AfterConnect,nil));


 
umbra ©   (2006-07-25 12:37) [20]


>    OnConnect:=TNotifyEvent(Proc2Method(@AfterConnect,self));

self уместен только внутри методов некоего класса и обозначает экземпляр класса, в котором этот метод вызывается. Если его использовать не в методе, а впроцедуре, то он указывает в никуда.


 
Kacnep ©   (2006-07-25 12:38) [21]

2 umbra
Спасибо понял.
Но все равно не работает.
Буду разбираться...


 
Плохиш ©   (2006-07-25 13:13) [22]

procedure AfterConnect(Sender: TObject; Socket: TCustomWinSocket) of object;


 
Slym ©   (2006-07-25 13:36) [23]

Kacnep ©   (25.07.06 12:38) [21]
Но все равно не работает.

В проседуру явно добавь параметр Self! в него попадет параметр DATA переданный в Proc2Method
procedure AfterConnect(Self,AContext: TIdContext);
При таком подходе: Proc2Method(@AfterConnect,DATA), при вызове AfterConnect первым параметром будет именно DATA, а уж апосле все остальные



Страницы: 1 вся ветка

Текущий архив: 2006.12.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.029 c
15-1164344912
Rentgen
2006-11-24 08:08
2006.12.17
Фильмы с грустными "концами"


2-1164719388
Sergey_b
2006-11-28 16:09
2006.12.17
Трей


15-1164573191
WondeRu
2006-11-26 23:33
2006.12.17
Вопросы в "Потрепаться" за январь 2005


15-1164370103
psa247
2006-11-24 15:08
2006.12.17
Отображение кириллицы в DOS


2-1164625210
Krants
2006-11-27 14:00
2006.12.17
Назначить событие всем компонентам