Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
DarkTinker23
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 15
#1

Не работает изменение , удаление динамических компонентов - Delphi

01.06.2017, 23:21. Просмотров 347. Ответов 23
Метки нет (Все метки)

Здравствуйте люди , после создание компонентов , их нельзя удалить и изменить.
Я пробовал использовать .free и .destroy - обе функции не действуют.
Как я понимаю после работы функции .free объекты должны удалятся и исчезать но в данном случае объекту пофигу (скриншоты предоставляю)
Не работает изменение , удаление динамических компонентов
Как мы видим на скриншоте ,есть заполненный массив pan.
Не работает изменение , удаление динамических компонентов
Но после работы функции .free , первая ячейка массив pan не удалилась.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2017, 23:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не работает изменение , удаление динамических компонентов (Delphi):

Удаление динамических компонентов
ребят, помогите, плиз! Суть вот в чем, динамически создаются шэйпы по клику...

Создание динамических компонентов
procedure ToolClick(Sender: TObject); var ToolRegistry: array of TTool;...

Массив динамических компонентов
Здрасте, создал массив динамических компонентов var Pict:array of TImage;...

Обработка динамических компонентов
Такая ситуация: в идеале я должен добавлять столбики в созданные таблицы, но...

5 динамических компонентов подряд = ошибка
Type TItem = record img:TDBImage; buy:TButton; ...

Stack overflow при создании динамических компонентов
Вот код procedure TForm1.Button5Click(Sender: TObject); begin createtelnet;...

23
DenNik
Непрофессионал
1783 / 1286 / 304
Регистрация: 26.07.2011
Сообщений: 7,532
01.06.2017, 23:33 #2
есть массив, состоящий из "ячеек", в каждой ячейке лежит ссылка на экземпляр некоего класса. ты удалил этот экземпляр. с какого перепугу ячейка должна удалиться? если непонятно, объясняю проще:

ты пришел в супермаркет, положил сумку в камеру хранения, потом достал ее (очистил ячейку). ячейка камеры хранения удаляется?
0
DarkTinker23
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 15
02.06.2017, 00:11  [ТС] #3
Цитата Сообщение от DenNik Посмотреть сообщение
есть массив, состоящий из "ячеек", в каждой ячейке лежит ссылка на экземпляр некоего класса. ты удалил этот экземпляр. с какого перепугу ячейка должна удалиться? если непонятно, объясняю проще:

ты пришел в супермаркет, положил сумку в камеру хранения, потом достал ее (очистил ячейку). ячейка камеры хранения удаляется?
Вы неправильно поняли , я имею виду не удаление ячейки , а удаление компонентов внутри ячейки .

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

Ну согласитесь , по моей логике - при использовании .free на ячейку то она хотя-бы должна очиститься .
0
GoodWeather
132 / 131 / 53
Регистрация: 28.02.2017
Сообщений: 764
02.06.2017, 00:25 #4
Цитата Сообщение от DarkTinker23 Посмотреть сообщение
после работы функции .free объекты должны удалятся
Освобождается память. Но не обязательно очищается. Грубо говоря помечается как свободная, но не обнуляется.
Делайте через FreeAndNil() или руками после Free() присваивайте nil элементу массива.

Добавлено через 8 минут
Наверное не совсем полно объяснил...
У вас pan[i] это указатель. Указывающий на объект. Да, вы удалили объект.
Но значение-то указателя хранящегося в pan[i] никто не обязан был менять. Теперь оно указывает на мусор.
Или так:
Delphi
1
2
pan[i].Free();
pan[i]:=nil;
Или так:
Delphi
1
FreeAndNil(pan[i]);
0
DarkTinker23
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 15
02.06.2017, 00:38  [ТС] #5
Цитата Сообщение от GoodWeather Посмотреть сообщение
Освобождается память. Но не обязательно очищается. Грубо говоря помечается как свободная, но не обнуляется.
Делайте через FreeAndNil() или руками после Free() присваивайте nil элементу массива.

