Delphi开发

Delphi TSCGridView 中.Item 节点中 Data存储与管理

2025-03-15 17 0

简介

在 Delphi 中使用 TSCGridView 控件的 Items[0].Data 存储 TCUSTOMERDATA 数据时,需根据数据类型(记录或类)进行内存管理和类型转换。以下是详细步骤:

1. 确认 TCUSTOMERDATA 类型定义

假设 TCUSTOMERDATA 是一个自定义的记录,例如:

// 记录类型
type
  PCUSTOMERDATA = ^TCUSTOMERDATA;
  TCUSTOMERDATA = record
    CustomerID: Integer;
    CustomerName: string;
  end;

// 或类类型
type
  TCustomerData = class
    CustomerID: Integer;
    CustomerName: string;
  end;

2. 存储数据到 Data 属性

若为记录类型

  • 分配内存并存储指针:

    delphi

    复制

    var
      PData: PCUSTOMERDATA;
    begin
      New(PData); // 分配内存
      try
        PData^.CustomerID := 123;
        PData^.CustomerName := 'John Doe';
        scGridView.Items[0].Data := TObject(PData); // 转换为 TObject 存储
      except
        Dispose(PData); // 异常时释放内存
        raise;
      end;
    end;

若为类类型

  • 创建实例并存储:

    delphi

    复制

    var
      CustomerData: TCustomerData;
    begin
      CustomerData := TCustomerData.Create;
      CustomerData.CustomerID := 123;
      CustomerData.CustomerName := 'John Doe';
      scGridView.Items[0].Data := CustomerData; // 直接赋值
    end;

3. 读取 Data 属性中的数据

若为记录类型

  • 转换指针并访问数据:


  • var
      PData: PCUSTOMERDATA;
    begin
      if Assigned(scGridView.Items[0].Data) then
      begin
        PData := PCUSTOMERDATA(scGridView.Items[0].Data);
        ShowMessage(PData^.CustomerName);
      end;
    end;

若为类类型

  • 类型检查并访问数据:

    delphi

    复制

    var
      CustomerData: TCustomerData;
    begin
      if scGridView.Items[0].Data is TCustomerData then
      begin
        CustomerData := TCustomerData(scGridView.Items[0].Data);
        ShowMessage(CustomerData.CustomerName);
      end;
    end;

4. 内存管理关键点

记录类型

  • 释放内存:在删除单元格或销毁 Grid 时,需手动释放:


  • // 示例:清除某一行数据时
    if Assigned(scGridView.Items[0].Data) then
    begin
      Dispose(PCUSTOMERDATA(scGridView.Items[0].Data));
      scGridView.Items[0].Data := nil;
    end;

类类型

  • 释放对象:建议在 Grid 的 OnRemoveItem 事件或销毁时释放:


  • procedure TForm1.scGridViewRemoveItem(Sender: TObject; Index: Integer);
    begin
      if Assigned(scGridView.Items[Index].Data) then
        TObject(scGridView.Items[Index].Data).Free;
    end;

5. 完整示例代码(记录类型)

delphi

复制

// 定义记录和指针
type
  PCUSTOMERDATA = ^TCUSTOMERDATA;
  TCUSTOMERDATA = record
    CustomerID: Integer;
    CustomerName: string;
  end;

// 添加数据
procedure TForm1.AddData;
var
  PData: PCUSTOMERDATA;
begin
  New(PData);
  PData^.CustomerID := 1;
  PData^.CustomerName := 'Alice';
  scGridView.Items[0].Data := TObject(PData);
end;

// 读取数据
procedure TForm1.ReadData;
var
  PData: PCUSTOMERDATA;
begin
  if Assigned(scGridView.Items[0].Data) then
  begin
    PData := PCUSTOMERDATA(scGridView.Items[0].Data);
    ShowMessage(PData^.CustomerName); // 输出 "Alice"
  end;
end;

// 清理数据
procedure TForm1.ClearData;
begin
  if Assigned(scGridView.Items[0].Data) then
  begin
    Dispose(PCUSTOMERDATA(scGridView.Items[0].Data));
    scGridView.Items[0].Data := nil;
  end;
end;

常见问题处理

  • 访问冲突:确保指针不为空且未提前释放。

  • 内存泄漏:确保每个 New/Create 都有对应的 Dispose/Free

  • 类型转换错误:使用 isAssigned 进行安全检查。

通过以上步骤,可安全地在 TSCGridViewData 属性中存储和检索自定义数据


点赞 0

我的名片

网名:梦宇信息技术

职业:软件开发、Mes系统工程师

现居:福建省-福州市

QQ:703159

站点信息

  • 联系QQ:703159
  • 文章统计97篇文章
  • 标签总数6
  • 加我微信:扫码,加我微信