![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование невизуальных компонентов без формы [D7, WinXP]
Дмитрий_05 © (2005-11-20 21:09:00)У меня программа без формы, я бы в ней хотел использовать невизуальный компонент TcpServer, возможно ли это? Делаю я так:
var
TcpServer1: TTcpServer;
TcpServer1 := TTcpServer.Create(...);
а вот что в скобочках написать не знаю, пишу "Application", ругается, на "Self" тоже ругается... а как еще обрабатывать события этого компонента в таком случае?
Джо (2005-11-20 23:19:00) [1]
> [24] Sergey Masloff (20.11.05 23:15)
Это-то понятно. Это я чтобы ясно было, что в первом варианте в переменной ссылка сохраняется после уничтожения объекта, а во втором варианте ссылка также обнуляется.
Джо (2005-11-20 23:16:00) [2]
> [22] Джо © (20.11.05 23:09)
В общем, если еще понятнее: вызов FreeAndNil приводит к
Obj.Free;
Obj := nil;
Sergey Masloff (2005-11-20 23:15:00) [3]Джо © (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:10:00) [4]
> [20] Дмитрий_05 (20.11.05 22:53)
> кстати по поводу уничтожения классов,
Это НЕ КЛАСС уничтожается. Класс уничтожить невозможно. Уничтожается конкретрный экземпляр объекта какого-то класса.
Джо (2005-11-20 23:09:00) [5]
> [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;
Sergey Masloff (2005-11-20 22:55:00) [6]Джо © (20.11.05 22:48) [19]
>> а уничтожать я буду так: TcpServer1.Free правильно?
>Экземпляр объекта именно так и уничтожается, да.
А теперь уже я через букву читаю. TcpServer.Free() прочел. Думаю фигасе деструктор класса чтоли вызывать хочет ;-) Если с единичной на конце то правильно.
Дмитрий_05 (2005-11-20 22:53:00) [7]кстати по поводу уничтожения классов, в чем разница между ....Free и FreeAndNill(...) ?
Джо (2005-11-20 22:48:00) [8]
> [14] Дмитрий_05 (20.11.05 22:30)
> а уничтожать я буду так: TcpServer1.Free правильно?
Экземпляр объекта именно так и уничтожается, да.
Джо (2005-11-20 22:47:00) [9]
> [13] Sergey Masloff (20.11.05 22:29)
Да, это я сам в словесах уже запутался... дома тут ералаш творится, пишу урывками :(
Дмитрий_05 (2005-11-20 22:44:00) [10]ой, мне же Джо написал как... сори...
Дмитрий_05 (2005-11-20 22:34:00) [11]а как тогда? FreeAndNill(TcpServer1) ?
Sergey Masloff (2005-11-20 22:33:00) [12]Дмитрий_05 (20.11.05 22:30) [14]
Нет
Дмитрий_05 (2005-11-20 22:30:00) [13]а уничтожать я буду так: TcpServer1.Free правильно?
Sergey Masloff (2005-11-20 22:29:00) [14]Джо © (20.11.05 22:24) [11]
>В данном случае, я думаю, без разницы.
Если класс НЕ потомок TComponent то разница есть, да еще какая. Не скомпилируется даже в одном из случаев ;-)))
Дмитрий_05 (2005-11-20 22:29:00) [15]AOwner: TComponent
Джо (2005-11-20 22:24:00) [16]
> [10] Дмитрий_05 (20.11.05 22:14)
В данном случае, я думаю, без разницы. Так как MyClass (в том виде, как я его описал) все-равно НЕ будет уничтожать объект, которым владеет. Это нужно будет делать руками. А может быть, компилятор этого даже не пропустит. Какой там класс указан в .Create?
Дмитрий_05 (2005-11-20 22:14:00) [17]спасибо большое, вроде понятно стало... Джо, а в TcpServer1 := TTcpServer.Create(nil); в скобочках может тогда MyClass написать, или всетаки nil?
palva (2005-11-20 22:12:00) [18]palva © (20.11.05 22:09) [7]
Был неправ, не имя, конечно. Читайте лучше Джо © (20.11.05 22:06) [6]
Джо (2005-11-20 22:10:00) [19]Создаем объект обработчик, допустим в секции 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:09:00) [20]> что там в скобках написать? помоги пожалуйста
Здесь вообще скобки не нужны - это ведь имя обработчика, т. е. просто имя метода (процедуры) объекта Form, либо того объекта, который стоит в свойстве Owner сервера и попадает туда из параметра конструктора при создании. То есть если вы создадите сервер с Nil то получите исключение при соответствующем событии.
Хотя, может я неправ, я не знаю, что такое TTcpServer. У меня в D7 штатно стоит TIdTCPServer