Добавлено через 8 минут
Наверное не совсем полно объяснил...
У вас pan[i] это указатель. Указывающий на объект. Да, вы удалили объект.
Но значение-то указателя хранящегося в pan[i] никто не обязан был менять. Теперь оно указывает на мусор.
Или так:
Delphi
1
2
pan[i].Free();
pan[i]:=nil;
Или так:
Delphi
1
FreeAndNil(pan[i]);
На счет этого момента понял.
Но тут осталось конечная проблема .Послe FreeAndNil(pan[i]) на форме видна эта панелька и она даже "юзаема".
Как понимаю теперь нужно обновить форму но как это сделать?
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
02.06.2017, 09:28 #6
в VCL если вы компонент делаете Free, он уходит с формы
так что что-то не выполняется в вашей программе
0
DenNik
Непрофессионал
1783 / 1286 / 304
Регистрация: 26.07.2011
Сообщений: 7,532
02.06.2017, 09:33 #7
krapotkin, только что протестировал.
массив arr[0..1] of TPanel
создаю панель, все ок, для теста присваиваю ей заголовок. уничтожаю панель (Free), и... все так же могу прочитать заголовок без проблем! хотя панель с формы исчезла. мало того! сразу же после запуска программы я могу без проьлем обратиться к массиву
arr[1].Caption
и это не вызывает AV!
0
TFullControl
390 / 314 / 186
Регистрация: 20.10.2016
Сообщений: 1,010
02.06.2017, 09:37 #8
DarkTinker23, стоит проверить чему равно ваше i и что именно хранится в p[i] перед тем как вы делаете free,
думется вы удаляете не то, что после удаления проверяете.
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
02.06.2017, 09:42 #9
код?
у компонента есть Parent и Owner
Parent - это куда вложен компонент
Owner обычно форма
при таком раскладе все работает
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm2.btn1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to High(p) do
  begin
    FreeAndNil(p[i]);
  end;
end;
 
procedure TForm2.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 3 do
  begin
    p[i] := TPanel.Create(Self);
    p[i].parent:=pnl1;
    p[i].SetBounds(10,i*40, 200, 35);
  end;
end;


Добавлено через 1 минуту
вот обращение к caption проходит, это да
0
DenNik
Непрофессионал
1783 / 1286 / 304
Регистрация: 26.07.2011
Сообщений: 7,532
02.06.2017, 09:44 #10
Цитата Сообщение от krapotkin Посмотреть сообщение
p[i].parent:=pnl1;
что такое pnl1?
а если мой дин. компонент лежит на форме? у меня Parent:= self;

Добавлено через 1 минуту
Цитата Сообщение от krapotkin Посмотреть сообщение
вот обращение к caption проходит, это да
почему? получается, объект в памяти продолжает жить?
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
02.06.2017, 11:28 #11
никто не затирал это место. ссылка в память рабочая ведь.
будет что-то более сложное, получим АВ

pnl1 это другая панель. какая разница?

Добавлено через 47 секунд
можно добавить панелям брейк в деструкторе и узнать, уничтожены они или нет
0
DarkTinker23
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 15
02.06.2017, 12:21  [ТС] #12
Цитата Сообщение от krapotkin Посмотреть сообщение
в VCL если вы компонент делаете Free, он уходит с формы
так что что-то не выполняется в вашей программе
Упс , в этом и проблема у меня не VCL , у меня Multi-Device (FireMonkey);

И да Pan[I]-Очищается если смотреть по коду
Не работает изменение , удаление динамических компонентов
Не работает изменение , удаление динамических компонентов

Но в визуальной части ничего не меняется .
0
DenNik
Непрофессионал
1783 / 1286 / 304
Регистрация: 26.07.2011
Сообщений: 7,532
02.06.2017, 13:33 #13
Цитата Сообщение от krapotkin Посмотреть сообщение
узнать, уничтожены они или нет
нет! после Free я спокойно читаю Caption и он тот же, который был на панели при жизни
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
02.06.2017, 13:51 #14
Цитата Сообщение от DarkTinker23 Посмотреть сообщение
меня Multi-Device (FireMonkey);
вообще-то это первое с чего нужно было начинать. Там другая концепция. И этот вопрос тоже уже обсосан со всех сторон
читайте теорию
http://yaroslavbrovin.ru/object_life...indows_osx-ru/
http://yaroslavbrovin.ru/object_life...ndroid_ios-ru/

