如何在Delphi中存储带自定义名称的FireDAC书签列表?
可行实现方案
方案1:直接使用TDictionary<string, TBookmark>(最简便)
Delphi 自带的泛型字典原生支持键值对存储,直接用字符串作为键、TBookmark 作为值即可满足“名称绑定书签”的需求,只需额外封装默认索引器就能匹配你要的调用语法。
首先需要在 uses 引入 System.Generics.Collections 单元,自定义封装类代码如下:
type TBookmarkList = class(TDictionary<string, TBookmark>) public // 定义默认索引器,支持括号直接取值 default property Items[const Name: string]: TBookmark read GetValue write SetValue; end;
调用逻辑完全符合你的预期:
// 先添加绑定关系 var mySL := TBookmarkList.Create; mySL.Add('test1', 你的书签对象1); mySL.Add('test2', 你的书签对象2); // 直接按名称取书签 var myBookmark1 := mySL('test1'); var myBookmark2 := mySL('test2');
该方案查询效率为O(1),适合书签数量较多的场景。
方案2:基于TStringList扩展(兼容原有TStringList特性)
如果你需要保留TStringList的排序、去重、遍历字符串列表等原生特性,也可以直接继承TStringList做封装:
type TBookmarkList = class(TStringList) public property Items[const Name: string]: TBookmark read GetBookmark write SetBookmark; default; procedure AddBookmark(const Name: string; ABookmark: TBookmark); private function GetBookmark(const Name: string): TBookmark; procedure SetBookmark(const Name: string; ABookmark: TBookmark); end; implementation function TBookmarkList.GetBookmark(const Name: string): TBookmark; var Idx: Integer; begin Idx := IndexOf(Name); if Idx = -1 then raise Exception.Create('书签名称不存在'); Result := TBookmark(Objects[Idx]); end; procedure TBookmarkList.SetBookmark(const Name: string; ABookmark: TBookmark); var Idx: Integer; begin Idx := IndexOf(Name); if Idx = -1 then AddObject(Name, ABookmark) else Objects[Idx] := ABookmark; end; procedure TBookmarkList.AddBookmark(const Name: string; ABookmark: TBookmark); begin AddObject(Name, ABookmark); end;
该方案可以直接复用TStringList的所有原生操作方法,适合需要兼容旧有TStringList使用习惯的场景。
补充说明
如果你的TBookmark需要手动管理生命周期,只需在继承类的析构函数中遍历所有元素释放书签对象即可,无需额外调整调用逻辑。
内容的提问来源于stack exchange,提问作者lorife
相关产品推荐
相关产品推荐

