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

Вниз

Динамический массив   Найти похожие ветки 

 
Gu   (2011-08-06 21:48) [0]

Допустим есть некий массив определенный как
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; Это можно сделать или может есть другой способ все это реализовать?
Задача: в произвольном порядке создавать компоненты для разных форм и в произвольном же порядке их уничтожать. Сделал через массив, может как то еще можно?


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

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


 
Servy ©   (2011-08-06 22:04) [2]

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


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

спасибо


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


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


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

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


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


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

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


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

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

> Gu

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


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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2011.11.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
15-1312461790
Сергей М.
2011-08-04 16:43
2011.11.27
Теперь понятно почему Скайп иной раз изрядно поглючивает)


15-1311711837
tesseract
2011-07-27 00:23
2011.11.27
Чтиво на отпуск.


15-1312287708
OW
2011-08-02 16:21
2011.11.27
Сеть рушится? Целый день ошибки


1-1274176852
Infarkt
2010-05-18 14:00
2011.11.27
Глюк в ValueListEditor?


15-1306263283
R_R
2011-05-24 22:54
2011.11.27
Вот у меня есть ещё одна идейка - идея мега-шахмат