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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2019, 10:48   #1
dsbv
Пользователь
 
Регистрация: 21.03.2019
Сообщений: 20
По умолчанию удаление динамически создаваемых кнопок

Как правильно удалить динамически созданные кнопки
Создаю так
Код:
Function Loadmenu(file_name : String) : String;
var
 List_menu: TStringList;
 i,butt_top:Integer;
 begin
// пытаюсь удалить все кнопки из ScrollBox1
 for i:= Form1.ScrollBox1.ControlCount - 1 downto 1 do
 begin
 Form1.ScrollBox1.Controls[i].Free;
 end;
//вылетает ошибка обращения к памяти но не всегда, иногда код работает
 List_menu:= TStringList.Create;
 List_menu.LoadFromFile(file_name);
 for i := 0 to List_menu.Count - 1 do
 begin
    menuButton:=TButton.Create(nil);
    menuButton.Parent:=Form1.ScrollBox1;
    menuButton.Height:=40;
    menuButton.Width:=Form1.ScrollBox1.Width-25;
    butt_top:=butt_top+menuButton.Height;
    menuButton.Top:=i*50;
    menuButton.Font.Size:=12;
    menuButton.Caption:=List_menu.Strings[i];
    menuButton.OnClick := Form1.Button1Click;
    menuButton.Width:=Form1.ScrollBox1.Width;
    menuButton.Tag:=i;
 end;
 List_menu.Free;
 end;
Вызываю функцию так
Код:
  if FileExists(TButton(Sender).Caption+'.txt') then 
  begin
  Loadmenu(TButton(Sender).Caption+'.txt');
  end;
Еще не пойму почему в чем прикол, например создается 6 кнопок, а ShowMessage(IntToStr(Form1.ScrollBo x1.ControlCount)) выдает, что 7 компонентов.
Пробовал for i:= Form1.ScrollBox1.ControlCount - 1 downto 0 do сразу ошибка вылетает
Объясните пожалуйста в чем ошибка, и как правильно удалить все созданные компоненты из ScrollBox1
dsbv вне форума Ответить с цитированием
Старый 16.04.2019, 10:59   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В том боксе похоже еще что-то есть:
Код:
for i:= Form1.ScrollBox1.ControlCount - 1 downto 0 do
  if Form1.ScrollBox1.Controls[i] is TButton then TButton(Form1.ScrollBox1.Controls[i]).Free;
owner не помешает задать:
Код:
 menuButton:=TButton.Create(Form1.ScrollBox1);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.04.2019, 11:15   #3
dsbv
Пользователь
 
Регистрация: 21.03.2019
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В том боксе похоже еще что-то есть:
Код:
for i:= Form1.ScrollBox1.ControlCount - 1 downto 0 do
  if Form1.ScrollBox1.Controls[i] is TButton then TButton(Form1.ScrollBox1.Controls[i]).Free;
owner не помешает задать:
Код:
 menuButton:=TButton.Create(Form1.ScrollBox1);
Спасибо! menuButton:=TButton.Create(Form1.Sc rollBox1); решило проблему
is это проверка на потомка? Буду знать теперь
dsbv вне форума Ответить с цитированием
Старый 22.04.2019, 11:12   #4
dsbv
Пользователь
 
Регистрация: 21.03.2019
Сообщений: 20
По умолчанию

Кнопки создаются
Код:
Function Loadmenu(file_name : String) : String;
var
 List_menu: TStringList;
 i,butt_top:Integer;
 begin
 List_menu:= TStringList.Create;
 List_menu.LoadFromFile(file_name);
 for i := 0 to List_menu.Count - 1 do
 begin
    menuButton:=TButton.Create(Form1.ScrollBox1);
    menuButton.Parent:=Form1.ScrollBox1;
    menuButton.Height:=40;
    menuButton.Width:=Form1.ScrollBox1.Width-25;
    butt_top:=butt_top+menuButton.Height;
    menuButton.Top:=i*50;
    menuButton.Font.Size:=12;
    menuButton.Caption:=List_menu.Strings[i];
    menuButton.OnClick := Form1.Button1Click;
    menuButton.Width:=Form1.ScrollBox1.Width;
 end;
 List_menu.Free;
 end;
И удаление этих кнопок, вынесенное в отдельное событие тоже работает
Код:
procedure TForm1.But_delClick(Sender: TObject);
var
i:Integer;
begin
 for i:= Form1.ScrollBox1.ControlCount - 1 downto 0 do
 if Form1.ScrollBox1.Controls[i] is TButton then
 TButton(Form1.ScrollBox1.Controls[i]).Free;
end;
А вот если совместить в одну функцию удаление и создание новых кнопок, то никак(((
Код:
Function Loadmenu(file_name : String) : String;
var
 List_menu: TStringList;
 i,butt_top:Integer;
 begin
if Form1.ScrollBox1.ControlCount<>0 then
 begin
 for i:= Form1.ScrollBox1.ControlCount - 1 downto 0 do
 if Form1.ScrollBox1.Controls[i] is TButton then
 TButton(Form1.ScrollBox1.Controls[i]).Free;
 end;

 List_menu:= TStringList.Create;
 List_menu.LoadFromFile(file_name);
 for i := 0 to List_menu.Count - 1 do
 begin
    menuButton:=TButton.Create(Form1.ScrollBox1);
    menuButton.Parent:=Form1.ScrollBox1;
    menuButton.Height:=40;
    menuButton.Width:=Form1.ScrollBox1.Width-25;
    butt_top:=butt_top+menuButton.Height;
    menuButton.Top:=i*50;
    menuButton.Font.Size:=12;
    menuButton.Caption:=List_menu.Strings[i];
    menuButton.OnClick := Form1.Button1Click;
    menuButton.Width:=Form1.ScrollBox1.Width;
 end;
 List_menu.Free;
 end;
Уже мозги кипят (((
dsbv вне форума Ответить с цитированием
Старый 22.04.2019, 11:20   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А этот Loadmenu какой Form1 использует, соответствует ли он нужному экземпляру окна? Как окно создаетcя?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.04.2019, 12:54   #6
dsbv
Пользователь
 
Регистрация: 21.03.2019
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А этот Loadmenu какой Form1 использует, соответствует ли он нужному экземпляру окна? Как окно создаетcя?
Всего одно окно Form1
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
if FileExists(trim(TButton(Sender).Cap tion)+'.txt') then //если файл существует
begin
Loadmenu(trim(TButton(Sender).Capti on)+'.txt');
end;
//ScrollBox1.VertScrollBar.Position:= 0;
//ShowScrollBar(ScrollBox1.Handle, SB_VERT, False);
end;

Последний раз редактировалось dsbv; 22.04.2019 в 12:57.
dsbv вне форума Ответить с цитированием
Старый 22.04.2019, 14:39   #7
dsbv
Пользователь
 
Регистрация: 21.03.2019
Сообщений: 20
По умолчанию

если в функции заменить вот эту конструкцию
Код:
{ if Form1.ScrollBox1.ControlCount <> 0 then
 begin
 for i:= Form1.ScrollBox1.ControlCount - 1 downto 0 do
 begin
 if Form1.ScrollBox1.Controls[i] is TButton then
 TButton(Form1.ScrollBox1.Controls[i]).Free;
 end;
 end; }
На вот такую
Код:
if Form1.ScrollBox1.ControlCount <> 0 then
 begin
  for i:= Form1.ScrollBox1.ControlCount - 1 downto 0 do
  Form1.ScrollBox1.RemoveControl(Form1.ScrollBox1.Controls[i]);
 end;
То вроде как бы и работает, но как узнать освобождается ли оперативка и вообще не пойму с этими контролами в чем разница между Controls[i].Free и RemoveControl. Может правильнее будет при создании кнопок, создавать TObjectList и очищать его по надобности?
dsbv вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взаимодействие динамически созданных кнопок Rilmeer Помощь студентам 5 07.06.2013 13:51
обработчик динамически созданных кнопок andir Общие вопросы Delphi 5 02.03.2013 18:11
Обработка событий для динамически создаваемых Textbox ninabegin C# (си шарп) 0 01.06.2012 22:18
Проверка Caption динамически создаваемых TabSheet Молоток Компоненты Delphi 2 07.04.2011 12:28