我对使用 Generic Containers (TList) 的唱片有点生气(唱皇后乐队的歌)。首先,请看这段代码:
TItemRec = record
private
FSender : TAction;
FOwnerPack : HModule;
FDockPanel : TdxDockPanel;
procedure SetDockPanel(const Value: TdxDockPanel);
procedure SetOwnerPack(const Value: HModule);
procedure SetSender(const Value: TAction);
public
property Sender: TAction read FSender write SetSender;
property OwnerPack: HModule read FOwnerPack write SetOwnerPack;
property DockPanel: TdxDockPanel read FDockPanel write SetDockPanel;
end;
TPackRec = record
private
FHandle : HModule;
var FCounter : Int16;
procedure SetCounter(const Value: Int16);
procedure SetHandle(const Value: HModule);
public
property Handle: HModule read FHandle write SetHandle;
property Counter: Int16 read FCounter write SetCounter;
procedure ChangeCounter(IncValue: Boolean = True);
end;
TRecList = class(TList<TItemRec>)
public
procedure CloseDockPanels;
end;
TPackList = class(TList<TPackRec>)
strict private
procedure DoChanges(const APack: HModule; const AAdd: Boolean = True);
public
procedure CheckForUnusedItems;
procedure AppendRef(const APack: HModule);
procedure DeleteRef(const APack: HModule);
procedure ClosePackages;
end;
TfrmMain = class(TForm)
private
FRecList : TRecList;
FPackList : TPackList;
public
end;
........................
procedure TPackList.CheckForUnusedItems;
var
i : Int16;
Flag : Boolean;
begin
repeat
Flag:= False;
if Self.Count > 0 then begin
for i:= Self.Count - 1 downto 0 do begin
Flag:= Self.Items[i].FCounter > 0;
if not Flag then begin
Self.Delete(i);
Flag:= True;
Break;
end;
Flag:= False;
end;
end;
until not Flag;
end;
procedure TPackRec.ChangeCounter(IncValue: Boolean);
var
Value : Int16;
begin
Value:= Counter;
if IncValue then
Value:= Value + 1
else
Value:= Value - 1;
Counter:= Value;
end;
我在尝试更改 Counter 属性的值时遇到了一个严重的问题,这是唯一具有更改值的项目。 ChangeCounter 方法应该更改 Counter 的值,显然它已经完成,但是对于 CheckForUnusedItems 方法什么也没改变,我几乎尝试了所有方法,但似乎 TPackList 和 TRecList 中的每一个都是常量。我给你看一些照片:
项目添加成功
删除了 FRecList 的项目
ChangeCounter 方法改变了 Counter 的值
CheckForUnusedItems 方法没有看到任何变化
Counter 属性将其值保持为常量
发生了什么事?对此有解释吗?我该如何解决? 提前致谢。
最佳答案
TList
的默认索引器属性返回容器内值的副本;然后您对该副本调用 ChangeCounter
,它会更改该副本的字段。容器内的原始项目没有改变。如果你想让它工作,你必须将它存储在本地,调用该本地的任何变异方法,然后将本地存储回容器,覆盖旧值。
这适用于数组以外的任何容器,因为没有办法“通过引用返回”,因此对返回值的进一步变异操作反射(reflect)在容器本身中。
关于delphi - Delphi 中的记录和通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890196/