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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2015, 06:43   #1
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
Печаль Не удаётся удалить динамически созданный компонент

Я создаю динамически компонент, и в нём ещё несколько компонентов:
вот код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  gb: TGroupBox;
  w,j,m: integer;
begin
  gb := TGroupBox.Create(ScrollBox1);
  m:=0;
  with gb do
  try
    Parent := ScrollBox1;
    Align := alTop;
    Parentcolor := false;
    ParentBackground := false;
    Color := clSkyBlue;
    Top := x*gb.Height;

    for j:=0 to ScrollBox1.componentcount-1 do
      if (ScrollBox1.Components[j] is TGroupBox)and((ScrollBox1.Components[j] as TGroupBox).Visible=True) then
      begin
        m:=m+1;
      end;

    Caption := 'Вопрос №'+IntToStr(m);
    Name := 'BigGroupBox'+IntToStr(x);
    Font.Charset := DEFAULT_CHARSET;
    Font.Name := 'Calibri';
    Font.Size := 11;
    Font.Style := [fsBold];

    with TEdit.Create((FindComponent(Format('GroupBox%d',[x])) as TGroupBox)) do
    try
      Parent :=  gb;
      Name := 'BigEdit'+IntToStr(x);
      left := 14;
      top := 24;
      width := gb.Width-28;
      height := 21;
      anchors := [akLeft,akTop,akRight];
      text := '';
    except
      ShowMessage('Что то пошло не так в Edit-е');
    end;

    with TButton.Create((FindComponent(Format('GroupBox%d',[x])) as TGroupBox)) do
    try
      Parent := gb;
      Name := 'BigButton'+IntToStr(x);
      left := gb.Width-84;
      top := 60;
      width := 70;
      height := 24;
      anchors := [akTop,akRight];
      Caption := 'Удалить';
      onClick := ComDel;
    except
      ShowMessage('Что то пошло не так в Button-е');
    end;

    with TCheckBox.Create((FindComponent(Format('GroupBox%d',[x])) as TGroupBox)) do
    try
      Parent := gb;
      Name := 'BigCheckBox'+IntToStr(x);
      left := 14;
      top := 60;
      Caption := 'Правильный ответ';
      width := 185;
      anchors := [akTop,akleft];
    except
      ShowMessage('Что то пошло не так в Button-е');
    end;

    with TEdit.Create((FindComponent(Format('GroupBox%d',[x])) as TGroupBox)) do
    try
      Parent := gb;
      Name := 'BigEdit'+IntToStr(x+1);
      left := 310;
      top := 54;
      Text := '';
      width := 30;
      anchors := [akTop,akleft];
      onKeyPress := KeyPr;
    except
      ShowMessage('Что то пошло не так в Button-е');
    end;

    x:=x+1;

  except
    ShowMessage('Что то пошло не так в ScrollBox-е');
  end;

  ScrollBox1.VertScrollBar.Position := x*gb.Height;

end;
Всё работает нормально. Но мне ещё нужно удалить компонент... А вот с этим уже проблемы начинаются ....
Вот мой код на удаление компонента:
Код:
procedure TForm1.ComDel(Sender: TObject);
var
  q, s: string;
  j,m,yy: integer;
  c: TComponent;
  d: TControl;
begin
  try
    q := StringReplace(TButton(Sender).Name,'Button','GroupBox',[rfReplaceAll,rfIgnoreCase]);

    for j:=0 to ScrollBox1.componentcount-1 do
    if (ScrollBox1.Components[j] is TGroupBox)and((ScrollBox1.Components[j] as Tgroupbox).Name=q) then
    begin
      (ScrollBox1.Components[j] as Tgroupbox).Parent := nil;
      (ScrollBox1.Components[j] as Tgroupbox).FreeOnRelease;
      (ScrollBox1.Components[j] as Tgroupbox).Visible := False;
    end;

    m:=1;
    for j:=0 to ScrollBox1.componentcount-1 do
    if ((ScrollBox1.Components[j] is TGroupBox)and((ScrollBox1.Components[j] as TGroupBox).Visible=True)) then
    begin
      (ScrollBox1.Components[j] as Tgroupbox).caption:='Вопрос №'+inttostr(m);
      m:=m+1;
    end;

  except
    ShowMessage('Что то пошло не так!');
  end;
end;

ВООБЩЕ НИКАК НЕ УДАЛЯЕТ КОМПОНЕНТ

В принципе, вот часть кода удаления...
Код:
      (ScrollBox1.Components[j] as Tgroupbox).Parent := nil;
      (ScrollBox1.Components[j] as Tgroupbox).FreeOnRelease;
      (ScrollBox1.Components[j] as Tgroupbox).Visible := False;
Условие Visible := False мне пришлось дописать, т.к. это хоть каким то образом скрывало "удалённые" компоненты ...
Потому что, если использовать только:
Код:
      (ScrollBox1.Components[j] as Tgroupbox).Parent := nil;
      (ScrollBox1.Components[j] as Tgroupbox).FreeOnRelease;
компоненты пропадали, но я всё равно мог к ним обратиться ....
Я вынужден был прийти к такому методу .....
Вот в общем то и вопрос, как правильно то, удалить динамически созданный компонент ?
Я использовал многие варианты:
1) Free 2) Destroy 3)FreeAndNull
Ничего не помогает ....
на Free он выдаёт вообще ошибку памяти ...
С Destroy и FreeAndNull, вообще ничего не происходит ....
В общем, я в отчаянии ... Помогите ...
Janger вне форума Ответить с цитированием
Старый 26.06.2015, 10:37   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
ВООБЩЕ НИКАК НЕ УДАЛЯЕТ КОМПОНЕНТ
А у меня, почему-то, всё удаляется, как надо. Странно... Что я делаю не так?

Поиграйся, поищи , где я ошибся.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 26.06.2015, 10:42   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

чтобы не писать свои компоненты, НО иметь возможность создавать свои много компонентные заготовки для много разового использования (в том числе быстрого многочисленного добавления на форму придуманы фреймы(TFrame)

http://programmersforum.ru/showthrea...39#post1103039
http://programmersforum.ru/showthrea...09#post1213609
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 26.06.2015, 10:44   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
чтобы не писать свои компоненты, НО иметь возможность создавать свои много компонентные заготовки для много разового использования (в том числе быстрого многочисленного добавления на форму придуманы фреймы(TFrame)
СогласенЪ.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 26.06.2015, 11:55   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
В принципе, вот часть кода удаления...
(ScrollBox1.Components[j] as Tgroupbox).Parent := nil;
(ScrollBox1.Components[j] as Tgroupbox).FreeOnRelease;
(ScrollBox1.Components[j] as Tgroupbox).Visible := False;
Первая и третья строчки не нужны. Вторая из другой оперы. Так что ес-сно никакого удаления.
northener вне форума Ответить с цитированием
Старый 29.06.2015, 08:16   #6
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Попробуйте так
Код:
 for j:= ScrollBox1.componentcount-1 downto 0 do // здесь наоборот с конца поиск делать нужно иначе ошибка 
    if (ScrollBox1.Components[j] is TGroupBox)and((ScrollBox1.Components[j] as Tgroupbox).Name=q) then
    begin
      (ScrollBox1.Components[j] as Tgroupbox).Free;
    end;
Aliens_wolfs вне форума Ответить с цитированием
Старый 29.06.2015, 10:20   #7
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
(ScrollBox1.Components[j] as Tgroupbox).FreeOnRelease;
(ScrollBox1.Components[j] as Tgroupbox).Visible := False;
автор, я или что-то недопонимаю или недоглядел.
Вы сначала пытаетесь удалить компонент, а потом "пустоту" гасите Visible := False?
может всё таки сначала
TGroupBox(ScrollBox1.Components[j]).Visible := False;
а после этого
TGroupBox(ScrollBox1.Components[j]).Free; ?
или я не правильно понимаю вопрос....
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 29.06.2015, 10:24   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
автор, я или что-то недопонимаю или недоглядел.
Я тоже не понимаю, почему бы автору не воспользоваться моим (хорошим) вариантом?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.06.2015, 10:35   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Я тоже не понимаю, почему бы автору не воспользоваться моим (хорошим) вариантом?
Минай, человек может разбирается. Обрати внимание на стиль его кода... видимо будет разбираться какое то время
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 29.06.2015, 10:41   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

По ходу в предыдущем посте я был прав.
Спецом создал примочку и проверил код автора.
Поменял местами вышеуказаные строчки, всё удаляется
Вложения
Тип файла: zip delcmp.zip (214.6 Кб, 17 просмотров)
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически созданный TDBLookUpComboBox Scorpuha БД в Delphi 13 16.01.2014 19:59
Обработчик на динамически созданный компонент lexo Общие вопросы Delphi 5 01.06.2013 20:27
Перетаскиавние формы за динамически созданный компонент MyIE Общие вопросы Delphi 1 10.10.2010 11:15
Динамически созданный обьект, процедуры heart Общие вопросы Delphi 3 09.05.2009 17:32
Динамически созданный tabSheet S@fer Общие вопросы Delphi 7 08.04.2009 12:03