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

Вниз

Уничтожение объекта с помощью PostMessage..   Найти похожие ветки 

 
SergP   (2003-09-27 10:43) [0]

Когда-то задавал вопрос: как уничтожить объект по его собственному событию. Мне порекомендовали PostMessage:


Camus © (22.08.03 19:00) [15]
type
TForm1 = class(TForm)
...
private
...
procedure WMUserPlus100(var Message: TMessage); message WM_USER + 100;
...
end;

procedure TForm1.A;
begin
...
B;
...
end;

procedure TForm1.B;
begin
...
PostMessage(Handle, WM_USER + 100, 0, 0);
...
end;

procedure TForm1.WMUserPlus100(var Message: TMessage);
begin
C.Free
end;


Все вроде бы нормально работало. Теперь я решил переписать прогу по другому. Возникает вопрос: как передать через PostMessage указатель на объект, который нужно уничтожить?
т.е:

procedure TForm1.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin

PostMessage(...); //как здесь мне передать указатель на socket
//или на Tclientsocket, который вызвал это событие?
end;


 
ZEE   (2003-09-27 10:47) [1]

procedure TForm1.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
PostMessage( TClientSocket(Sender).Handle,WM_USER+100,0,0);
end;


 
Anatoly Podgoretsky   (2003-09-27 11:17) [2]

Cardinal(object)


 
Sergp   (2003-09-27 12:27) [3]


> ZEE © (27.09.03 10:47) [1]
> procedure TForm1.ClientSocketDisconnect(Sender: TObject;
> Socket: TCustomWinSocket);
> begin
> PostMessage(TClientSocket(Sender).Handle,WM_USER+100,0,0);
> end;


Хм.. У TclientSocket нет handle...


 
ZEE   (2003-09-27 12:31) [4]

хм... точно, но может так TClientSocket(Sender).Socket.Handle
правда нет уверенности
а на кой уничтожать-то его?


 
Sergp   (2003-09-27 12:45) [5]


> ZEE © (27.09.03 12:31) [4]
> хм... точно, но может так TClientSocket(Sender).Socket.Handle
> правда нет уверенности
> а на кой уничтожать-то его?


Ну дисконектился он, значит нужно уничтожить, а зачем они будут накапливаться? Ведь они у меня в рантайме создаются. Раньше я делал массив CS:array[1..30] of Tclientsocket, поэтому мог передавать через postmessage индекс в виде integer..., а теперь решил обойтись без этого массива.


> Anatoly Podgoretsky © (27.09.03 11:17) [2]
> Cardinal(object)


А можно подробнее?
В смысле: 1. Как передать указатель через postmessage и
2. Как получить его в процедуре, где собственно будет уничтожаться объект, чтобы я мог сделать ему .free ?


 
ZEE   (2003-09-27 12:59) [6]

ах да, что т я не таво раньше насоветовал TClientSocket - это ж не виндовый контрол - т.е. вобще не контрол, а просто компонент
поэтому думаю без массива будет сложновато
разве-что в Components у формы искать нужный, но PostMessage тут врядли пойдет...
зы: может я и не прав :-\


 
Sergp   (2003-09-27 13:11) [7]

Хорошо. Я раньше передавал переменную integer через Postmessage.
Могу ли я как-нить с помощью integer передать pointer?

Типа так pointer-->integer-->postmessage-->integer-->pointer?


 
Sergp   (2003-09-27 15:15) [8]

ИМХО нашел выход:

const
WM_KILL_MY_OBJ = WM_USER + 1;
...

private
procedure KillMyObject(var M : TMessage); message WM_KILL_MY_OBJ;
...
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
CSocket:TclientSocket;
begin
CSocket:=TclientSocket.Create(self);
CSocket.Host:=Edit1.text;
CSocket.Port:=Strtoint(edit2.text);
CSocket.OnWrite:=ClientSocketWrite;
CSocket.OnError:=ClientSocketError;
CSocket.OnRead:=ClientSocketRead;
CSocket.OnDisconnect:=ClientSocketDisconnect;
CSocket.ClientType:=ctNonBlocking;
CSocket.Socket.Data:=Socket;
socket.Data:=CSocket;
CSocket.Open;
end;

procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Postmessage(Form1.Handle, WM_KILL_MY_OBJ, 0,integer(Socket.data));
end;

procedure TForm1.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
PostMessage(Form1.Handle, WM_KILL_MY_OBJ, 0,integer(Sender));
end;

procedure TForm1.KillMyObject(var M: TMessage);
begin
TCustomWinSocket(Tclientsocket(pointer(M.Lparam)).socket.data).free;
TClientsocket(pointer(m.Lparam)).free;
end;

// Аналогично уничтожаю сокеты при возникновении ошибок.

Работает нормально, пока ни одного глюка не было.
Только вот вопрос: Это не страшно, что я pointer "засовываю" в integer, а не в cardinal? или могут быть проблемы?


 
Song   (2003-09-27 15:32) [9]

2SergP © (27.09.03 10:43)
А смысл уничтожать объект C из объекта B асинхронно, если можно было прямо в обработчике B написать C.Free ?
Такой способ нужен только для уничтожения объекта из его обработчика.


 
Sergp   (2003-09-27 16:14) [10]


> Song © (27.09.03 15:32) [9]
> 2SergP © (27.09.03 10:43)
> А смысл уничтожать объект C из объекта B асинхронно, если
> можно было прямо в обработчике B написать C.Free ?
> Такой способ нужен только для уничтожения объекта из его
> обработчика.


Ну так у меня ведь объект должен уничтожаться из своего же обработчика.... Просто я заодно чтобы не писать 2 процедуры, в одной уничтожаю оба объекта - клиентсокет и соотв. соединение серверсокета.

В смысле
дисконект клиентсокета --> уничтожение клиентсокета и соединения в серверсокете;

дисконект соединения серверсокета --> уничтожение клиентсокета и соединения в серверсокете;

Конечно можно например при дисконекте клиентсокета, в его обработчике уничтожить соединение серверсокета, а потом сам клиентсокет уничтожать через postmessage. Аналогичто делать и при дисконекте соединения серверсокета.
Но так как я сделал проще в написании...Все равно пришлось бы использовать postmessage.

Но меня сейчас интересует мой последний вопрос:

"Это не страшно, что я pointer "засовываю" в integer, а не в cardinal? или могут быть проблемы?"



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

Форум: "Основная";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
1-27492
AlexanderSK
2003-09-26 17:30
2003.10.09
Как подлучить список - расширение - приложение - иконка


6-27629
h@1f-e1f
2003-08-12 17:19
2003.10.09
Как сохранить страницу?


1-27436
Chlavik
2003-09-28 01:36
2003.10.09
Координаты кнопочки на окне


3-27337
Пингвин
2003-09-20 13:27
2003.10.09
помогите найти исходник


7-27750
-=[SDA]=-
2003-07-24 12:31
2003.10.09
А как интересно узнать текущую раскладку клавиатуры ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский