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

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

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


Наверх

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