Перейти к содержанию
Fire Monkey от А до Я
  • 0

Удаление динамически созданных компонентов


Aleks133

Вопрос

Уже замучался, помогите.

Вот так создаю окошко в котором поле ввода тескста и кнопка.

procedure TForm1.Label2Click(Sender: TObject);
var
  brect: TRectangle;
  edt: TEdit;
  btn: TButton;
  lb: TLabel;
begin
  brect := TRectangle.Create(Form1);
  brect.Parent := Form1;
  brect.Width := 200;
  brect.Height := 200;
  brect.Fill.Color := TAlphacolors.Red;
  brect.Align := TAlignLayout.Center;
  brect.Name := 'showrect';
  lb := TLabel.Create(brect);
  lb.Parent := brect;
  lb.Align := TAlignLayout.Top;
  lb.Name := 'showlb';
  lb.Text := 'Введите коментарий';
  lb.TextSettings.Font.Size := 20;
  edt := TEdit.Create(brect);
  edt.Parent := brect;
  edt.Align := TAlignLayout.Center;
  edt.Width := brect.Width;
  edt.Name := 'showedt';
  btn := TButton.Create(brect);
  btn.Parent := brect;
  btn.Width := 50;
  btn.Height := 30;
  btn.Align := TAlignLayout.Bottom;
  btn.Text := 'OK';
  btn.Name := 'showbtn';
  btn.OnClick := ok;

end;

Вот так присваиваю результат ввода и удаляю объекты.

procedure TForm1.ok(Sender: TObject);
begin
  Label2.Text := ((Form1.FindComponent('showrect') as TRectangle)
    .FindComponent('showedt') as TEdit).Text;
  (Form1.FindComponent('showrect') as TRectangle).DestroyComponents;\\удаляю сначала компоненты на showrect
  (Form1.FindComponent('showrect') as TRectangle).Parent := NIL; \\потом удаляю сам showrect
  (Form1.FindComponent('showrect') as TRectangle).Release;

end;

Все вроде нормально, но после того как нажимаю на кнопку(showbtn) форма не закрывается(на крестик ) и даже не могу переместить окно формы пока я не кликну на любой компонент на этой форме кроме самой формы(edit, кнопка и т.п).

А если сделать все тоже самое только через таймер,т.е таймер будет убивать компоненты, то все работает как надо.

Может причина была в том что кнопка поторая убивала компоненты , не должна была убивать и саму себя? 

Изменено пользователем Aleks133
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
21 час назад, #WAMACO сказал:

Что? Опять? Сериал. Новый сезон. "Убийство кнопок" :))

))))Пока не сериал,но к этому идет.Пока только затянувшийся фильмец.))Причем в котором я пока не могу разгадать сюжет.

Если есть чем помочь по теме,буду премного благодарен.

Ссылка на комментарий
  • 0
14 часов назад, Aleks133 сказал:

))))Пока не сериал,но к этому идет.Пока только затянувшийся фильмец.))Причем в котором я пока не могу разгадать сюжет.

Если есть чем помочь по теме,буду премного благодарен.

Ну поиск по форуму не работает...

Жевали на 3 страницы

 

Ссылка на комментарий
  • 0

Во-первых, откройте для себя фреймы ))

Во-вторых убивать себя из обработчика себя нельзя, да и не нужно (см п.1)

В качестве костыля.

1. Создавайте все с Owner=NIL2.

2. 

TTask.Run(procedure begin

  tthread.synchronize(nil, procedure begin

     KILLTHEMALL();

  end);

end)

 

Ссылка на комментарий
  • 0
В 16.09.2019 в 20:34, Aleks133 сказал:

  (Form1.FindComponent('showrect') as TRectangle).DestroyComponents;\\удаляю сначала компоненты на showrect
  (Form1.FindComponent('showrect') as TRectangle).Parent := NIL; \\потом удаляю сам showrect
  (Form1.FindComponent('showrect') as TRectangle).Release;

уберите первые две строки... попробуйте... должно заработать.

Ссылка на комментарий
  • 0
43 минуты назад, slav_z сказал:

уберите первые две строки... попробуйте... должно заработать.

Спасибо, так работает. Это по тому принципу что если удаляешь компонент то и удаляется то что на нем?

А почему тогда здесь все работает нормально?

procedure TForm1.Button29Click(Sender: TObject);
var
  i, j: integer;
  aImage: TImage;
  aRect: TRectangle;
begin
  Layout4.BeginUpdate;
  try
    // for j := 0 to 30 do
    // if Layout4.FindComponent('img' + inttostr(j)) <> nil then
    // Layout4.FindComponent('img' + inttostr(j)).Free;
    Layout4.DestroyComponents;
    for i := 0 to ListBox1.Items.Count - 1 do
    begin
      aRect := TRectangle.Create(Layout4);
      aRect.Parent := Layout4;
      aRect.Position.X := Layout4.Width;
      aRect.Position.Y := 0;
      aRect.Align := TAlignLayout.Left;
      aRect.Stroke.Kind := TBrushKind.None;
      aRect.Fill.Color := TAlphacolors.Null;
      aRect.Height := 50;
      aRect.Width := 50;
      aRect.Margins.Left := 0;
      aRect.Margins.Top := 0;
      aRect.Margins.Right := 0;
      aRect.Name := 'rect' + i.ToString;
      aRect.Tag := i;
      aRect.OnClick := rectClick;

      aImage := TImage.Create(aRect);
      aImage.Parent := aRect;
      aImage.Align := TAlignLayout.Client;
      aImage.HitTest := false;
      aImage.Name := 'img' + i.ToString;
      aImage.Bitmap.Assign(dm.ImageList1.Bitmap(aImage.Size.Size,
        ListBox1.ListItems.ImageIndex));
      aImage.Tag := i;
      Layout4.Width := Layout4.Width + 50;
    end;
  finally
    Layout4.EndUpdate;
  end;
end;

Ссылка на комментарий
  • 0
14 минут назад, Aleks133 сказал:

А почему тогда здесь все работает нормально?

ну здесь же Button29 не разрушается... тыкая по кнопке будут проблемы если убивается сам элемент по которому тыкать...

Ссылка на комментарий
  • 0
11 часов назад, krapotkin сказал:

Во-первых, откройте для себя фреймы ))

Во-вторых убивать себя из обработчика себя нельзя, да и не нужно (см п.1)

В качестве костыля.

1. Создавайте все с Owner=NIL2.

2. 


TTask.Run(procedure begin

  tthread.synchronize(nil, procedure begin

     KILLTHEMALL();

  end);

end)

 

Спасибо, смысл понял(почти), и то благодаря ссылке выше, только пока не понял как это все работает.

TTask.run я так понял это независимая процедура которая и может  удалить компоненты безболезненно(а tthread.synchronize делает ее еще безопасней?).

Вот только редактор ругается на  Ttask, может какой-то модуль надо подключить?

И я так и не понял откуда ее вызывать(( Из процедуры  btn.OnClick := ok;?

Извиняюсь за вопросы "чайника". Пишу можно сказать первый проект для себя, и в процессе осваиваю язык.Много чего становится понятным и станавится на свои места в понимании, но еще гораздо больше пока для меня дремучий лес. 

Ссылка на комментарий
  • 0
6 минут назад, slav_z сказал:

ну здесь же Button29 не разрушается... тыкая по кнопке будут проблемы если убивается сам элемент по которому тыкать...

ах да, точно, понял, спасибо.

Ссылка на комментарий
  • 0

смелее используйте F1

там будет описание метода и модуль где он находится System.Threading

запускается новый поток, который запускает процедуру в главном потоке

т.е. мы даем закончиться текущему методу и наше действие выполнится с гарантией после него

 

Ссылка на комментарий
  • 0
6 минут назад, krapotkin сказал:

смелее используйте F1

Да спасибо, я в основном читаю все на http://docwiki.embarcadero.com там и браузер мне все переводит на русский, а это

"там будет описание метода и модуль где он находится System.Threading" не доглядел.Спасибо.Будим учить дальше.

P.S Фреймы еще не успел посмотреть, чувствую интересная штука.))

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...