delphi - Delphi 中的记录和通用容器

标签 delphi generics containers records

我对使用 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 中的每一个都是常量。我给你看一些照片:

项目添加成功

Pic01

删除了 FRecList 的项目

Pic02

ChangeCounter 方法改变了 Counter 的值

Pic03

CheckForUnusedItems 方法没有看到任何变化

Pic04

Counter 属性将其值保持为常量

Pic05

发生了什么事?对此有解释吗?我该如何解决? 提前致谢。

最佳答案

TList 的默认索引器属性返回容器内值的副本;然后您对该副本调用 ChangeCounter,它会更改该副本的字段。容器内的原始项目没有改变。如果你想让它工作,你必须将它存储在本地,调用该本地的任何变异方法,然后将本地存储回容器,覆盖旧值。

这适用于数组以外的任何容器,因为没有办法“通过引用返回”,因此对返回值的进一步变异操作反射(reflect)在容器本身中。

关于delphi - Delphi 中的记录和通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890196/

相关文章:

delphi - 是否有可用的一致的全局格式设置变量?

c# - Func 委托(delegate)声明的方法

docker - Docker,我有一个包含应用程序服务器的文件夹。什么可以用作容器?

delphi - 如何在Delphi中使用XMLHTTPRequest获取图像二进制数据

xml - 使用 XML 保存和加载 Treeview

delphi - TButtons 和 "runtime themes": peculiar behavior

java - 扩展类并实现接口(interface)的通用类

generics - 在编译时检查具体化的泛型

ios - Swift 中的容器 View 边界问题

docker - 如何从容器内在主机上运行 podman 命令