Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
 
DarkTinker23
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 15
#1

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

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

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

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

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

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

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

5 динамических компонентов подряд = ошибка - Delphi
Type TItem = record img:TDBImage; buy:TButton; name,aboute,price:TDBText; Width,height:integer; end; var F_Main:...

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

23
DenNik
Непрофессионал
1578 / 1110 / 174
Регистрация: 26.07.2011
Сообщений: 6,740
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
131 / 130 / 41
Регистрация: 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
2767 / 2643 / 673
Регистрация: 14.04.2014
Сообщений: 12,707
Записей в блоге: 7
02.06.2017, 09:28 #6
в VCL если вы компонент делаете Free, он уходит с формы
так что что-то не выполняется в вашей программе
0
DenNik
Непрофессионал
1578 / 1110 / 174
Регистрация: 26.07.2011
Сообщений: 6,740
02.06.2017, 09:33 #7
krapotkin, только что протестировал.
массив arr[0..1] of TPanel
создаю панель, все ок, для теста присваиваю ей заголовок. уничтожаю панель (Free), и... все так же могу прочитать заголовок без проблем! хотя панель с формы исчезла. мало того! сразу же после запуска программы я могу без проьлем обратиться к массиву
arr[1].Caption
и это не вызывает AV!
0
TFullControl
302 / 300 / 134
Регистрация: 20.10.2016
Сообщений: 966
02.06.2017, 09:37 #8
DarkTinker23, стоит проверить чему равно ваше i и что именно хранится в p[i] перед тем как вы делаете free,
думется вы удаляете не то, что после удаления проверяете.
0
krapotkin
2767 / 2643 / 673
Регистрация: 14.04.2014
Сообщений: 12,707
Записей в блоге: 7
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
Непрофессионал
1578 / 1110 / 174
Регистрация: 26.07.2011
Сообщений: 6,740
02.06.2017, 09:44 #10
Цитата Сообщение от krapotkin Посмотреть сообщение
p[i].parent:=pnl1;
что такое pnl1?
а если мой дин. компонент лежит на форме? у меня Parent:= self;

Добавлено через 1 минуту
Цитата Сообщение от krapotkin Посмотреть сообщение
вот обращение к caption проходит, это да
почему? получается, объект в памяти продолжает жить?
0
krapotkin
2767 / 2643 / 673
Регистрация: 14.04.2014
Сообщений: 12,707
Записей в блоге: 7
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
Непрофессионал
1578 / 1110 / 174
Регистрация: 26.07.2011
Сообщений: 6,740
02.06.2017, 13:33 #13
Цитата Сообщение от krapotkin Посмотреть сообщение
узнать, уничтожены они или нет
нет! после Free я спокойно читаю Caption и он тот же, который был на панели при жизни
0
krapotkin
2767 / 2643 / 673
Регистрация: 14.04.2014
Сообщений: 12,707
Записей в блоге: 7
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
Непрофессионал
1578 / 1110 / 174
Регистрация: 26.07.2011
Сообщений: 6,740
02.06.2017, 14:04 #15
Цитата Сообщение от krapotkin Посмотреть сообщение
никакие ссылки и данные в памяти не изменились просто из-за вызова деструктора.
1. а на кой тогда нужен деструктор? )

2. действительно, если обращаться к свойству Caption не созданного/уничтоженного компонента, то никаких AV нет, а вот обращение к Name уже вызывает AV
0
02.06.2017, 14:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2017, 14:04
Привет! Вот еще темы с ответами:

Нет связи консольного приложения с событиям динамических компонентов - Delphi
Люди как связать событие с компонентом ? program Project1; {$APPTYPE CONSOLE} {$R *.res} uses Winapi.Windows,...

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

Изменение размеров компонентов - Delphi
На форме есть пару компонентов (RichEdit, WebBrauser, Panel) Нужно сделать чтобы при измении формы (растягивании, развёртывании и т.п)...

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


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

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

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