![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Как можно реализовать использование компонента ScktComp напрямую без формы?
Попробовал сделать так: Код:
... var ServerSocket : tServerSocket; ... procedure MyButtonEventClick( mButton : Integer; Sender, Parent : CGUIElement ); var i : Integer; Begin ServerSocket.Port:=StrToInt('777'); ServerSocket.Active:=True; End; |
#2
|
||||
|
||||
![]() Код:
var ServerSocket: TServerSocket; begin ServerSocket:=TServerSocket.Create(nil); ServerSocket.Port:=777; // .. end; Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() Ой спасибо огромное
![]() |
#4
|
|||
|
|||
![]() Эээ а че связи нет?
Код:
... procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); var i : Integer; begin i := GameEngine.AddNew; GameEngine.PlayerID := i; GameEngine.List[ i ] := TPlayer.Create; GameEngine.List[ i ].ID := i; end; procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); var i : Integer; begin i := GameEngine.AddNew; GameEngine.PlayerID := i; GameEngine.List[ i ] := TPlayer.Create; GameEngine.List[ i ].ID := i; end; procedure MyButtonEventClick( mButton : Integer; Sender, Parent : CGUIElement ); var i : Integer; Begin if id4cl=0 then begin ServerSocket.Port:=strtoint(( GUI.List[ id2 ] as CGUIedit ).Caption); ServerSocket.Active:=True; ( GUI.List[ id2 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id5 ] as CGUIButton ).Enabled:=false; ( GUI.List[ id4 ] as CGUIButton ).Caption:=('Остановить'); id4cl:=1; end else begin ServerSocket.Active:=False; ( GUI.List[ id2 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id5 ] as CGUIButton ).Enabled:=true; ( GUI.List[ id4 ] as CGUIButton ).Caption:=('Создать'); id4cl:=0; end; End; procedure MyButtonEvent1Click( mButton : Integer; Sender, Parent : CGUIElement ); Begin if id5cl=0 then begin ( GUI.List[ id2 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id4 ] as CGUIButton ).Enabled:=false; ClientSocket.Port:=strtoint(( GUI.List[ id2 ] as CGUIedit ).Caption); ClientSocket.Host:=( GUI.List[ id3 ] as CGUIedit ).Caption; ClientSocket.Address:=( GUI.List[ id3 ] as CGUIedit ).Caption; ClientSocket.Active:=True; ( GUI.List[ id5 ] as CGUIButton ).Caption:=('Отключится'); id5cl:=1; end else begin ClientSocket.Active:=False; ( GUI.List[ id2 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id4 ] as CGUIButton ).Enabled:=true; ( GUI.List[ id5 ] as CGUIButton ).Caption:=('Подключится'); id5cl:=0; end; End; ... ServerSocket:=TServerSocket.Create(nil); ClientSocket:=TClientSocket.Create(nil); ... |
#5
|
||||
|
||||
![]() потому что по умолчанию у TServerSocket свойство ServerType == stNonBlocking и используется событийная модель, т.е. как минимум желательно обрабатывать события OnClientConnect и OnClientRead. почти то же и у TClientSocket: ClientType == ctNonBlocking, OnRead. в файле справки про это написано.
Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 07.04.2011 в 16:49. |
#6
|
|||
|
|||
![]() Я понял проблему нету вызова процедуры ServerSocketClientConnect как это можно сделать?
|
#7
|
|||
|
|||
![]() Указав компоненту соотв. обработчик.
|
#8
|
|||
|
|||
![]() наверное как-то так:
Код:
ServerSocket.OnClientConnect = ServerSocketClientConnect; взялся из неоткуда, ничего не прошу, помогаю просто так ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя ![]() |
#9
|
||||
|
||||
![]() property OnClientConnect: TSocketNotifyEvent;
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object; объект нужно создавать!!! Код:
type TServerSocketEvent = class procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); end; var FServerSocket: TServerSocket; FServerSocketEvent: TServerSocketEvent; procedure TServerSocketEvent.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin // собственно сам обработчик end; begin FServerSocket:=TServerSocket.Create(nil); FServerSocketEvent:=TServerSocketEvent.Create; FServerSocket.OnClientConnect:=FServerSocketEvent.OnClientConnect; // FServerSocketEvent.Free; // не забыть в конце сделать end. Пишу программы за еду. __________________ |
#10
|
|||
|
|||
![]() К сожалению это всё уже пробовал но не работает может я что не так делаю вот весь код от и до:
Код:
program Invaders; uses OMEGA in 'headers\Delphi\OMEGA.pas', uSpriteEngine in 'units\Delphi\uSpriteEngine.pas', Player in 'Player.pas', Monster1 in 'Monster1.pas', Bullet in 'Bullet.pas', Boom in 'Boom.pas', GEngine in 'GEngine.pas', Res in 'Res.pas', uGUIEngine, Bullet2 in 'Bullet2.pas', Lan in 'Lan.pas', WinSock, Windows, Messages, unit1, moster1_bullet in 'moster1_bullet.pas', bullet3 in 'bullet3.pas', bullet4 in 'bullet4.pas', scktcomp, SysUtils, forms, Classes, Dialogs; type TServerSocketEvent = class procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); end; var Process : POTimer; Proc : POTimer; full_scr : integer; id3,id4,id5 : integer; id4cl : integer; id5cl : integer; ServerSocket: TServerSocket; ClientSocket: TClientSocket; FServerSocket: TServerSocket; FServerSocketEvent: TServerSocketEvent; procedure TServerSocketEvent.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); var i:integer; begin // собственно сам обработчик i := GameEngine.AddNew; GameEngine.PlayerID := i; GameEngine.List[ i ] := TPlayer.Create; GameEngine.List[ i ].ID := i; end; procedure SetFullScreen( Checked : Boolean; Sender, Parent : CGUIElement ); Begin OE_ChangeScreenOptions( 1024, 768, 32, 0, Checked, FALSE ); End; procedure MyButtonEventClick( mButton : Integer; Sender, Parent : CGUIElement ); var i : Integer; Begin if id4cl=0 then begin FServerSocket:=TServerSocket.Create(nil); FServerSocketEvent:=TServerSocketEvent.Create; FServerSocket.OnClientConnect:=FServerSocketEvent.OnClientConnect; FServerSocket.ServerType:=stNonBlocking; FServerSocket.Port:=strtoint(( GUI.List[ id2 ] as CGUIedit ).Caption); FServerSocket.Active:=True; ( GUI.List[ id2 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id5 ] as CGUIButton ).Enabled:=false; ( GUI.List[ id4 ] as CGUIButton ).Caption:=('Остановить'); id4cl:=1; end else begin FServerSocket.Active:=False; FServerSocketEvent.Free; ( GUI.List[ id2 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id5 ] as CGUIButton ).Enabled:=true; ( GUI.List[ id4 ] as CGUIButton ).Caption:=('Создать'); id4cl:=0; end; End; procedure MyButtonEvent1Click( mButton : Integer; Sender, Parent : CGUIElement ); Begin if id5cl=0 then begin ( GUI.List[ id2 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=false; ( GUI.List[ id4 ] as CGUIButton ).Enabled:=false; ClientSocket:=TClientSocket.Create(nil); ClientSocket.ClientType:=ctNonBlocking; ClientSocket.Port:=strtoint(( GUI.List[ id2 ] as CGUIedit ).Caption); ClientSocket.Host:=( GUI.List[ id3 ] as CGUIedit ).Caption; ClientSocket.Address:=( GUI.List[ id3 ] as CGUIedit ).Caption; ClientSocket.Active:=True; ( GUI.List[ id5 ] as CGUIButton ).Caption:=('Отключится'); id5cl:=1; end else begin ClientSocket.Active:=False; ( GUI.List[ id2 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id3 ] as CGUIedit ).Enabled:=true; ( GUI.List[ id4 ] as CGUIButton ).Enabled:=true; ( GUI.List[ id5 ] as CGUIButton ).Caption:=('Подключится'); id5cl:=0; end; End; procedure MyButtonEvent2Click( mButton : Integer; Sender, Parent : CGUIElement ); Begin if full_scr=0 then begin OE_ChangeScreenOptions( 1024, 768, 32, 0, true, FALSE ); ( GUI.List[ id ] as CGUIButton ).Caption := 'В окне'; full_scr:=1; End else begin OE_ChangeScreenOptions( 1024, 768, 32, 0, false, FALSE ); ( GUI.List[ id ] as CGUIButton ).Caption := 'На весь экран'; full_scr:=0; end; end; procedure MyButtonEvent3Click( mButton : Integer; Sender, Parent : CGUIElement ); Begin OE_Quit; End; procedure Init; var i : Integer; Begin // Загружаем все ресурсы res_Load; Mouse.Texture := tex_Mouse; LastEnemyAdd := U_GetTime; id3:=GUI.AddElement( CreateEdit( nil, nil, MyFont, 1, 500, 148, 20, '127.0.0.1') ); id2:=GUI.AddElement( CreateEdit( nil, nil, MyFont, 1, 530, 148, 20, '777' ) ); id4:=GUI.AddElement( CreateButton( nil, nil, MyFont, 'Создать', 1, 600, 148, 20, @MyButtonEventClick ) ); id5:=GUI.AddElement( CreateButton( nil, nil, MyFont, 'Подключится', 1, 630, 148, 20, @MyButtonEvent1Click ) ); id:=GUI.AddElement( CreateButton( nil, nil, MyFont, 'На весь экран', 1, 660, 148, 20, @MyButtonEvent2Click ) ); GUI.AddElement( CreateButton( nil, nil, MyFont, 'Выход', 1, 690, 148, 20, @MyButtonEvent3Click ) ); id1:=GUI.AddElement( CreateProgressBar( nil, nil, Font, 1, 30, 148, 10 ) ); // Инициализируем движок игры GameEngine := TGameEngine.Create; GameEngine.InvertSort := TRUE; i := GameEngine.AddNew; GameEngine.PlayerID := i; GameEngine.List[ i ] := TPlayer.Create; GameEngine.List[ i ].ID := i; End; procedure Draw; Begin SSprite_Draw( tex_BackGround, 150, 0, 1920, 1080 ); SSprite_Draw( tex_Left, 0, 0, 150, 768 ); // Рисуем инфу {Text_Draw( Font, 1, 40, PChar( 'Жизнь: ' + Chr( 13 ) + U_IntToStr( ( GameEngine.List[ 0 ] as TPlayer ).Life ) + '%' ), 1, 1, 255, $00FF00 ); Text_Draw( Font, 1, 110, PChar( 'Опыт: ' + Chr( 13 ) + U_IntToStr( ( GameEngine.List[ 0 ] as TPlayer ).Score ) +PChar( '/' + U_IntToStr( ( GameEngine.List[ 0 ] as TPlayer ).ul ) )), 1, 1, 255, $FF0000 ); Text_Draw( Font, 1, 180, PChar( 'Энергия: ' + Chr( 13 ) + U_IntToStr( ( GameEngine.List[ 0 ] as TPlayer ).inergy )+PChar( '/' + U_IntToStr( ( GameEngine.List[ 0 ] as TPlayer ).uing ) )), 1, 1, 255, $555555 ); Text_Draw( Font, 1, 250, PChar( 'Уровень: ' + Chr( 13 ) + U_IntToStr( ( GameEngine.List[ 0 ] as TPlayer ).lvl ) ), 1, 1, 255, $990099 );} Text_Draw( Font, 1, 0, PChar( 'FPS: ' + U_IntToStr( OE_GetFPS ) ) ); if GameEngine.GameOver Then Text_Draw( Font, 500, 400, PChar( 'Вы проиграли!' + Chr( 13 ) ), 1, 1, 255, $0000FF ); GameEngine.Draw; // Рисуем весь GUI GUI.Draw; End; procedure GameTimer; Begin GameEngine.Process; gui.Process; ( GUI.List[ id1 ] as CGUIProgressBar ).Max := 400; ( GUI.List[ id1 ] as CGUIProgressBar ).Progress := OE_GetFPS; if ( GUI.List[ id1 ] as CGUIProgressBar ).Progress > 290 then ( GUI.List[ id1 ] as CGUIProgressBar ).Color := 500; if (( GUI.List[ id1 ] as CGUIProgressBar ).Progress < 290) and (( GUI.List[ id1 ] as CGUIProgressBar ).Progress > 240) then ( GUI.List[ id1 ] as CGUIProgressBar ).Color := $00FFFF; if (( GUI.List[ id1 ] as CGUIProgressBar ).Progress < 240) and (( GUI.List[ id1 ] as CGUIProgressBar ).Progress > 0) then ( GUI.List[ id1 ] as CGUIProgressBar ).Color := $00FF00; if Key_Down( K_ESCAPE ) Then OE_Quit; // соберем данные для отправки { Buf[0]:=ShapeCBox.ItemIndex; Buf[1]:=ColorCBox.ItemIndex; Buf[2]:=StrToInt(Value1Edit.Text); Buf[3]:=StrToInt(Value2Edit.Text);} End; procedure GameTimer1; Begin if (GameEngine.List[ GameEngine.PlayerID ] as TPlayer ).inergy<(GameEngine.List[ GameEngine.PlayerID ] as TPlayer ).uing then (GameEngine.List[ GameEngine.PlayerID ] as TPlayer ).inergy:=(GameEngine.List[ GameEngine.PlayerID ] as TPlayer ).inergy+1; End; { TServerSocket1 } begin LoadOMEGA( 'bin DX8\rus\OMEGA.dll' ); Randomize; Process := Timer_Create( @GameTimer, 16 ); Proc := Timer_Create( @GameTimer1, 560 ); //Установка параметров экрана OE_SetScreenOptions( 1024, 768, 32, 0, false, false ); //Регистрация процедур OE_RegProcedure( SYS_INIT, @Init ); OE_RegProcedure( SYS_DRAW, @Draw ); // Выключаем очистку буфера цвета для оптимизации OE_Disable( FLAG_CLEAR_COLOR_BUFFER ); // Выключаем отрезку невидных обьектов, потому как все в пределах одного экрана OE_Disable( FLAG_CROP_UNVISIBLE_OBJ ); OE_SetAdvancedOptions( TRUE ); //Включить движковый лог OE_Init; // Запуск движка end. |
#11
|
||||
|
||||
![]() простой пример, очень грубый, ресурсы не освобождает:
Код:
program Project1; {$APPTYPE CONSOLE} uses ScktComp, Windows, Messages; var AMsg: TMsg; type TServerSocketEvent = class procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket); end; var FServerSocket: TServerSocket; FServerSocketEvent: TServerSocketEvent; procedure TServerSocketEvent.OnClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Writeln(Socket.ReceiveText); end; begin FServerSocket:=TServerSocket.Create(nil); FServerSocketEvent:=TServerSocketEvent.Create; FServerSocket.OnClientRead:=FServerSocketEvent.OnClientRead; FServerSocket.Port:=80; FServerSocket.Open; while GetMessage(AMsg, 0, 0, 0) do begin TranslateMessage(AMsg); DispatchMessage(AMsg); end; end. -enjoy Пишу программы за еду. __________________ |
#12
|
|||
|
|||
![]() Гениально!!! TranslateMessage(AMsg);
DispatchMessage(AMsg); Эти строки всё делают всё заработало БОЛЬШАЯ СПАСИБОЧКА!!! ![]() ![]() |
#13
|
|||
|
|||
![]() Извиняюсь но когда делаю так
Код:
while GetMessage(AMsg, 0, 0, 0) do begin TranslateMessage(AMsg); DispatchMessage(AMsg); end; То всё остальное не запускается, а когда так Код:
if GetMessage(AMsg, 0, 0, 0) then begin TranslateMessage(AMsg); DispatchMessage(AMsg); end; То виснет чо делать??? даже так виснит Код:
PeekMessage(AMsg, 0, 0, 0, PM_REMOVE); TranslateMessage(AMsg); DispatchMessage(AMsg); Я с горя даже на WinSock хочу перейти только не знаю как на нем писать мне бы подробный туториальчик с примерами... Последний раз редактировалось KOTIUM, 09.04.2011 в 00:28. |