DP类关于Guid类型的Bug

案例前提:

系统中拿数据到实体表,实体表新建了一个Guid类型的字段区分Session,实体表做数据处理后再将数据写入报表的TmpDB里,实体表数据用Guid字段区分。

发现DP类再用Insert_Recordset或者Update_Recordset拿数据到TmpDB时,如果涉及到聚合函数

就会出现拿不到聚合函数对应的数据的Bug。

后改为采用表的CreatedTransactionId来解决:

用:CreatedTransactionId createdTransId = appl.curTransactionId(true);获得TransactionId写入表中

### 三级标题:TComboBox 中使用 GUID 类型 ID 查找对应项索引的实现 在 Delphi 应用程序中,若需将数据库记录的 `name` 字段显示在 `TComboBox` 控件中,并将对应的 `GUID` 类型 `id` 存储为附加信息,则可利用 `Items.Objects` 属性来保存类型转换后的指针数据。这种方式不仅支持字符串展示,还允许通过对象字段进行精确查找。 #### 加载 name 并存储 GUID id 为了将数据库中的 `name` 字段作为文本内容添加到 `TComboBox.Items` 集合中,并将对应的 `GUID` 类型 `id` 转换为指针形式附加到 `Items.Objects` 属性中,可以采用如下方法: ```pascal procedure TForm1.LoadComboBoxWithGUID; var Query: TQuery; GuidValue: TGUID; begin Query := TQuery.Create(Self); try Query.DatabaseName := 'YourDatabase'; Query.SQL.Text := 'SELECT id, name FROM your_table'; Query.Open; while not Query.Eof do begin if Succeeded(StringToGUID(Query.FieldByName('id').AsString, GuidValue)) then ComboBox1.Items.AddObject(Query.FieldByName('name').AsString, Pointer(MemAlloc(SizeOf(TGUID)))) ^ := GuidValue; // 将 GUID 拷贝至分配的内存地址 Query.Next; end; finally Query.Free; end; end; ``` 该代码片段通过 `AddObject` 方法将每条记录的 `name` 添加为下拉列表项,并为每个项分配一块内存空间用于存储对应的 `GUID` 值[^2]。 #### 根据 GUID id 获取 ItemIndex 当需要根据特定的 `GUID` 值查找其在 `TComboBox` 中的索引时,可以通过遍历 `Items.Objects` 并逐个比较存储的 `GUID` 数据完成匹配: ```pascal function TForm1.GetComboBoxIndexByGUID(AComboBox: TComboBox; const AGUID: TGUID): Integer; var i: Integer; begin Result := -1; for i := 0 to AComboBox.Items.Count - 1 do begin if CompareMem(Pointer(AComboBox.Items.Objects[i]), @AGUID, SizeOf(TGUID)) then begin Result := i; Exit; end; end; end; ``` 此函数返回与目标 `GUID` 匹配的索引值;若未找到则返回 `-1`,适用于频繁进行唯一标识符匹配的场景[^1]。 #### 内存管理注意事项 由于 `Items.Objects` 中存储的是指向动态分配内存的指针,在 `TComboBox` 销毁前应手动释放这些资源以避免内存泄漏。可在窗体的 `OnDestroy` 事件中加入如下清理逻辑: ```pascal procedure TForm1.FormDestroy(Sender: TObject); var i: Integer; begin for i := 0 to ComboBox1.Items.Count - 1 do if Assigned(ComboBox1.Items.Objects[i]) then FreeMem(ComboBox1.Items.Objects[i]); end; ``` 上述操作确保了所有由 `MemAlloc` 分配的内存都被正确回收,从而维持程序运行期间良好的内存状态[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值