Главная страница
    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.039 c
14-1086933878
Rouse_
2004-06-11 10:04
2004.06.27
С Днем Рождения 11 июня


3-1085999524
Balkon
2004-05-31 14:32
2004.06.27
Ошибка "Master table is open" при копировании детальной таблицы.


1-1087117744
Snip
2004-06-13 13:09
2004.06.27
Цвет TPanel


1-1086788472
Sour
2004-06-09 17:41
2004.06.27
Работа с ключами рееста типа REG_MULTI_SZ


3-1086267642
Jiny
2004-06-03 17:00
2004.06.27
Возможно проблема с TFrame





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский