![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как присвоить новій обработчик события
KyRo © (2006-05-04 14:06:00)Подскажите.
Я объявляю переменную
Server:TServerSocket;
после чего в коде создаю этот компонент
Server:=TServerSocket.Create(nil);
Server.Port:=9990;
Server.Active:=True;
И я хочу что бы при возникновении события оно происходило в моей процедуре , а не в стандартной .
Я делал так
Server.Socket.OnClientRead:=Connect
Но на в таком случае оно выдает ошибку .
Как можно еще это сделать или обязательно надо создавать потомка ?
KyRo (2006-05-06 14:15:00) [1]
> Сергей М.
Да не в событии принимает значения.
Спосибо вроде немного в принципах разобрался .
Хотя скорее всего вопросы у меняеще будут.
KyRo (2006-05-06 14:09:00) [2]
> > клиент тоже в блокирующем режиме работает
>
>
> Раз в блокирующем, значит вызов receive-метода можно разместить
> в любом месте в любое время после того как клиент установил
> соединение.
Не знаю значит наверно не везде
Я так создаю клиента
Client:=TClientSocket.Create(nil);
Client.Port:=9990;
Client.HOST:='localhost';
Client.OnRead:=ClientRead;
Client.OnWrite:=ClientWrite;
Client.ClientType:=ctBlocking;
Client.Active:=True;
А вот так я пітаюсь принять сообщение
Procedure TNetwork_ClientHR.ClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
s:String;
begin
s:=Socket.ReceiveText;
ShowMessage(s);
end;
И не чего не происходит. Или попробовать его вызвать не в событии а просто после создание а активизации клиента ?
Сергей М. (2006-05-06 13:17:00) [3]
> клиент тоже в блокирующем режиме работает
Раз в блокирующем, значит вызов receive-метода можно разместить в любом месте в любое время после того как клиент установил соединение.
KyRo (2006-05-06 11:58:00) [4]
> Зачем ты Execute перекрыл ?!
> Не следует этого делать.
> Для реализации собственной транспортной логики тебе предоставлен
> ClientExecute, вот его и перекрывай как тебе будет угодно.
> А Execute не трогай - там реализована спец.логика
Это исправил сервер сообщения принисает. Спасибо.
А вот так я посылаю сообщения клиенту. Еще пробовал посылать из
ClientExecute и что то не чего на клиенте не происходит.
While not Terminated do
begin
if Server.Socket.ActiveConnections>0
then
begin
for i := 0 to Server.Socket.ActiveConnections -1 do
begin
Server.Socket.Connections[i].SendText('Hello');
end;
end;
end;
KyRo (2006-05-06 11:52:00) [5]
> Сергей М. © (06.05.06 11:06) [25]
>
> > в каком тогда событии клиента получать данные от сервера
>
> > ?
>
>
> Как это в каком ?
> В OnRead !
> <Цитата>
OnRead у меня не работает !! У меня клиент тоже в блокирующем режиме работает .Я пробовал ему послать текст не чего не происходит.
Сергей М. (2006-05-06 11:06:00) [6]
> в каком тогда событии клиента получать данные от сервера
> ?
Как это в каком ?
В OnRead !
Сергей М. (2006-05-06 11:05:00) [7]
> перекрыл еще процедуру procedure Execute; и сделал ее
> override , а ClientExecute оставил обычной.
Зачем ты Execute перекрыл ?!
Не следует этого делать.
Для реализации собственной транспортной логики тебе предоставлен ClientExecute, вот его и перекрывай как тебе будет угодно. А Execute не трогай - там реализована спец.логика.
KyRo (2006-05-06 10:47:00) [8]I>
> TClientThread = class(TServerClientThread)
> private
> protected
> procedure ClientExecute; override; //!!
> public
> end;
>
> Ведь есть же пример в справке по реализации метода ClientExecute,
> почему бы не изучить его ?
Я перекрыл еще процедуру procedure Execute; и сделал ее
override , а ClientExecute оставил обычной.
Вроде как работает покрайней мере текст передает , хотя мне надо файл но это потом.
А в каком тогда событии клиента получать данные от сервера ?
Сергей М. (2006-05-06 09:40:00) [9]
> он в исходниках виртуал я его таким и создал
TClientThread = class(TServerClientThread)
private
protected
procedure ClientExecute; override; //!!
public
end;
Ведь есть же пример в справке по реализации метода ClientExecute, почему бы не изучить его ?
> там тоже не работают события Onread
В блокирующем режиме действительно не работают (за полной ненадобностью).
В неблокирующем же замечательно работают, если в потоке, выполнившем ClientSocket.Open работает цикл ожидания/выборки/диспетчеризации оконных сообщений.
> нет события
> GetThread как на сервере
Конечно нет. За полной ненадобностью.
KyRo (2006-05-05 18:26:00) [10]Все текст серверу клиент вроде передает , а как передать теперь сообщение клиенту там тоже не работают события Onread и нет события
GetThread как на сервере ?
KyRo (2006-05-05 18:19:00) [11]Я сделал вот так но что то не чего не приходит от клиента
procedure TClientThread.ClientExecute;
var
s:string;
begin
s:= ClientSocket.ReceiveText;
end;
KyRo (2006-05-05 16:59:00) [12]Ну он в исходниках виртуал я его таким и создал , если не надо то уберу.
Я не могу понять что делать дальше ?
ClientSocket.Read(1); вызывать эту процедуру ?
Сергей М. (2006-05-05 16:48:00) [13]
> создал клас
> TClientThread = class(TServerClientThread)
> private
> protected
> procedure ClientExecute; virtual;
Почему virtual?
KyRo (2006-05-05 16:44:00) [14]Все перыл , а так и не нашол не чего толкового.
Решил пробовать своими силами
И так.
Я создал клас
TClientThread = class(TServerClientThread)
private
protected
procedure ClientExecute; virtual;
public
end;
В событии я создаю экземпляр этого класса
Procedure TServerHr.GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
ClientThread:=TClientThread.Create(True,ClientSocket);
end;
А что мне делать в
procedure TClientThread.ClientExecute;
begin
end;
Как мне можно получить сообщение ?
Сергей М. (2006-05-05 14:26:00) [15]
> пошол читать справку
book.itep.ru тебе в помощь (раздел - "Winsock")
KyRo (2006-05-05 14:23:00) [16]ок пошол читать справку !
Сергей М. (2006-05-05 14:13:00) [17]
> KyRo (05.05.06 14:03) [12]
Прав.
> Я про такие и не знал !!!
Ну разумеется ... Только избранные могут прочитать всем доступную справку к методам-свойствам компонента ..
> можно по подробнее что в них надо делать
В обработчике OnGetThread() ты должен создать экз-р класса-наследника TServerClientThread, в котором ты волен перекрыть виртуальный метод ClientExecute(), в котором ты волен делать с гнездом все что угодно, вплоть до забивания им гвоздей.
KyRo (2006-05-05 14:06:00) [18]
> Где обработка события GetThread ?
> Где реализация метода ClientExecute ?
Я про такие и не знал !!!
А можно по подробнее что в них надо делать , а то в литературе что я располагаю про не чего про них не написано !!
KyRo (2006-05-05 14:03:00) [19]Когда возникает это событие как я понял меняется
Socket: TCustomWinSocket он и определяет уникальность клиента.
Или я не прав ?
Сергей М. (2006-05-05 14:03:00) [20]
> это не то ?
Это - "то"... но при условии что событие это возникает.
Но ты сказал что сервер у тебя - stThreadBlocking.
Где обработка события GetThread ?
Где реализация метода ClientExecute ?