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

Вниз

Как запустить процедуру 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
7-10999
tan
2003-06-20 10:22
2003.09.04
считывание с COM-порта с помощью int14?


14-10928
peps
2003-08-17 04:38
2003.09.04
компонент


6-10851
Геннадий
2003-06-28 12:53
2003.09.04
Слежение


14-10960
Andryk
2003-08-15 11:40
2003.09.04
Да уж какжый сходит с ума по-своему :о))


3-10607
Владий
2003-08-13 15:14
2003.09.04
Помогите разрешить проблему...