Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическая привязка OnConnect в КОНСОЛЬНОМ приложении [D6, Win2k, WinXP]


Страницы:   1 2

Kacnep ©   (2006-07-25 11:29:00) 

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

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.


Slym   (2006-07-25 13:36:00) [1]

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

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


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

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


Kacnep   (2006-07-25 12:38:00) [3]

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


umbra   (2006-07-25 12:37:00) [4]


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

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


Slym   (2006-07-25 12:27:00) [5]

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


Kacnep   (2006-07-25 12:27:00) [6]

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


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


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


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


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


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

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

Иль не так ?


Kacnep   (2006-07-25 12:25:00) [8]

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

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:22:00) [9]


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


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


Reindeer Moss Eater   (2006-07-25 12:21:00) [10]

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

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

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


Kacnep   (2006-07-25 12:19:00) [11]

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

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


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


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


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


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


Reindeer Moss Eater   (2006-07-25 12:06:00) [13]

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

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

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


Kacnep   (2006-07-25 12:03:00) [14]

2 Reindeer Moss Eater

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


Kacnep   (2006-07-25 12:02:00) [15]

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

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


Reindeer Moss Eater   (2006-07-25 12:01:00) [16]

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


Kacnep   (2006-07-25 11:58:00) [17]

Спасибо! Скорее всего верно!
Но я Первый раз такое динамическое присвоение вижу :((.
Я пока ждал ответа немного код поменял но теперь вместо
@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 11:57:00) [18]

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

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


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

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

...

var
 SomeObject: TSomeClass;

..

 SomeObject := TSomeClass.Create(..);

..

id_Cl.OnConnect := SomeObject.AfterConnect;

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


Slym   (2006-07-25 11:45:00) [20]

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо