Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];

Вниз

потеря управления контрола   Найти похожие ветки 

 
jacksotnik   (2012-01-30 11:37) [0]

Всем привет. подскажите как сделать так чтобы после нажатия на кнопку в ней вызывается процедура, и чтоб после того как отработала процедура не возвращалось в процедуру onclick кнопки


 
RWolf ©   (2012-01-30 11:42) [1]

смысл?


 
Юрий Зотов ©   (2012-01-30 11:43) [2]

> как сделать так чтобы после нажатия на кнопку в ней вызывается
> процедура

Из OnClick эту процедуру и вызвать.

> и чтоб после того как отработала процедура не
> возвращалось в процедуру onclick кнопки

Никак. Но можно в OnClick больше ничего не делать.


 
AV ©   (2012-01-30 11:44) [3]

procedure PPP;
 begin
   ShowMessage( "procedure PPP;");
   raise Exception.Create("");
 end;

procedure TForm1.btn1Click(Sender: TObject);
begin
   ShowMessage( "before PPP;");
   PPP;
   ShowMessage( "after PPP;");
end;


 
Юрий Зотов ©   (2012-01-30 11:44) [4]

Есть подозрение на X, Y, Z. Объясните, зачем все это?


 
И. Павел ©   (2012-01-30 11:46) [5]

> [0] jacksotnik   (30.01.12 11:37)

Если я правильно понял вопрос, то должен помочь вызов Abort в конце вложенной процедуры. Тогда возникнет исключение и проскочится весь код в OnClick (если там, конечно, нет нужного catch).


 
Ega23 ©   (2012-01-30 11:46) [6]

function PPP: Boolean;
begin
 Result := MessageBox(Handle, "ttt", "ttt", MB_OKCANCEL) = IDOK;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  ShowMessage( "before PPP;");
  if PPP then
    ShowMessage( "after PPP;");
end;


 
jacksotnik   (2012-01-30 11:52) [7]

Мне надо удалить объект класса при нажатии на кнопочку созданную внутри класса, тоесть должна уничтожиться и кнопка на которую нажали. но все это надо организовать без передачи сообщения в мейн форму. попробую с генерацией эксепшена


 
И. Павел ©   (2012-01-30 11:55) [8]

> [7] jacksotnik   (30.01.12 11:52)

Была такая задача. Решил так: в обработчике генерирую свое сообщение. В обработчике своего сообщения удаляю объекты.


 
AV ©   (2012-01-30 11:55) [9]

т.е. уничтожение объекта из самого объекта?
ерунда.
PostMessage диспетчеру - православный выход


 
И. Павел ©   (2012-01-30 11:55) [10]

> в обработчике генерирую свое сообщение

В вашем случае — в обработчике onclick.


 
Юрий Зотов ©   (2012-01-30 11:57) [11]


> jacksotnik   (30.01.12 11:52) [7]
> Мне надо удалить объект класса при нажатии на кнопочку созданную
> внутри класса, тоесть должна уничтожиться и кнопка на которую
> нажали.

Похоже, подозрение на X, Y, Z находит свое подтверждение. Зачем это нужно, расскажите.


 
RWolf ©   (2012-01-30 11:58) [12]

почему бы объекту не уничтожать самого себя?
TThread вон уничтожает (FreeOnTerminate), и ничего.


 
Юрий Зотов ©   (2012-01-30 12:10) [13]


> RWolf ©   (30.01.12 11:58) [12]

После отработки обработчика события управление вернется в код класса и если в нем есть обращения к полям объекта, то будет AV.

Нормальное решение - PostMessage форме (или другому диспетчеру), но по каким-то причинам (непонятным) человек не хочет этого делать. Да и вообще, если возникает необходимость в таких штуках, то часто это говорит об огрехах в архитектуре. Поэтому и возникает подозрение на X, Y, Z.


 
AV ©   (2012-01-30 12:18) [14]

RWolf ©   (30.01.12 11:58) [12]
там не так просто
если глянуть

   FreeThread := Thread.FFreeOnTerminate;
   Result := Thread.FReturnValue;
   Thread.DoTerminate;
   Thread.FFinished := True;
   SignalSyncEvent;
   if FreeThread then Thread.Free;

