Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-1081869661
VitGun
2004-04-13 19:21
2004.06.27
DXF. Чтение отображение.


6-1083853962
Krey
2004-05-06 18:32
2004.06.27
DNS протокол. AXFR


3-1085919471
avgur
2004-05-30 16:17
2004.06.27
Последние 5 строк


8-1081886605
Юрий
2004-04-14 00:03
2004.06.27
JPEG ?! "низкоуровневый"


14-1086811730
Infeligo
2004-06-10 00:08
2004.06.27
Какой софт использовать для зелёного экрана?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский