Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование невизуальных компонентов без формы [D7, WinXP]


Страницы:   1 2

Дмитрий_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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо