Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамический массив объектов. [D7, XP]


Страницы:   1 2

Новичек ©   (2007-02-05 04:26:00) 

Здравствуйте, уважаемые Мастера.
У меня вот какой вопрос:
Имеется на форме Edit1, в него запихивается цифра. Затем на форме формируются панели в количестве, указанном в Edit1:

var
 pnlPanel: Array of TPanel;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key <> vk_Return then exit;
 k := StrToInt(Edit1.Text);
 SetLength(pnlPanel, k);
 for i := 0 to k - 1 do
 begin
//Создание панели
   pnlPanel[i] := TPanel.Create(Form1);
   pnlPanel[i].Name := 'pnlPanel' + IntToStr(i);
 end;
end;


Затем я меняю цифру в Edit1 и, соответственно, уничтожаю ранее созданный массив pnlPanel:

 SetLength(pnlPanel, 0);
 FreeAndNil(pnlPanel);


Запускаю вышеприведенную процедуру и получаю сообщение, что панель с именем 'pnlPanel0' уже существует!
Объясните, пожалуйста, как правильно работать с динамическим массивом объектов?


Джо   (2007-02-05 05:19:00) [21]


> Вызов FreeAndNil как раз и вызывает метод Free.

Давайте Вы мне не будете ничего доказывать, а я не буду комментировать Ваш код:
FreeAndNil(pnlPanel);
ОК? :)


Новичек   (2007-02-05 05:15:00) [22]


> Господи, ну неужели сложно просто вдумчиво прочитать ответы?
>  


Вызов FreeAndNil как раз и вызывает метод Free.


Джо   (2007-02-05 05:11:00) [23]

Господи, ну неужели сложно просто вдумчиво прочитать ответы? Объекты нужно уничтожать. Объекты уничтожаются вызовом метода Free. А ты просто затираешь содержимое массива, в котором у тебя храняться ссылки на эти объекты.


Новичек   (2007-02-05 05:11:00) [24]

Причем, вот что интересно: ежели массив сделать статическим, то все проблемы исчезают.
Юрий Юрьевич, у Вас богатый опыт - где грабли?


Новичек   (2007-02-05 04:59:00) [25]


> в каком месте, интересно?


Вот в этом:
var
pnlPanel: Array of TPanel;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key <> vk_Return then exit;
for i := 0 to k-1 do if Assigned(pnCell[i]) then FreeAndNil(pnCell[i]);
k := StrToInt(Edit1.Text);
SetLength(pnlPanel, k);
for i := 0 to k - 1 do
begin
  pnlPanel[i] := TPanel.Create(Form1);
  pnlPanel[i].Name := 'pnlPanel' + IntToStr(i);
end;
end;



> Неужели тружно шесть строк procedure TForm1.Edit1KeyDown
> повторить целиком с учетом исправлений?
>

Да ведь русским же языком сказал - НЕ РАБОТАЕТ. Объекты pnlPanel[i] не уничтожаются, а посему вновь создаваемому объекту невозможно присвоить то же имя, что было до исправления.


ЮЮ   (2007-02-05 04:50:00) [26]


> for i := 0 to k-1 do if Assigned(pnCell[i]) then FreeAndNil(pnCell[i]);


в каком месте, интересно?
Неужели тружно шесть строк procedure TForm1.Edit1KeyDown повторить целиком с учетом исправлений?


Новичек   (2007-02-05 04:37:00) [27]


> А массив ты даже не уничтожилд как таковой а просто прописал
> длинну 0 ..

А FreeAndNil?

> pnlPanel[i].free

Пробовал вот так:
for i := 0 to k-1 do if Assigned(pnCell[i]) then FreeAndNil(pnCell[i]);
Не помогает :-(


Lex_!   (2007-02-05 04:32:00) [28]

pnlPanel[i].free
А массив ты даже не уничтожилд как таковой а просто прописал длинну 0 ..


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо