阅读 Expert Delphi 书,我发现了一些我无法理解的东西。作者使用以下代码创建了一个单元:
IToDoData = interface //CRUD
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;
然后他决定使用a DataModule
,并以这种方式实现上述接口:
type
TDMToDo = class(TDataModule, IToDoData)
// ... other code ...
public
// IToDoData
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;
到目前为止一切都很好,但请注意,他没有在这里放TInterfacedObject
,所以我们没有 AddRef 等方法。我的猜测是上面的代码很好,但它必须包含在 try ... finally 块中。
在主窗体中(数据模块单元当然是uses子句)有这样一个函数:
function TFormToDo.GetToDoData: IToDoData;
begin
if DMToDo = nil then
DMToDo := TDMToDo.Create(Application);
Result := DMToDo;
end;
上面的代码允许编写如下代码:
begin
GetToDoData.ToDoList(FToDos);
ListView1.BeginUpdate;
try
//populate the list
finally
ListView1.EndUpdate;
end;
end;
这不会产生内存泄漏吗?至少在窗户上。我是 delphi 的新手,所以我可能会失败,但我在网上读到 Android 和 IOs 有 ARC,所以不用担心最后尝试。
Windows 没有 ARC,所以我必须使用 try .. finally 除非有像 TInterfacedObject 这样的实现(这里没有)。那么这是一个错误吗?
该应用程序是关于一个待办事项应用程序,您可以在其中编写/读取/保存您的笔记。数据模块具有FireDAC访问组件,接口方法用于访问数据库。这是为了保持 UI 和数据库内容之间的分离。