а чего же тогда не
if  Thread.FFreeOnTerminate; then Thread.Free;


 
AV ©   (2012-01-30 12:19) [15]


> После отработки обработчика события управление вернется
> в код класса и если в нем есть обращения к полям объекта,
>  то будет AV.

собственно.


 
jacksotnik   (2012-01-30 12:25) [16]

Это нужно что код был универсален. т.е из главной программы надо выполнит только вызов процедуры которая наплодит объекты, а все остальные действия должен выполнять сам объект


 
И. Павел ©   (2012-01-30 12:36) [17]

> [16] jacksotnik   (30.01.12 12:25)

Такой код может получится не универсальным а неконтролируемым. Не зря многие не советуют использовать Thread.FreeOnTerminate без особой на то необходимости.


 
Ega23 ©   (2012-01-30 12:38) [18]


> Это нужно что код был универсален. т.е из главной программы
> надо выполнит только вызов процедуры которая наплодит объекты,
>  а все остальные действия должен выполнять сам объект


Создавай менеджер своих объектов. С очередью сообщений.


 
Юрий Зотов ©   (2012-01-30 12:39) [19]


> jacksotnik   (30.01.12 12:25) [16]

А почему нельзя использовать PostMessage?


 
jacksotnik   (2012-01-30 12:39) [20]


> Была такая задача. Решил так: в обработчике генерирую свое
> сообщение. В обработчике своего сообщения удаляю объекты.
>


Это хорошо но кому отправлять сообщение если у объекта моего класса нет handle


 
Ega23 ©   (2012-01-30 12:40) [21]


> Это хорошо но кому отправлять сообщение если у объекта моего
> класса нет handle

А что тебе мешает его создать?


 
Сергей М. ©   (2012-01-30 12:51) [22]


> кому отправлять сообщение если у объекта моего класса нет
> handle


Зато наверняка есть у приложения, ибо оно у тебя гуёвое.
Вот и отправляй сообщение окну с хендлом Application.Handle


 
jacksotnik   (2012-01-30 12:56) [23]


> А что тебе мешает его создать?

Имеешь ввиду, создать поле типа Cardinal? А как ему правильно значение присвоить?


 
Юрий Зотов ©   (2012-01-30 12:57) [24]

Или Application.MainForm.Handle


 
jacksotnik   (2012-01-30 12:58) [25]

Блин еще раз повторяю обработчика этого сообщения не должно быть в мейнформе


 
Юрий Зотов ©   (2012-01-30 13:17) [26]


> jacksotnik   (30.01.12 12:58) [25]
> Блин еще раз повторяю обработчика этого сообщения не должно
> быть в мейнформе

Блин, еще раз спрашиваю - почему?


 
Плохиш ©   (2012-01-30 13:18) [27]

Высосать проблему из пальца, а потом героически еë решать.
Только фигли на форум-то припëрся?


 
Ega23 ©   (2012-01-30 13:27) [28]

Кто тебе мешает эти кнопки на фрейм кидать?


 
jacksotnik   (2012-01-30 13:34) [29]


> Блин, еще раз спрашиваю - почему?

Так я и сам уже сделал. Хочу по-другому


 
Юрий Зотов ©   (2012-01-30 14:01) [30]


> jacksotnik   (30.01.12 13:34) [29]

Да, это, конечно, довод серьезный, что и говорить. Примерно, как стоматолог начнет лечить зуб не так, как обычные врачи делают, а через другое отверстие.

Смотрите конструктор и деструктор TTimer, а в них - AllocateHWnd и DeallocateHWnd. Сделайте по аналогии - получите окно, которое и будет диспетчером Ваших объектов.


 
jacksotnik   (2012-01-30 14:05) [31]

Спасибо. Попробуем



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
15-1327573619
>|<
2012-01-26 14:26
2012.06.03
Как правильно обновляться программу


2-1327842847
Alex_C
2012-01-29 17:14
2012.06.03
Считать текстовый файл с диска


15-1328252277
2222
2012-02-03 10:57
2012.06.03
достать прогу из трея


4-1257507611
Валигози
2009-11-06 14:40
2012.06.03
Как программно добавить пароль в "хранилище паролей"?


2-1327905510
Nikitos
2012-01-30 10:38
2012.06.03
Как вставить картинку в reportf?





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