Консультация № 54938
10.09.2006, 18:30
0.00 руб.
0 10 1
Здравствуйте уважаемые эксперты!!!
Создаю компонент Edit методом Create, присваиваю ему имя Edit.Name:=’Step1’, освобождаю память методом Free. Затем с помощью FindComponent(‘Step1’) нахожу его и произвожу конкретные действия, например, считываю свойство Text.
Создаю второй компонент Edit, присваиваю ему имя Step1 – ошибка, что делать в этом случае, не прибегая к другому имени, например Step2?

Обсуждение

Неизвестный
10.09.2006, 18:38
общий
так хорошо бы код псмотреть....
давно
Мастер-Эксперт
425
4118
10.09.2006, 18:41
общий
Простите, но то что Вы написали невозможно. После того как Вы удалили компонент с помощью метода Free, Вы никаким FindComponent() его найти не можете, т.к. компонент уже отсутствует.Не могли бы Вы уточнить?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
10.09.2006, 18:54
общий
это ответ
Здравствуйте, Piit!
Два одинаковых имени у одинаковых компонентов быть не может. Могу посоветовать только изменять имя у вновь созданного.
Неизвестный
11.09.2006, 13:19
общий
Возможно, дело в том, что память освобождается, все хорошо, но надо сообщить об удалении объекта не только менеджеру памяти (методом Free), но и форме. Память освобождается, но запись в массиве ссылок на дочерние компоненты формы остается.А, может быть, и нельзя. Все-таки повторное динамическое создание компонентов - ситуация довольно нетипичная.
давно
Мастер-Эксперт
425
4118
11.09.2006, 13:56
общий
To Сухомлин Кирилл Владимирович:Простите, но в вопросе черным по белому написано, что после удаления компонента, автор вопроса обращается к св-ву этого компонента без сообщения об ошибке. Никакая оставшаяся запись в массиве компонентов этого делать не позволяет, т.к. сия мифическая запись указывает уже не на компонент, а в Таракановку или копи царя Соломона. :)По-моему он что-то черезвычайно сильно путает.Вдобавок в хелпе по Free() написано, что этот метод разрушает объект И удаляет из памяти, а не просто удаляет из памяти.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
11.09.2006, 14:25
общий
Ой, точно. Однако насчет, удаления из памяти еще раз повторюсь, что после удаления объекта, может оставаться на него ссылка, хранящаяся в объекте формы. Конечно, ставшая недействительной.А обращается он к компоненту, наверное, все-таки до вызова Free. Только излагает это непоследовательно =)Кстати, уважаемый Piit, а пришлите-ка ваш исходный код и пометьте, в какой строке у вас ошибка.
давно
Мастер-Эксперт
425
4118
11.09.2006, 14:47
общий
То что ссылки никакой не остается, можно проверить с помощью свойства формы ComponentCount.Допустим до создания нового компонента у меня на форме 4 компонента. ComponentCount показывает мне именно 4. Потом я создаю динамически новый компонент на форме и опять проверяю ComponentCount. Теперь я уже вижу 5. Потом у вновь созданного компонента я делаю Free и опять проверяю ComponentCount. Что я вижу? Правильно, цифру 4. :)
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
11.09.2006, 18:50
общий
var ExEdit:TEdit;ExEdit := TEdit.Create(Self);ExEdit.Parent := TWinControl(TabContent.Pages.Objects[TabContent.PageIndex]);tryExEdit.Align:=alTop;ExEdit.Name:=‘Ex‘+inttostr(j);exceptExEdit.Free;end;В другой процедуреwith TEdit(findComponent(‘Ex‘+inttostr(j))) doname:=‘Ex‘+inttostr(j-1);Вот здесь и ошибка, если имена совпадают. Кстати, если text:=‘???‘, никаких ошибок нет.А как узнать существует компонент с именем name1 или нет, типа fileexists
Неизвестный
11.09.2006, 23:04
общий
Да, не зря я хотел вам предложить пройти программу в дебаг-режиме и посмотреть, выполняется ли строчка ExEdit.Free; Если все нормально выполняется в блоке try..except, то ExEdit.Free уже не выполняется! А вообще, довольно странная конструкция у вас написана, даже если использовать try..finally..end (я так понимаю, в хотели сделать так, как работает именно указанная мной конструкция)
давно
Мастер-Эксперт
425
4118
12.09.2006, 07:30
общий
Смысл этого сооружения непонятен.А проверить довольно легко с помощью того же FindComponent:VarComponent: TComponent;BeginComponent:=NIL;Component:=Объект-хозяин.FindComponent(‘Ex‘+IntToStr(j));If Component=NIL ThenShowMessage(‘Компонент ‘+‘Ex‘+IntToStr(j)+‘ не найден.‘);End;
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа