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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.008 c
2-1327905510
Nikitos
2012-01-30 10:38
2012.06.03
Как вставить картинку в reportf?


15-1327516969
Псарь
2012-01-25 22:42
2012.06.03
Как вы следите за обновлениями?


2-1327661887
I_D
2012-01-27 14:58
2012.06.03
Компонент на базе TImage


15-1328418683
upc
2012-02-05 09:11
2012.06.03
Unable to insert a line.


15-1328100148
Псарь
2012-02-01 16:42
2012.06.03
Dummy, Foo, Bar.