

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Серверное приложение |
|
Для большей наглядности процесса обмена данными создадим приложение синтерфейсом MDI. Задумка такова: при обслуживании заявки от очередного сокета-клиента мы создаем новое дочернее окно и выводим в нем получаемые от клиента данные. Как всегда начнем с главной формы проекта. Измените ее имя на Name: =frm-Main и укажите, что это главное окно проекта MDI (FormStyle := fsMDIForm). Разместите на главной форме два компонента: сокет-сервер TTCPServer (ком- понент находится на странице Internet палитры компонентов) и строку состояния TStatusBar, из которой пользователь сможет узнать адрес сервера. Вызовите редактор панелей строки (например, дважды щелкнув по элементу управления StatusBar1) и создайте три панели. Теперь обратитесь к событию OnCreate() главной формы и внесите в него следующий код: procedure TfrmMain.FormCreate(Sender: TObject); begin with TcpServer1 do begin BlockMode:=bmThreadBlocking; LocalPort: = '70000'; Open; StatusBar1.Panels[0].Text:='Хост: '+LocalHostName; StatusBar1.Panels[1].Text:='Порт: '+LocalPort; StatusBar1. Panels^.Text^'IP-адрес : '+LocalHostAddr; end; end; В момент создания главной формы приложения инициируется номер порта и назначается режим блокировки. Обратите внимание, что мы явным образом не присваиваем значение свойству LocalHost; в этом случае в качестве имени хоста будет назначено сетевое имя компьютера. К главной форме мы еще вернемся, а пока создадим новую дочернюю MDI-форму: Name:=frmChild и стиль FormStyle := fsMDIChild. Исключите дочернюю форму из списка автоматически создаваемых (пункт меню Project -— Options, вкладка Forms). Перенесите на форму компонент TMemo, в котором будет протоколироваться процесс обмена данными с клиентом. Перейдите в редактор кода дочерней формы и в секции public объявите поле Th read : TThread, где будет храниться ссылка на связанный с дочерней формой поток обслуживания. Эта ссылка нужна для того, чтобы избежать случайного закрытия формы пользователем до разрыва соединения. Перед вами полный листинг дочерней формы: unit ChildUnit; interface uses Windows, SysUtils, Variants, Classes, Controls, Forms, StdCtrls; type TfrmChild = class(TForm) Memo1: TMemo; procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } Thread : TThread; end; implementation {$R *.dfm} procedure TfrmChild.FormClose(Sender: TObject; var Action: TCloseAction); begin if NOT Assigned(Thread) then Action:=caFree else Action:=caNone; end; end. |
