Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Вниз

Удаление формы из динамического массива 


olookin   (2002-02-18 14:14) [0]

Уважаемые господа, послушайте мой вопрос!
Есть динамический массив, например из 5 форм. Все формы показаны процедурой Show. Необходимо удалить произвольную форму из массива, и передвинуть все остальные формы на 1 позицию назад. Как это сделать?

Кусок моего кода, как я это делаю:
//FileWnd: array of TForm; динамический массив форм
//nTag: integer; таг текущей удаляемой формы = номеру формы в массиве
//numfiles: integer; количество форм в массиве - 1

var numfiles,i,formTag: integer;

for i:=0 to Length(Filewnd)-1 do Filewnd[i].Close;
formtag:=nTag;
numfiles:=Length(Filewnd)-1;
FileWnd[formtag].Release;
FileWnd[formtag]:=nil;
for i:=formtag to Length(FileWnd)-2 do if FileWnd[i+1]<>nil then begin
FileWnd[i]:=nil;
Move(FileWnd[i+1],FileWnd[i],SizeOf(FileWnd[i+1]));
FileWnd[i].Tag:=i;
FileWnd[i].Name:="FileWnd"+IntToStr(i); end;

if FileWnd[numfiles]<>nil then begin
FileWnd[numfiles].Release;
Filewnd[numfiles]:=nil; end;
SetLength(FileWnd,numfiles);

Заранее спасибо за ответ



MBo   (2002-02-18 14:33) [1]

Len:=Length(FileWnd);
FileWnd[N].Release;
...может, еще чего-то для освобождения надо?
Move(FileWnd[N+1],FileWnd[N],SizeOf(pointer)*(Len-N-1));
SetLength(FileWnd,Len-1);

тэги, имена нужны?
for i:=n to len-2 do begin
FileWnd[i].Tag:=i;
FileWnd[i].Name:="FileWnd"+IntToStr(i);
end;



skywalker   (2002-02-18 14:34) [2]

Попробуй эту функцию, если я правильно понял твой вопрос:

function RemoveForm(RForm:TFrom):boolean;
var
BackArr:array of TForm;
Len,Cnt:word;
begin
Result:=false;
Len:=Length(FileWnd);
if Len=0 then Exit;
for Cnt:=0 to Len-1 do
begin
if FileWnd[Cnt]<>RForm then
begin
SetLength(BackArr,Length(BackArr+1);
BackArr[Length(BackArr)-1]:=FileWnd[Cnt]
end
else Result:=true
end;
SetLength(FileWnd,0);
Len:=Length(BackArr);
if Len=0 then Exit;
for Cnt:=0 to Len-1 do
begin
SetLength(FileWnd,Cnt+1);
FileWnd[Cnt]:=BackArr[Cnt]
end;
SetLength(BackArr,0)
end;



olookin   (2002-02-18 15:03) [3]

Спасибо, но все великолепно работает при присваивании FileWnd[i]:=FileWnd[i+1] и FileWnd[i].Tag=FileWnd[i+1].Tag и простом изменении длины массива SetLength(FileWnd,Length(FileWnd)-1);




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.018 c
1-19164           Dan_Viking            2002-02-21 14:51  2002.03.07  
Ищу компонент.


3-19088           Димка777              2002-02-06 00:03  2002.03.07  
Как сделать НЕразрываемой связку DetailHeader+DetailData+DetailFooter в FastReport


3-19055           Bormanoid             2002-02-07 21:58  2002.03.07  
Смена позиции курсора или Query.RecNo глючит...


4-19380           iXANiA                2002-01-09 18:19  2002.03.07  
Обмен данных между ДОС приложением и Win32


4-19386           mili                  2002-01-10 19:01  2002.03.07  
функция API для вывода в DBGrid e поля MEMO