![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическая привязка OnConnect в КОНСОЛЬНОМ приложении [D6, Win2k, WinXP]
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;