Цитата Сообщение от DenNik Посмотреть сообщение
я спокойно читаю
еще раз. никакие ссылки и данные в памяти не изменились просто из-за вызова деструктора.
вот если немного поработать чтобы память засралась, и потом обратиться к этому месту, там возможно уже будет что-то другое
0
DenNik
Непрофессионал
1783 / 1286 / 304
Регистрация: 26.07.2011
Сообщений: 7,532
02.06.2017, 14:04 #15
Цитата Сообщение от krapotkin Посмотреть сообщение
никакие ссылки и данные в памяти не изменились просто из-за вызова деструктора.
1. а на кой тогда нужен деструктор? )

2. действительно, если обращаться к свойству Caption не созданного/уничтоженного компонента, то никаких AV нет, а вот обращение к Name уже вызывает AV
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
02.06.2017, 14:16 #16
деструктор финализирует динамические массивы и строки, сдает память менеджеру памяти,
у компонентов вызывает механизмы Notify, где отцепляется от Parent и Owner
0
DarkTinker23
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 15
02.06.2017, 16:00  [ТС] #17
Цитата Сообщение от krapotkin Посмотреть сообщение
вообще-то это первое с чего нужно было начинать. Там другая концепция. И этот вопрос тоже уже обсосан со всех сторон
читайте теорию
http://yaroslavbrovin.ru/object_life...indows_osx-ru/
http://yaroslavbrovin.ru/object_life...ndroid_ios-ru/


еще раз. никакие ссылки и данные в памяти не изменились просто из-за вызова деструктора.
вот если немного поработать чтобы память засралась, и потом обратиться к этому месту, там возможно уже будет что-то другое
Огромное спасибо за статейки , но у меня все тот же вопрос.
Все в nill , но все видимо - этот момент не уточняется

Добавлено через 5 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
деструктор финализирует динамические массивы и строки, сдает память менеджеру памяти,
у компонентов вызывает механизмы Notify, где отцепляется от Parent и Owner
Ах да название вопроса - изменение , удаление

Я еще не могу разобраться с изменением компонентов в ячейках.
Изменения в визуальной части , например шрифт и тд.

Как я понимаю , нужно обновить форму , но как?
0
DenNik
Непрофессионал
1783 / 1286 / 304
Регистрация: 26.07.2011
Сообщений: 7,532
02.06.2017, 16:18 #18
Цитата Сообщение от DarkTinker23 Посмотреть сообщение
Изменения в визуальной части , например шрифт и тд.
какие проблемы?
Delphi
1
arr[1].Font.Name:= 'Verdana';
0
DarkTinker23
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 15
02.06.2017, 16:46  [ТС] #19
Цитата Сообщение от DenNik Посмотреть сообщение
какие проблемы?
Delphi
1
arr[1].Font.Name:= 'Verdana';
Название: 213215.PNG
Просмотров: 15

Размер: 575 байт
Не работает изменение , удаление динамических компонентов
Название: 51251.PNG
Просмотров: 15

Размер: 507 байт

Название меняется но например размер-неменяется
0
krapotkin
3294 / 2934 / 1015
Регистрация: 14.04.2014
Сообщений: 14,250
Записей в блоге: 13
02.06.2017, 16:52 #20
StyleElements ?

Добавлено через 41 секунду
Цитата Сообщение от DarkTinker23 Посмотреть сообщение
Все в nill , но все видимо - этот момент не уточняется
где код?
0
02.06.2017, 16:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2017, 16:52
Привет! Вот еще темы с решениями:

Нет связи консольного приложения с событиям динамических компонентов
Люди как связать событие с компонентом ? program Project1; {$APPTYPE...

Удаление динамических объектов / полная очистка формы
Уважаемые, подскажите: На форме динамически создаются несколько десятков...

Изменение размеров компонентов
На форме есть пару компонентов (RichEdit, WebBrauser, Panel) Нужно сделать...

Удаление компонентов
Доброго времени суток, такая проблема, как удалить программно все созданные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru