Форум: "Основная";
Текущий архив: 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.007 c