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

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

Присвоение OnClientRead обработчика [D5, Win2k]


shadowonline ©   (2005-03-10 11:01:00) 

Проблемма такая, создаю переменную типа TServerSocket, инициализирую ее и пытаюсь присвоить свойству OnClientRead в соответствие процедуру. На что Delphi 5 говорит что Incompatible types: method pointer and regular procedure.
То же самое на форме с сокетами происходит без проблемм.
Может чего то не хватает, помогите плиззззз!
Листинг:
ServerSocket:= TServerSocket.Create(nil);
With ServerSocket Do Begin
 Port:= 4747;
 ServerType:= stThreadBlocking;
 ThreadCacheSize:= 10;
 OnClientRead:= ServerSocketClientRead;//Error
 Active:= True;
End;


Digitman   (2005-03-11 08:38:00) [1]


> Обидно, легче просто на форме сделать


можно и без формы .. благо она в дан.случае - как телеге 5-е колесо .. и кно дополнительное тоже создавать не нужно - класс TClientSocket сам создаст нужное ему окно ... от тебя лишь требуется организовать цикл ожидания/выборки/диспетчеризации вин-сообщений, тот самый с GetMessage()


shadowonline   (2005-03-11 07:42:00) [2]

Руки я себе выпрямил, заработало.
А что использует - это точно. Обидно, легче просто на форме сделать. Минимизация проги не удалась.
Спасибо всем кто откликнулся!!!!!!!


shadowonline   (2005-03-11 07:42:00) [3]

Руки я себе выпрямил, заработало.
А что использует - это точно. Обидно, легче просто на форме сделать. Минимизация проги не удалась.
Спасибо всем кто откликнулся!!!!!!!


Digitman   (2005-03-10 16:50:00) [4]


> почему то останавливается на GetMessage и чегото ждет


не "чегото", а сообщений трэду или его окнам


> За основу был взят следующий монимальный код


начерта он тебе сдался, этот код - ума не приложу ..

на чем ты решил сэкономить-то ? на якобы модуле Forms ? так ведь в Д5 этот  модуль все равно будет задействован, ибо он активно используется модулем scktcomp.pas


shadowonline   (2005-03-10 16:40:00) [5]

Мда описалось все хорошо, вот только он почемуто из сокута всеравно не читает.
Есть такая структура:

While (GetMessage(Message, Handle, 0, 0)) Do Begin
//  WaitForSingleObject(WhEvent, 1000);
 TranslateMessage(Message);
 DispatchMessage(Message);
End;

По идее закоментированная строка должна довать задержку на секунду а затем цикл должен повторятся. А он почему то останавливается на GetMessage и чегото ждет. Возможно по этому сокет и нефунциклит, хотя к нему можно приконектится и послать в него текст.

Плохо я еще понимаю как этот миниатюрный код работает или должен работать, может в нем что то криво или руки у меня еще кривые.
За основу был взят следующий монимальный код:

program Project1;

uses
 windows, messages, sysutils;

{$R *.RES}

var
Instance: HWnd;
WindowClass: TWndClass;
Handle: HWnd;
msg: TMsg;

procedure DoExit;
begin
Halt;
end;

function WindowProc (Hwn,msg,wpr,lpr: longint): longint; stdcall;
begin
result:=defwindowproc(hwn,msg,wpr,lpr);
if msg=wm_destroy then
 DoExit;

if msg=wm_KeyDown then
 if wpr=VK_ESCAPE then
  DoExit;
end;

begin
instance :=GetModuleHandle(nil);

WindowClass.style:=CS_HRedraw or CS_VRedraw;
WindowClass.Lpfnwndproc:=@windowproc;
WindowClass.Hinstance:=Instance;
WindowClass.HbrBackground:= color_btnface;
WindowClass.LpszClassName:='DX';
WindowClass.Hcursor:=LoadCursor(0,IDC_ARROW);

RegisterClass(WindowClass);

Handle:=CreateWindowEx (0,'DX','',WS_POPUP, 5,5, 200, 200,0,0,instance, nil);
ShowWindow(Handle, SW_SHOW);
UpdateWindow (Handle);

while (GetMessage(msg, 0, 0, 0)) do
 begin
  translatemessage(msg);
  dispatchmessage (msg);
 end;
end.


shadowonline   (2005-03-10 15:44:00) [6]

Спасибо за помощь, все получилось.
Просто в первые с этим столкнулся. :-)))


KSergey   (2005-03-10 13:37:00) [7]

> [2] shadowonline ©   (10.03.05 11:38)
> Ссылка почему то не работает.

Жаль, все же переколбасили оне сервер...
вот верная ссылка
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342


Digitman   (2005-03-10 13:27:00) [8]


> ShadowOnline ©   (10.03.05 12:42) [3]


разницу между регулярной процедурой(классический Паскаль) и процедурным методом класса (объектно-ориентированный Паскаль) осюсяешь ?

или что в лоб что по лбу - индифферентно ?


REA   (2005-03-10 13:00:00) [9]

Формы ни при чем, но метод должен быть членом любого класса, а не просто процедурой.

Проще наверно унаследовать от custom версии сокета или сделать надстройку над TServerSocket или просто отдельный класс с функцией обработки, что особого смысла не имеет, но проблему тоже решит.


ShadowOnline   (2005-03-10 12:42:00) [10]

Фишка в том что при создании сокета на форме и присвоение ему процедуры обработки описанной в разделе описания процедур формы, все работает.
Моя программа не содержит формы и присвоение события OnClientRead:= ServerSocketClientRead; дает ошибку.
Может процедуру нужно как то хитро описать?
Формы не подключаю чтобы exe-к был маленьким, или без формы тут не как?


shadowonline   (2005-03-10 11:38:00) [11]

Ссылка почему то не работает.
В каталоге сервера не найден запрошенный материал
/system/404.asp?404; http://www.delphikingdom.com:80/helloworld/runtime_comp.htm


KSergey   (2005-03-10 11:13:00) [12]

http://www.delphikingdom.com/helloworld/runtime_comp.htm

здесь есть ответ на этот вопрос


Наверх

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