Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Использование невизуальных компонентов без формы   Найти похожие ветки 

 
Дмитрий_05   (2005-11-20 21:09) [0]

У меня программа без формы, я бы в ней хотел использовать невизуальный компонент TcpServer, возможно ли это? Делаю я так:


var
TcpServer1: TTcpServer;

TcpServer1 := TTcpServer.Create(...);


а вот что в скобочках написать не знаю, пишу "Application", ругается, на "Self" тоже ругается... а как еще обрабатывать события этого компонента в таком случае?


 
Sergey Masloff   (2005-11-20 21:18) [1]

nil напиши.
Только не забудь потом сам замочить свой объект.
А вообще достали - этот вопрос на всех форумах раз в 10 дней точно задается.
 И если тебе приходит в голову мысль писать там Self или тем более Application то советую уделить пару месяцев прочтению хоть какой-нибудь нормальной книжки.


 
palva ©   (2005-11-20 21:39) [2]

А сообщения от сервера кто будет обрабатывать? Для того здесь и нужна форма, чтобы следить за возникающими в сервере событиями. Либо надо писать какой-то свой объект, имеющий бесконечный цикл обработки сообщений. Вот имя этого объекта и надо подставлять в конструктор. А будет ли все это работать, если ваш объект не порожден от TForm? А можно ли создать такой объект, если отсутствует Application - большой вопрос. А просто создать объект Server, наверно, не трудно.


 
Дмитрий_05   (2005-11-20 21:46) [3]

спасибо за совет, обязательно почитаю... но еще один маленький вопросик...
пишу:


var
TcpServer1: TTcpServer;

procedure TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
begin
...
end;

procedure ...
begin
TcpServer1 := TTcpServer.Create(nil);
TcpServer1.OnAccept := TcpServer1Accept(....); // что здесь в скобках написать?
end;


что там в скобках написать? помоги пожалуйста


 
Джо ©   (2005-11-20 21:55) [4]


> // что здесь в скобках написать?

А что в Справке рекоммендуют?


 
Дмитрий_05   (2005-11-20 21:59) [5]

"Sender: TObject; ClientSocket: TCustomIpClient" в скобках, но опядь же, на Sender ругается, а "ClientSocket: TCustomIpClient" как с ним быть? просто такую переменную в "var" объявить?


 
Джо ©   (2005-11-20 22:06) [6]


> [5] Дмитрий_05   (20.11.05 21:59)

Ох, тяжело вам будет, не издеваюсь - констатирую. Все же нужно книгу почитать, что ли.
В данном случае требуется присвоить свойству обработчик события. Обработчик должен быть методом объекта с соответствующим списком параметров. Т.е, нужно описать класс, одним из методов которого будет
TMyClass = class
private
 procedure OnAcceptEvent (Sender: TObject; ClientSocket: TCustomIpClient);
end;
...
procedure TMyClass.OnAcceptEvent (Sender: TObject; ClientSocket: TCustomIpClient);
begin
 ////
end;

И присваивать свойству ссылку на метод объекта этого класса.


 
palva ©   (2005-11-20 22:09) [7]

> что там в скобках написать? помоги пожалуйста
Здесь вообще скобки не нужны - это ведь имя обработчика, т. е. просто имя метода (процедуры) объекта Form, либо того объекта, который стоит в свойстве Owner сервера и попадает туда из параметра конструктора при создании. То есть если вы создадите сервер с Nil то получите исключение при соответствующем событии.

Хотя, может я неправ, я не знаю, что такое  TTcpServer. У меня в D7 штатно стоит TIdTCPServer


 
Джо ©   (2005-11-20 22:10) [8]

Создаем объект обработчик, допустим в секции initialization модуля, в секции finalization его уничтожаем:
var
 MyClass: TMyClass;
initialization
 MyClass := TMyClass.Create;
finalization
 MyClass.Free;

//
// Когда объект создан, мы можем назначать обработчики событий:
//
TcpServer1 := TTcpServer.Create(nil);
TcpServer1.OnAccept := MyClass.OnAcceptEvent;

В таком акцепте.


 
palva ©   (2005-11-20 22:12) [9]

palva ©   (20.11.05 22:09) [7]
Был неправ, не имя, конечно. Читайте лучше Джо ©   (20.11.05 22:06) [6]


 
Дмитрий_05   (2005-11-20 22:14) [10]

спасибо большое, вроде понятно стало... Джо, а в TcpServer1 := TTcpServer.Create(nil); в скобочках может тогда MyClass написать, или всетаки nil?


 
Джо ©   (2005-11-20 22:24) [11]


