Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Вниз

Динамическая привязка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.04 c
15-1164326626
Бугага
2006-11-24 03:03
2006.12.17
Газзаев: "ЦСКА проиграл, а виноват «Луч-Энергия»


2-1164783034
Hero
2006-11-29 09:50
2006.12.17
Завершить процесс explorer,просто убивание процесса неподходит


15-1164439066
Shopot
2006-11-25 10:17
2006.12.17
2 операционки на 1 компе.


3-1160454278
Merry
2006-10-10 08:24
2006.12.17
QReport: использование QRExpr1.


2-1164628470
Cooller
2006-11-27 14:54
2006.12.17
Наименьший делитель





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский