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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2014, 22:53   #1
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию Уничтожение фрейма из него самого.

Здравствуйте. У меня скорее вопрос, а не проблема. Пишу в Lazarus, но думаю с Delphi это имеет одни корни. Сдеал фрейм который служит в основной программе настройками для поля (не суть важно). Важно то, что экземпляров фрейма может быть несколько. Поэтому надо было предусмотреть возможность уничтожения фрейма. Сделал в лоб, а именно, кинул на фрейм кнопочку и написал:
Код:
procedure TFrame1.btCloseClick(Sender: TObject);
begin
  Free;
end;
Думал будет ошибка, но все работает. Еще пробовал динамически создавать фрейм и кнопочку на нем, которая уничтожает фрейм.

Код:
var i : integer;
procedure TForm1.Button1Click(Sender: TObject);
var newBT : TButton;
    fm : TFrame1;
begin
  fm:=TFrame1.Create(Form1);
  fm.Align:=alTop;
  fm.Name:='Frame1'+inttostr(i);
  fm.Tag:=i;
  fm.Parent:=Form1;
  newBT:=TButton.Create(fm);
  newBT.Anchors:=[akRight, akTop];
  newBT.Tag:=i;
  newBT.Name:='CloseButton'+inttostr(i);
  newBT.Parent:=fm;
  newBT.OnClick:=@ButtonCloseClick;
  i:=i+1;
end;

procedure TForm1.ButtonCloseClick(Sender: TObject);
begin
  FindChildControl('Frame1'+inttostr((Sender as TButton).Tag)).Free;
end;
И это тоже работает. Вопрос собственно такой: почему и как это работает? Как объект может уничтожить сам себя? Очень хочется понять и разобраться. Помогите пожалуйста.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 11.01.2014, 00:57   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Вызывается метод Free. Он и уничтожает объект.
Подробнее: Деструктор и Free.
Streletz вне форума Ответить с цитированием
Старый 11.01.2014, 12:15   #3
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Вызывается метод Free. Он и уничтожает объект.
Подробнее: Деструктор и Free.
Объект может вызвать Free для себя в своем же методе?
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 11.01.2014, 12:26   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

А почему нет?
Уничтожение формы в собственном методе:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.Free;
end;
Streletz вне форума Ответить с цитированием
Старый 11.01.2014, 12:32   #5
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Спасибо! Видимо перемудрил сам себя.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 11.01.2014, 13:22   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
Уничтожение формы в собственном методе
Так нельзя делать, не только для формы, но и для любого другого объекта. Если и отработало, то повезло - после такого Free продолжает еще отрабатывать код уничтоженного объекта. При этом не всегда везуха будет. Для форм в OnClose - caFree, для модальных есть ModalResult. Для фрейма посылал бы сообщение форме и уже из обработчика сообщения удалял бы фрейм. Хотя для фрейма может и другие предложения будут - как-то не приходилось его удалять из себя
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.01.2014 в 13:24.
Аватар вне форума Ответить с цитированием
Старый 11.01.2014, 13:42   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вообще не могу понять зачем фрейм уничтожать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.01.2014, 14:04   #8
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
Уничтожение формы в собственном методе
Так нельзя делать, не только для формы, но и для любого другого объекта. Если и отработало, то повезло - после такого Free продолжает еще отрабатывать код уничтоженного объекта. При этом не всегда везуха будет. Для форм в OnClose - caFree, для модальных есть ModalResult. Для фрейма посылал бы сообщение форме и уже из обработчика сообщения удалял бы фрейм. Хотя для фрейма может и другие предложения будут - как-то не приходилось его удалять из себя
Я понял. Из-за того что только пробовал мне везло с уничтожением фреймов. Сделаю удаление их из формы на которой их создаю.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с Excel без него самого?! $T@LKER Общие вопросы Delphi 2 09.08.2010 18:13
Уничтожение потока SNUPY Общие вопросы Delphi 2 11.02.2009 22:47
Найти максимальный элемент матрицы и вставить правее него столбец из нулей и ниже него строку из нулей. Romer9999 Паскаль, Turbo Pascal, PascalABC.NET 3 28.11.2008 11:28
Pascal//определить длину самого короткого и самого длинного слова в строке ShnurOK Помощь студентам 2 16.12.2007 10:43
Уничтожение окна Kashp Win Api 20 07.09.2007 14:15