Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2011, 09:50   #1
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию Уничтожить кнопку при нажатии на неё же.

Добрый день!
Есть два Edit'а, за ними сразу же идёт button, и таких наборов несколько, создаются динамически. Кнопке присваиваю на нажатие: уничтожение двух Edit, и уничтожение самой себя.
Что странно: На разных GroupBox'ах реагирует по разному. На первом иногда выводит ошибку (т.е. при одной последовательности действий реагирует по-разному), на втором всё время выдаёт ошибку, процедуры создания и удаления идентичны. Но не в этом даже суть.
Как можно удалить конпку при нажатии на неё? Должен ли работать Free. И вообще реально ли из собственной же процедуры удалить себя?
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.

Последний раз редактировалось NoName_emaNoN; 20.01.2011 в 09:54.
NoName_emaNoN вне форума Ответить с цитированием
Старый 20.01.2011, 10:15   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

вроде
Код:
sender.free;
должно работать.
vovk вне форума Ответить с цитированием
Старый 20.01.2011, 10:45   #3
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от vovk Посмотреть сообщение
вроде
Код:
sender.free;
должно работать.
Не-а... не должнo...
Вот правильный код:
Код:
var myobj: TObject;
..................
procedure TForm1.Button1Click(Sender: TObject);
begin
myobj:=Sender;
Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
myobj.Free;
Timer1.Enabled:=False;
end;
asmodey1 вне форума Ответить с цитированием
Старый 20.01.2011, 10:48   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Не-а... не должна...
Очень даже работает
Цитата:
Вот правильный код
В корне не верный подход

Цитата:
Сообщение от NoName_emaNoN
И вообще реально ли из собственной же процедуры удалить себя?
Процедура, которая присвоена обработчику OnCklick кнопки, не его собственность. Сами же писали
Цитата:
создаются динамически
Она пренадлежат объекту класса, в котором объявлена.
Но более того. Даже если вы уничтожите объект внутри него самого ничего страшного не произойдет. Тело процедуру продолжит выполнятся как ни в чем не бывало. Ведь оно не уничтожено, и продолжает болтаться в пямяти. Главное не использовать Sender после Sender.Free (ну и далее не обращатся к полям объекта по этому адресу).

P.S.:
Даже такое проканает
Код:
{ TMO }

function TMO.A: String;
begin
  Result := 'asdgfasdfasdf';
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  mo: TMO;
begin
  ShowMessage (mo.A);
end;
Объекта нет, а функция работает.

Последний раз редактировалось Sibedir; 20.01.2011 в 11:00.
Sibedir вне форума Ответить с цитированием
Старый 20.01.2011, 11:15   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Тело процедуру продолжит выполнятся как ни в чем не бывало. Ведь оно не уничтожено, и продолжает болтаться в пямяти
И возврат из нее произойдет как положено (откуда вызвана) т.е. в процедуру уничтоженного объекта.
Цитата:
Главное не использовать Sender после Sender.Free (ну и далее не обращатся к полям объекта по этому адресу).
А вы уверены что там не будет обращений к (теперь уже правда не к sender а к Self и прочим данным удаленного объекта) все процедуры остались на месте и стек их вызовов тоже.
чаще всего это сработает но об абсолютной гарантии (для любого объекта) не может быть и речи.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.01.2011 в 11:19.
evg_m на форуме Ответить с цитированием
Старый 20.01.2011, 12:45   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И возврат из нее произойдет как положено (откуда вызвана) т.е. в процедуру уничтоженного объекта.
нукась стоп, обычно обработчики принадлежат форме.
так что все нормально вернется, мы уничтожили Sender, а не Self.
во вторых с освобождением обьекта код не изменяется.
Цитата:
А вы уверены что там не будет обращений к (теперь уже правда не к sender а к Self и прочим данным удаленного объекта)
опять же помните кто такой Sender, а кто такой Self в обработчике.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.01.2011, 14:12   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
обычно обработчики принадлежат форме.
нов ызывается данная процедура из другой процедуры
procedure Tbuton.Click; которая принадлежит самому объекту (в данном случае кнопке).
Код:
property Onclick: TnotifyEvent read FonClick write Fonclick;
Код:
if assigned(Fonclick) then fonclick(self);
наш параметр sender и есть self для TButton.

Цитата:
во вторых с освобождением обьекта код не изменяется.
код Tbuttin.click; не меняется. Но в нем есть (или по крайней мере может быть) обращение к его self (Tbutton). котjрый мы успешно сделали Free.

Tbutton наследник Tcontrol
Код:
procedure TControl.Click;
begin
  { Call OnClick if assigned and not equal to associated action's OnExecute.
    If associated action's OnExecute assigned then call it, otherwise, call
    OnClick. }
  if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
    FOnClick(Self)
  else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
    ActionLink.Execute(Self)
  else if Assigned(FOnClick) then
    FOnClick(Self);
end;
но
Код:
Tcontrol
     Public
     procedure Click; virtual;
и кто поручится что в перегруженной функции не будет такого.
Код:
procedure TMButton.Click;
begin
  inherited click; //базовое действие с обращением к нашему Onclick где есть Free
  Canvas.Drawrect;//код остался на месте продолжаем работу и получаем ......
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.01.2011 в 14:39.
evg_m на форуме Ответить с цитированием
Старый 20.01.2011, 15:56   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2 evg_m
Да все может быть. Но ТС говорил про button. Я так понимаю это простой BTutton. И к тому же я написал:
Цитата:
Главное не использовать Sender после Sender.Free (ну и далее не обращатся к полям объекта по этому адресу).
Не спорю, что можно и споткнуться. Но если речь идет о простой кнопке, все будет хокей. Чё голову ломать над тривиальной задачей.
А если вам не нравится наше решение - предложите своё. Вариант с таймером чёт тоже не вдохновил.
Sibedir вне форума Ответить с цитированием
Старый 20.01.2011, 16:18   #9
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Грамотно это делается это так: форме, на которой находится кнопка, асинхронно (PostMessage) посылается некое заранее предопределенное сообщение. По получении сообщения форма преспокойно разрущает контрол-отправитель сообщения.
mss вне форума Ответить с цитированием
Старый 20.01.2011, 17:13   #10
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Очень даже работает
А если не теоретизировать, а попробовать ?
Я вот попробовал... И получил абстрактную ошибку.
Но вы упирайтесь рогом дальше. Доказывайте псевдоправоту...
asmodey1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при нажатии на кнопку Delete vik85 Помощь студентам 0 20.12.2009 20:34
Скрытие интерфейса при нажатии на кнопку kostghost Общие вопросы Delphi 3 28.08.2009 11:10
прокрутка при нажатии на кнопку neformat JavaScript, Ajax 0 20.06.2008 20:40
При нажатии на кнопку добавить в PageControl VenMaster Компоненты Delphi 5 25.04.2008 01:41
Загрузка файла при нажатии на кнопку Simply-Art Общие вопросы Delphi 15 23.01.2007 14:00