Текущий архив: 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.51 MB
Время: 0.014 c