![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический массив объектов. [D7, XP]
Новичек © (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 ..