![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с динамическим массивом объекта TImage [D7, WinXP]
Nikoss © (2004-06-10 23:28:00)Я объявляю динамический массив arr. Его размер зависит от введенного пльзователем числа (значение не больше 10). После
нажатия на кнопку программа создает массив объекта TImage размещает эти объекты на форме и загружает в них картинки.
procedure TForm1.Button1Click(Sender: TObject);
var k, i : Integer;
arr : array of TImage;
begin
k:= StrToInt(Edit1.Text);
SetLength(arr,k);
for i:= 0 to k do begin
arr[i]:=TImage.Create(nil);
arr[i].Parent:= Form1;
arr[i].Picture.LoadFromFile('c:\'+IntToStr(i)+'.jpg');
arr[i].Left:= 60*i;
end;
end;
Дело в том, что если введенные значения увеличиваются, т.е. сначала пользователь ввел значение 5, потом 8, потом 10, то
все в порядке, но если пользователь ввел сначала 5, потом 3, то возникает ошибка. Вы не могли бы объяснить причину
возникновения этой ошибки, и что нужно сделать для ее устранения?
Для ее устранения я пробовал при загрузке новых картинок выгружать старые и удалять массив,
for i:= 0 to q do arr[i].Picture.Bitmap.FreeImage;
finalize(arr);
но при финализации выдается ошибка. Подскажите, как мне правильно обнулить массив, чтобы картинки исчезли с формы и
динамически созданные объекты были выгруженны из памяти?
TUser (2004-06-13 10:54:00) [1]
> SetLength(arr,k);
SetLength(arr,max(k,length(arr)));
evvcom (2004-06-13 02:54:00) [2]Все же с arr[i]:=TImage.Create(Self); геморроя меньше, а писанины не намного больше. А временем жизни объекта не управляют вовсе, поскольку arr сидит в локальных переменных.
Гаврила (2004-06-11 09:49:00) [3]
> Это тоже отвратительно arr[i]:=TImage.Create(nil);
Это еще почему отвратительно ?
всего лишь указание, что временем жизни объекта будут управлять вручную
Anatoly Podgoretsky (2004-06-11 09:02:00) [4]Nikoss (11.06.04 08:26) [8]
Вопрос не про Q, а про arr, вот это локальная переменная, кроме того при выходе из области видимости она автоматически удаляется.
Это тоже отвратительно arr[i]:=TImage.Create( nil );
Надо бы все таки назначить владельца компонента.
ЮЮ (2004-06-11 08:45:00) [5]З.Ы.
arr : array of TImage при этои должен быть либо глобальной переменной, либо полем формы, но никак не локальной переменной метода Button1Click
ЮЮ (2004-06-11 08:42:00) [6]>А запоминает для того, чтобы когда вызовут эту процедуру, обнулить массив.
for i:= 0 to High (arr) do arr[i].Free;
finalize(arr);
procedure TForm1.Button1Click(Sender: TObject);
var oldLength, newLength, i : Integer;
arr : array of TImage;
begin
new := StrToInt(Edit1.Text);
for i := newLengtр to length(arr[i]) - 1 do
// освобождаем, если необходимо, ненужные ресурсы
arr[i].Free;
oldLength := length(arr);
SetLength(arr, newLength);
for i := oldLength to newLength - 1 do begin
// догружаем недостающие
arr[i]:=TImage.Create(nil);
arr[i].Parent:= Form1;
arr[i].Picture.LoadFromFile('c:\'+IntToStr(i)+'.jpg');
arr[i].Left:= 60*i;
end;
end;
Nikoss (2004-06-11 08:26:00) [7]
> Гаврила
Для высвобождения массива я вызывал finalize(arr);
> Anatoly Podgoretsky ©
Я написал не весь код процедуры, из-за этого получился такой ляпсус. q это глобальная переменная, она запоминает предыдущее значение введенное пользователем. А запоминает для того, чтобы когда вызовут эту процедуру, обнулить массив.
Palladin (2004-06-11 00:36:00) [8]
> Anatoly Podgoretsky © (11.06.04 00:17) [5]
Мда. Действительно.
GuAV (2004-06-11 00:29:00) [9][А вообще можно используй TComonentList заместо массива- прибить всех - одним деструктором]
Anatoly Podgoretsky (2004-06-11 00:17:00) [10]for i:= 0 to q do arr[i].Picture.Bitmap.FreeImage;
А это что за массив, он не имеет отношения к for i:= 0 to k do begin
Гаврила (2004-06-11 00:15:00) [11]1. Какая именно ошибка ?
2.
for i:= 0 to k - 1 do
arr[i].Free;
Это вызывается перед освобождением массива ?
Palladin (2004-06-11 00:13:00) [12]for i:= 0 to q -1do
Nikoss (2004-06-11 00:07:00) [13]Ошибка по преджему возникает
Гаврила (2004-06-10 23:37:00) [14]for i:= 0 to k - 1do begin