Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизКак запустить процедуру B после завершения процедуры A Найти похожие ветки
← →
SergP (2003-08-22 11:01) [0]Проблема такого рода: Имеется объект (допустим С). Есть у него событие которому сопоставлен обработчик этого события (процедура A), и есть процедура B , которая уничтожает объект С
Мне нужно чтобы при возникновении вышеупомянутого события объект уничтожался.
Такой вариант:
procedure A;
begin
...
B;
end;
procedure B;
begin
c.free;
end;
не проходит. так как при вызове B не была завершена A. А так как A является обработчиком событий объекта C то следовательно я не могу делать C.free.
Как сделать так чтобы В запускалась сразу же, но после завершения A? И вообще возможно ли это?
← →
MBo (2003-08-22 11:05) [1]пошли (POSTMessage)сообщение форме в конце A, в его обработчике вызови B
← →
Юрий Федоров (2003-08-22 11:05) [2]В случае работы с окнами спасает PostMessage
← →
Юрий Федоров (2003-08-22 11:06) [3]>>MBo ©
:-)
← →
Skier (2003-08-22 11:06) [4](Если я правильно понял)
procedure A;
begin
//.............
B;
if Assigned(c) then begin
end //if
else begin
end; //else
//.............
end;
procedure B;
begin
FreeAndNil(c);
end;
← →
Крот (2003-08-22 11:07) [5]Передавай в событие var флаг типа boolean, если нужно устанавливай его в true, а объект, при выходе из события
пускай обрабатывает этот флаг и сам себя "убивает", если нужно.
← →
SergP (2003-08-22 18:36) [6]
> Крот © (22.08.03 11:07) [5]
> а объект, при выходе из события
> пускай обрабатывает этот флаг и сам себя "убивает", если
> нужно.
Что-то я не представляю как он будет убивать сам себя...
2 Skier ©
А ты уверен что так можно? Ведь А - процедура-обработчик событий, вызываемая объектом С.
Если даже С уничтожется, то как тогда сможет завершиться A, если она была вызвана объектом С?
> MBo © (22.08.03 11:05) [1]
> пошли (POSTMessage)сообщение форме в конце A, в его обработчике
> вызови B
Не работал я с POSTMessage, не знаю как это будет выглядеть.
Можно примерчик?
← →
Song (2003-08-22 18:41) [7]>> Что-то я не представляю как он будет убивать сам себя...
Посмотри как сделан метод TForm.Release. Его, не в пример, Free можно выполнять из обработчиков самой формы.
← →
Song (2003-08-22 18:42) [8]// Не работал я с POSTMessage, не знаю как это будет выглядеть.
// Можно примерчик?
Это и есть принцип Release
← →
Юрий Федоров (2003-08-22 18:43) [9]uses ... Messages...
...
const
WM_KILL_MY_OBJ = WM_USER + 1;
...
type
TForm1 = class(TForm)
private
procedure KillMyObject(var M : TMessage); message WM_KILL_MY_OBJ;
end;
...
procedure TForm1.KillMyObject(var M: TMessage);
begin
TObject(M.LParam).Free;
end;
...
procedure B;
begin
PostMessage(Form1.Handle, WM_KILL_MY_OBJ, 0, LPARAM(C));
//c.free;
end;
← →
Skier (2003-08-22 18:44) [10]>SergP © (22.08.03 18:36) [6]
> А ты уверен что так можно? Ведь А - процедура-обработчик
> событий, вызываемая объектом С.
Я не уверен что правильно понял проблему...
Если А и B методы C и c.free; = Self.free; то тогда
PostMessage(...)
← →
Юрий Федоров (2003-08-22 18:47) [11]>>Song
>>Free можно выполнять из обработчиков самой формы.
Можно, если мы гарантированно после Free выходим из метода объекта, а не возвращаемся после этого в его другой метод.
Правда что у автора вопроса именно происходит, лля меня до конца не понятно :-)
← →
Song (2003-08-22 18:48) [12]2Юрий Федоров © (22.08.03 18:47) [11]
Вы поняли с точностью до наоборот, я наверно не там запятую поставил.
Я написал, что Release можно выполнять из обработчиков формы в отличие от Free.
← →
Skier (2003-08-22 18:50) [13]>Song © (22.08.03 18:48) [12]
Но автор ведь не убивает форму, он убивает какой-то свой объект.
← →
Юрий Федоров (2003-08-22 18:58) [14]>>Song © (22.08.03 18:48) [12]
Запятую там поставили, Я не понял, что у автора :-)
← →
Camus (2003-08-22 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;
← →
SergP (2003-08-22 19:06) [16]Вобщем в моем случае объект - TClientSocket, а процедура A - обработчик события OnDisconnect.
Если TclientSocket дисконектится - то его нужно убить.
Не писал конкретно из-за того что боялся что модератор перенесет в "СЕТИ", хотя по идее єто общий вопрос.
Попробую, может что-то подойдет из предложенного...
← →
Skier (2003-08-22 19:08) [17]Насколько я помню TclientSocket дисконектится в своём
деструкторе.
← →
Song (2003-08-22 19:09) [18]>> Но автор ведь не убивает форму, он убивает какой-то свой объект.
Я написал, чтобы он посмотрел как сделан метод Release и сделал сам наподобие, а он именно через PostMessage() и сдеалан. Само собой методом TForm.Release можно разрушить только форму.
← →
SergP (2003-08-22 19:15) [19]
> Skier © (22.08.03 19:08) [17]
> Насколько я помню TclientSocket дисконектится в своём
> деструкторе.
Ну да. Но мне не нужно убивать недисконекченый TclientSocket.
Т.е. я его должен убить только если он дисконектится по инициативе удаленного сервера, к которому он приконекчен.
← →
Skier (2003-08-22 19:19) [20]>SergP © (22.08.03 19:15) [19]
А TServerSocket.OnClientDisconnect нельзя использовать ?
← →
Serginio666 (2003-08-22 19:21) [21]Сделай наследнка TClientSocket, создай процедуру Disconnect в которой вызывай Free и можешь обнилить все ссылки на него предварительно передав ссылки переменных в какой либо список, присвой в конструкторе OnDisconnect:=Disconnect;
← →
SergP (2003-08-22 20:27) [22]
> Skier © (22.08.03 19:19) [20]
> >SergP © (22.08.03 19:15) [19]
> А TServerSocket.OnClientDisconnect нельзя использовать ?
Так ведь я не писал что у меня есть TClientSocket. Но если ты читал мой топик в "сетях" то да, у меня есть TServerSocket, но все что связано с ним у меня работает нормально. Т.е. TclientSocket нужно уничтожить в двух случаях:
1. От независящих от TClientSocket событий.
2. От зависящих от него событий
С 1 у меня все нормально.
А вот со 2 - проблема.
Просто мне нужно уничтожении TclientSocket"a если он "захотел" дисконектится. Так что тут все другие объекты присутствующие в моей проге ни при чем.
Если Tclientsocket сгенерировал событие OnDisconnect - его нужно уничтожить. Но в самом обработчике его уничтожать нельзя (вылезает ошибка, вроде бы Access Violation, или винда закрывает прогу, непомню точно).
← →
Романов Р.В. (2003-08-22 21:55) [23]PostMessage!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c