>  [10] Дмитрий_05   (20.11.05 22:14)

В данном случае, я думаю, без разницы. Так как MyClass (в том виде, как я его описал) все-равно НЕ будет уничтожать объект, которым владеет. Это нужно будет делать руками. А может быть, компилятор этого даже не пропустит. Какой там класс указан в .Create?


 
Дмитрий_05   (2005-11-20 22:29) [12]

AOwner: TComponent


 
Sergey Masloff   (2005-11-20 22:29) [13]

Джо ©   (20.11.05 22:24) [11]
>В данном случае, я думаю, без разницы.
Если класс НЕ потомок TComponent то разница есть, да еще какая. Не скомпилируется даже в одном из случаев ;-)))


 
Дмитрий_05   (2005-11-20 22:30) [14]

а уничтожать я буду так: TcpServer1.Free правильно?


 
Sergey Masloff   (2005-11-20 22:33) [15]

Дмитрий_05   (20.11.05 22:30) [14]
Нет


 
Дмитрий_05   (2005-11-20 22:34) [16]

а как тогда? FreeAndNill(TcpServer1) ?


 
Дмитрий_05   (2005-11-20 22:44) [17]

ой, мне же Джо написал как... сори...


 
Джо ©   (2005-11-20 22:47) [18]


> [13] Sergey Masloff   (20.11.05 22:29)

Да, это я сам в словесах уже запутался... дома тут ералаш творится, пишу урывками :(


 
Джо ©   (2005-11-20 22:48) [19]


> [14] Дмитрий_05   (20.11.05 22:30)
> а уничтожать я буду так: TcpServer1.Free правильно?

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


 
Дмитрий_05   (2005-11-20 22:53) [20]

кстати по поводу уничтожения классов, в чем разница между   ....Free и FreeAndNill(...) ?


 
Sergey Masloff   (2005-11-20 22:55) [21]

Джо ©   (20.11.05 22:48) [19]
>> а уничтожать я буду так: TcpServer1.Free правильно?
>Экземпляр объекта именно так и уничтожается, да.
А теперь уже я через букву читаю. TcpServer.Free() прочел. Думаю фигасе деструктор класса чтоли вызывать хочет ;-) Если с единичной на конце то правильно.


 
Джо ©   (2005-11-20 23:09) [22]


>  [20] Дмитрий_05   (20.11.05 22:53)
> кстати по поводу уничтожения классов, в чем разница между
>   ....Free и FreeAndNill(...) ?



var
 Obj: TSomeClass;
begin
 Obj := TSomeClass.Create;
 Obj.Free;
 if Obj <> nil then
   ShowMessage ("В переменной осталась ссылка на уже уничтоженный объект");

 // или так:
 Obj := TSomeClass.Create;
 FreeAndNill(Obj);
 if Obj <> nil then
   ShowMessage ("В переменной осталась ссылка на уже уничтоженный
end;


 
Джо ©   (2005-11-20 23:10) [23]


> [20] Дмитрий_05   (20.11.05 22:53)
> кстати по поводу уничтожения классов,

Это НЕ КЛАСС уничтожается. Класс уничтожить невозможно. Уничтожается конкретрный экземпляр объекта какого-то класса.


 
Sergey Masloff   (2005-11-20 23:15) [24]

Джо ©   (20.11.05 23:09) [22]

procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;


FreeAndNill(Obj);
if Obj <> nil then ===> Эта проверка не имеет смысла. NIL там будет всегда несмотря на возможные ошибки при попытке уничтожения.


 
Джо ©   (2005-11-20 23:16) [25]


> [22] Джо ©   (20.11.05 23:09)

В общем, если еще понятнее: вызов FreeAndNil приводит к
 Obj.Free;
 Obj := nil;


 
Джо ©   (2005-11-20 23:19) [26]


>  [24] Sergey Masloff   (20.11.05 23:15)

Это-то понятно. Это я чтобы ясно было, что в первом варианте в переменной ссылка сохраняется после уничтожения объекта, а во втором варианте ссылка также обнуляется.



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.046 c
6-1117730133
Дмитрий_05
2005-06-02 20:35
2005.12.18
Свой браузер-чат


14-1133014623
Pavel__
2005-11-26 17:17
2005.12.18
Уход за жд


6-1122536583
Курдль
2005-07-28 11:43
2005.12.18
Client/ServerSockets. Как найти все сокеты, активные в сети?


2-1133635834
tigrenok
2005-12-03 21:50
2005.12.18
Проблема с названиями компонентов(возникла снова)


14-1132755922
msguns
2005-11-23 17:25
2005.12.18
Как сделать Soft-beholder ?