Текущий архив: 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.5 MB
Время: 0.047 c