Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
ВнизMove для record. Можно ли? Найти похожие ветки
← →
olookin © (2005-01-29 19:52) [0]Можно ли выполнять:
type TCollectionGroup = record
Item: array of TCollectionItem;
Name: string;
end;
var Group: array of TCollectionGroup;
procedure DeleteGroup(GroupIndex: integer);
begin
Move(Group[GroupIndex+1],Group[GroupIndex],4*(Length(Group)-GroupIndex-1));
Group[Length(Group)-1]:=nil;
SetLength(Group,Length(Group)-1);
end;
?
← →
icWasya © (2005-02-01 19:39) [1]посмотри в исходниках VCL (кажись Classes.pas), как сделано что-то подобное в TStringList"е
← →
GuAV © (2005-02-01 22:09) [2]Счётчики ссылок в Item и Name не будут увеличены при копировании через Move, однако будут уменьшены при SetLength.
Чтобы это работало, следует заменить Group[Length(Group)-1]:=nil; (разве это компилится ? ) на FillChar( Group[Length(Group)-1], SizeOf(TCollectionGroup), 0); это обнулит указатели без уменьшения счётчиков ссылок и счётчики уже не будут уменьшены при SetLength.
почему 4 а не SizeOf(TCollectionGroup) ? Тем более это будет не 4, а 8 ?
← →
GuAV © (2005-02-01 22:18) [3]Да, ещё, следует освободить удаляемый элемент. Для этого его можно поставить удаляемым в SetLength.
procedure DeleteGroup(GroupIndex: integer);
var tmp: TCollectionGroup
begin
tmp := Group[GroupIndex];
Move(Group[GroupIndex+1], Group[GroupIndex], SizeOf(TCollectionGroup)*(Length(Group)-GroupIndex-1));
Move(tmp, Group[GroupIndex], Group[Length(Group)-1], SizeOf(TCollectionGroup));
SetLength(Group, Length(Group)-1);
end;
GuAV © (01.02.05 22:09) [2]
Тем более это будет не 4, а 8 ?
И не 8, а зависит от установок.
Тем более это будет не 4, а 8 ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 4.356 c