Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-10908
Ixion
2003-08-18 03:44
2003.09.04
Лицензия на программирование ?


1-10761
Micah'GF
2003-08-23 20:57
2003.09.04
Отвести память под текст


1-10793
First_May
2003-08-22 10:06
2003.09.04
Офис...


1-10691
frost
2003-08-21 08:19
2003.09.04
TreeView и текст связанный с каждым узлом дерева


6-10860
Dixx
2003-07-01 13:16
2003.09.04
Сокс-подключение через прокси.





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