Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.09;
Скачать: CL | DM;

Вниз

Уничтожение объекта с помощью 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-27595
Fasy
2003-09-27 05:56
2003.10.09
размер папки


14-27665
MBo
2003-09-22 17:03
2003.10.09
Отчет о MS Developers Day в Новосибирске


14-27643
Johnny Smith
2003-09-19 15:53
2003.10.09
Опрос на тему:


1-27505
Nikulin
2003-09-26 15:47
2003.10.09
Про сервисы...


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