Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Злобный Зайц
11 / 11 / 1
Регистрация: 21.10.2010
Сообщений: 414
1

Программное удаление массива компонентов

03.01.2013, 19:27. Просмотров 713. Ответов 17
Метки нет (Все метки)

Delphi
1
2
3
4
5
6
7
8
9
 var StrGr: array of TstringGrid;
...............
  if Button=mbRight then
  begin
    i:=Length(StrGr)-1;
    for i:=i downto 0 do  StrGr[i].Destroy;
    StrGr:=nil;
    Exit;
  end;
Правильно ли будет так, или nil должен быть для каждого члена массива отдельно?

Попутно ещё вопрос: Когда я удаляю программно созданные стринггриды нажатием на крестик, очищается ли память, или надо ещё что-то делать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2013, 19:27
Ответы с готовыми решениями:

Программное удаление компонентов
На форме программно создается несколько Label-ов(массив Label-ов).Как...

Программное выравнивание компонентов на форме
Задача программно разместить на форме несколько Memo. Располагаться они должны...

Программное удаление TLabel
всем привет, я программно по нажатию кнопки сделал, чтобы создавались label и...

Программное удаление вкладок PageControl
Уважаемые программисты помогите пожалуйста. Как удалять закладки TabSheet в...

Программное удаление компонента label
Здравствуйте. У меня возникла проблема и не знаю как её решить. procedure...

17
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
03.01.2013, 19:36 2
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
for i:=i downto 0 do
Что это за хрень ? Особенно i:=i ?
Чем
Код
for i:=0 to Length(StrGr)-1 do
не устроил ?
0
Злобный Зайц
11 / 11 / 1
Регистрация: 21.10.2010
Сообщений: 414
03.01.2013, 19:42  [ТС] 3
Подумалось, что если будет
Delphi
1
for i:=0 to Length(StrGr)-1
то в каждой итерации будет вычистяться Length(StrGr).
Возможно, что глупость, но проблема-то не в этом, мне бы по существу вопроса бы чего-нибудь получить. Можно ли грохнуть весь массив одним ударом?
0
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
03.01.2013, 19:48 4
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
то в каждой итерации будет вычистяться
Это банальное незнание азов Паскаля.


Цитата Сообщение от Злобный Зайц Посмотреть сообщение
по существу вопроса бы чего-нибудь
А не будет ничего по существу.
Хотя бы потому что фрагмент кода тобой вырван из умалчиваемого контекста. А именно от него зависит правильность выбора того или иного решения.
0
Злобный Зайц
11 / 11 / 1
Регистрация: 21.10.2010
Сообщений: 414
03.01.2013, 19:54  [ТС] 5
Нудык, я же и не утверждаю, что я крутой знаток основ Паскаля. Потому и вопросы задаю. Если дурацкие - дык уж простите великодушно. Я имел в виду - можно ли всему массиву СКОПОМ присвоить nil, или надо каждому члену отдельно. Массив состоит из компонентов TStringGrid.
0
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
03.01.2013, 20:01 6
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
можно ли всему массиву СКОПОМ присвоить nil, или надо каждому члену отдельно
И так можно и эдак. А можно и вообще никак.
Все зависит от дальнейшего использования этого массива.
0
Lirrk
Заблокирован
03.01.2013, 20:11 7
А я то наивно полагал, что компонент уничтожают свойством free. А так... вы обнулите только указатель, но выделенная под компонент память останется. И да, нужно в цикле каждый компонент освободить.
0
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
03.01.2013, 20:13 8
Lirrk
Не надо нести ересь и ахинею.
0
Lirrk
Заблокирован
03.01.2013, 20:31 9
Уважаемый mss,
учите матчасть
http://www.delphisources.ru/pages/faq/faq_delphi_basics/Nil.php.html
Компоненты нужно освободить свойством Free. Так что ахинею несёте вы. и вообще отцепитесь от меня.
0
Злобный Зайц
11 / 11 / 1
Регистрация: 21.10.2010
Сообщений: 414
03.01.2013, 20:35  [ТС] 10
То есть, если я всё правильно понял, то массив так можно убивать?

Теперь по ходу дела возник следующий вопрос. Не хочется ради него новую тему начинать. Вопрос вот какой: В свойстве OnSelectCell этих программно-созданных стринггридов я прописал свою процедуру. При клике на клеточку стринггрида получаю номер строки и номер столба. А вот как быть с номером члена массива? Как мне в OnSelectCell, допустим, выделить кликнутую клеточку? Как узнать, какому члену массива принадлежит кликнутая ячейка?
0
Lirrk
Заблокирован
03.01.2013, 20:40 11
Злобный Зайц,
через Sender
А статический массив вы не уничтожите никак. Память под него выделилась уже при описании. Уничтожить можно только динамический массив, присвоив ему размер ноль.
0
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
03.01.2013, 20:40 12
Мотай на ус:

1. Free - не свойство, а метод класса.
2. ТС вызывает метод Destroy для каждого объекта, ссылка на который хранится в элементе массива, что и есть метод разрушения ("освобождения") объекта.
3. Обнуление указателя нужно только там где оно действительно нужно.
0
Злобный Зайц
11 / 11 / 1
Регистрация: 21.10.2010
Сообщений: 414
03.01.2013, 20:42  [ТС] 13
Цитата Сообщение от Lirrk Посмотреть сообщение
Злобный Зайц,
через Sender
Если не трудно, поясните пожайлуста, как именно это сделать?
0
mss
2632 / 2257 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
03.01.2013, 20:43 14
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
массив так можно убивать?
Можно и не убивать, если он локальный.
Вполне возможно что и массив-то этот вообще не нужен.
0
Злобный Зайц
11 / 11 / 1
Регистрация: 21.10.2010
Сообщений: 414
03.01.2013, 20:45  [ТС] 15
На счёт сендера подскажите, пожайлуста!
0
Lirrk
Заблокирован
03.01.2013, 21:12 16
mss,
без вас знаю что метод. Это не существенно.

Добавлено через 7 минут
Про sender написано тут http://www.delphi-manual.ru/sender.php
0
Злобный Зайц
11 / 11 / 1
Регистрация: 21.10.2010
Сообщений: 414
03.01.2013, 21:26  [ТС] 17
Я, конечно, понимаю, что вам друг с другом собачиться интереснее, чем на мои вопросы отвечать. Но, может быть снизойдёте до простого крестьянина? Очень нужно! Ответьте, пожалуйста - как мне добраться до кликнутой ячейки программно созданного StringGrid?
0
Lirrk
Заблокирован
03.01.2013, 22:13 18
Злобный Зайц,
Я же дал ссылку на статью. неужели мне рассказывать тоже самое?

Добавлено через 32 минуты
Ну вот щёлкнули вы по ячейке. в обработчике щелчка запускаете цикл проверки

if Sender = StrGr[i] then begin //Номер компонента
X:=StrGr[i].row; // Номер строки
Y:= StrGr[i].col; // Номер стобца
Break;
end;
0
03.01.2013, 22:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2013, 22:13

Программное удаление Label. Исправить ошибку в коде
Подскажите пожалуйста, почему при удалении label возникает ошибка? ...var...

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

Динамическое удаление компонентов
есть 2 масива TabSheet: array of TTabSheet; Memo: array of TMemo; в...


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

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

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