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

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

Как присвоить новій обработчик события


Страницы:   1 2

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 ?


Страницы:   1 2

Наверх

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