Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизПроблема с динамическим массивом объекта TImage Найти похожие ветки
← →
Nikoss (2004-06-10 23:28) [0]Я объявляю динамический массив 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);
но при финализации выдается ошибка. Подскажите, как мне правильно обнулить массив, чтобы картинки исчезли с формы и
динамически созданные объекты были выгруженны из памяти?
← →
Гаврила © (2004-06-10 23:37) [1]for i:= 0 to k - 1 do begin
← →
Nikoss (2004-06-11 00:07) [2]Ошибка по преджему возникает
← →
Palladin © (2004-06-11 00:13) [3]for i:= 0 to q -1 do
← →
Гаврила © (2004-06-11 00:15) [4]1. Какая именно ошибка ?
2.
for i:= 0 to k - 1 do
arr[i].Free;
Это вызывается перед освобождением массива ?
← →
Anatoly Podgoretsky © (2004-06-11 00:17) [5]for i:= 0 to q do arr[i].Picture.Bitmap.FreeImage;
А это что за массив, он не имеет отношения к for i:= 0 to k do begin
← →
GuAV © (2004-06-11 00:29) [6][А вообще можно используй TComonentList заместо массива- прибить всех - одним деструктором]
← →
Palladin © (2004-06-11 00:36) [7]
> Anatoly Podgoretsky © (11.06.04 00:17) [5]
Мда. Действительно.
← →
Nikoss (2004-06-11 08:26) [8]
> Гаврила
Для высвобождения массива я вызывал finalize(arr);
> Anatoly Podgoretsky ©
Я написал не весь код процедуры, из-за этого получился такой ляпсус. q это глобальная переменная, она запоминает предыдущее значение введенное пользователем. А запоминает для того, чтобы когда вызовут эту процедуру, обнулить массив.
← →
ЮЮ © (2004-06-11 08:42) [9]>А запоминает для того, чтобы когда вызовут эту процедуру, обнулить массив.
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;
← →
ЮЮ © (2004-06-11 08:45) [10]З.Ы.
arr : array of TImage при этои должен быть либо глобальной переменной, либо полем формы, но никак не локальной переменной метода Button1Click
← →
Anatoly Podgoretsky © (2004-06-11 09:02) [11]Nikoss (11.06.04 08:26) [8]
Вопрос не про Q, а про arr, вот это локальная переменная, кроме того при выходе из области видимости она автоматически удаляется.
Это тоже отвратительно arr[i]:=TImage.Create(nil);
Надо бы все таки назначить владельца компонента.
← →
Гаврила © (2004-06-11 09:49) [12]
> Это тоже отвратительно arr[i]:=TImage.Create(nil);
Это еще почему отвратительно ?
всего лишь указание, что временем жизни объекта будут управлять вручную
← →
evvcom © (2004-06-13 02:54) [13]Все же с arr[i]:=TImage.Create(Self); геморроя меньше, а писанины не намного больше. А временем жизни объекта не управляют вовсе, поскольку arr сидит в локальных переменных.
← →
TUser © (2004-06-13 10:54) [14]
> SetLength(arr,k);
SetLength(arr,max(k,length(arr)));
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c