Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Проблема с динамическим массивом объекта 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
14-1086757158
ceval
2004-06-09 08:59
2004.06.27
Novell 3.12 установил контролер FastTrar 100 TX2.


3-1086015499
ThermiT
2004-05-31 18:58
2004.06.27
ODBC driver for WIN98


8-1081935418
pr
2004-04-14 13:36
2004.06.27
прожектора


14-1086697699
Baks
2004-06-08 16:28
2004.06.27
Вопрос на зацепку


4-1084958517
-=zek=-
2004-05-19 13:21
2004.06.27
Получение изображения рабочего стола