Перейти к содержанию
  • Регистрация
  • 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 пользователей онлайн

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

×
×
  • Создать...