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

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

Динамический массив


Gu ©   (2011-08-06 21:48:00) 

Допустим есть некий массив определенный как
Type
MyType=<какойто невизуальный компонент>;
Var
MyArray:Array of MyType;
MyArrayLength:integer=0;

работаем с ним так

Procedure AddMyArray(Owner:TForm);
begin
inc(MyArrayLength);setLength(MyArray,MyArrayLength);
MyArray[MyArrayLength-1]:=TMyType.create(owner);
end;

допустим создали для 3х форм эти компоненты
AddMyArray(Form1);AddMyArray(Form2);AddMyArray(Form3);

Удаляю так:

Procedure DelMyArray(Owner:TForm);
var i:integer;
begin
for i:=0 to MyArrayLength-1 do
if MyArray[i]<>nil then if MyArray[i].owner=Owner then begin MyArray[i].Free;MyArray[i]:=nil;break;end;
end;

// use
DelMyArray(Form2);

Но так получается, что массив все время растет. Вопрос: как удалить компонет для формы Form2, вырезав из массива этот итем, а не приравнивая его к nil? Т.е. нужно не просто обнулить элемент массива, но еще и вырезать его, аналогично Stringlist[i].delete; Это можно сделать или может есть другой способ все это реализовать?
Задача: в произвольном порядке создавать компоненты для разных форм и в произвольном же порядке их уничтожать. Сделал через массив, может как то еще можно?


_Юрий   (2011-08-07 12:35:00) [1]


> Юрий Зотов ©   (07.08.11 12:14) [5]


Да, что-то я затупил


Gu   (2011-08-07 12:18:00) [2]

сделал через Generics.Collections - даже не знал что такая новинка есть. отлично работает. тут вот примерчег есть: http://blog.kansoftware.ru/?p=4


Юрий Зотов   (2011-08-07 12:14:00) [3]


> _Юрий   (07.08.11 10:53) [4]

>> Вопрос: как удалить компонет для формы Form2, вырезав
>> из массива этот итем, а не приравнивая его к nil? Т.е. нужно
>> не просто обнулить элемент массива, но еще и вырезать его


> разрушить.
> MyComponent.Free;
> при этом он автоматически уберется из формы.

А из массива? Вопрос-то об этом .

> Gu

Правильно сказано в [2] - используйте не массив, а готовый контейнер TObjectList или TComponentList. Что лучше подойдет - решать Вам, а описание этих классов есть в справке.


_Юрий   (2011-08-07 10:53:00) [4]


>  Вопрос: как удалить компонет для формы Form2, вырезав из
> массива этот итем, а не приравнивая его к nil? Т.е. нужно
> не просто обнулить элемент массива, но еще и вырезать его,
>  аналогично Stringlist[i].delete


разрушить.
MyComponent.Free;

при этом он автоматически уберется из формы.


Gu   (2011-08-06 22:05:00) [5]

спасибо


Servy   (2011-08-06 22:04:00) [6]

TObjectList из модуля Contnrs либо его шаблонный вариант из модуля Generics.Collections в новых версиях Делфи будет куда лучшей альтернативой этому на редкость кривому велосипеду.


Gu   (2011-08-06 21:51:00) [7]

Число форм, порядок добавления и уничтожения - неизвестны.


Наверх

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