Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий_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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.023 c
6-1125938209
Galiaf
2005-09-05 20:36
2005.12.18
Закачка сокетам.


5-1116931625
Rep
2005-05-24 14:47
2005.12.18
Получения фокуса наследником TCustomControl


2-1133527684
Не молодой
2005-12-02 15:48
2005.12.18
Удаление файла


8-1121267512
Igor_thief
2005-07-13 19:11
2005.12.18
Работа с png изображениями?


8-1120681700
ronyn
2005-07-07 00:28
2005.12.18
Как запустить поиск всей музыки на компе для добавления её в Плей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский