gpt4 book ai didi

delphi - 如何在对象存在之前将记录字段设置为 'Procedure of object'以便它可以运行

转载 作者:行者123 更新时间:2023-12-03 18:27:41 25 4
gpt4 key购买 nike

我知道的非常不时髦的标题。

我有一系列文本行,我需要按特定顺序执行某些操作。通过定义以下记录结构,我想出了一种方法:

TProcessOrderRecord = record
RecordTypes: TByteSet;
InitialiseProcedure: TPreScanProc;
ProcessProcedure: TProcessRecord;
FinaliseProcedure: TEndScanProc;
end;

AProcessOrderArray = array of TProcessOrderRecord;

Initialise 倾向于调用一个构造函数,该构造函数将填充宿主对象中的一个字段。

Process 将是对象上的一个过程,它将为与 RecordTypes 中的一种记录类型匹配的每个文本行调用。

Finalize 将倾向于调用析构函数并可能在它知道已处理完整的记录集时进行任何检查。

处理这个数组的方法非常简单:
procedure TImport.ScanTransferFile;
var
i: integer;
lArrayToProcess: AProcessOrderArray;
begin
lArrayToProcess := SetUpProcessingOrder(NLPGApp.ImportType);
for i := low(lArrayToProcess) to high(lArrayToProcess) do
begin
ProcessRecordType(lArrayToProcess[i].RecordTypes, lArrayToProcess[i].InitialiseProcedure, lArrayToProcess[i].ProcessProcedure, lArrayToProcess[i].FinaliseProcedure);
end;
end;

procedure TImport.ProcessRecordType(const RecordTypesToFind: TByteSet; PreScanProcedure: TPreScanProc; OnFindRecord: TProcessRecord; OnCompleteScan: TEndScanProc);
var
lLineOfText: string;
lIntegerRecordID: byte;
begin
if Assigned(PreScanProcedure) then PreScanProcedure;
try
if assigned(OnFindRecord) then
begin
Reader.GoToStartOfFile;
while not Reader.EndOfFile do
begin
lLineOfText := Reader.ReadLine;
lIntegerRecordID := StrToIntDef(GetRecordID(lLineOfText), 0);
if lIntegerRecordID in RecordTypesToFind then
begin
try
OnFindRecord(lLineOfText);
except
on E: MyAppException do
begin
// either raise to exit or log and carry on
end;
end;
end;
end;
end;
finally
// OnCompleteScan usually contains calls to destructors, so ensure it's called
if Assigned(OnCompleteScan) then OnCompleteScan;
end;
end;

我的问题是我想这样定义一个记录:
RecordTypes = [10]
InitialiseProcedure = ProcToCreateFMyObj
ProcessProcedure = FMyObj.do
FinaliseProcedure = ProcToFreeFMyObj

这编译得很好,但是当 ProcessProcedure 被调用时,因为在设置 ProcessProcedure 时 FMyObj 为 nil,即使现在设置了 FMyObj,TMyObj 的实例也是 nil。有没有什么干净的方法可以让记录在调用时而不是在第一次分配时指向 FMyObj 的实例?

目前我已经在宿主对象上使用了“调用者”方法,然后可以在需要时调用 FMyObj 实例,但这会创建一个包含许多单行方法的相当臃肿的对象。

编辑以澄清/复杂化问题

有时是 FObj 的一个实例可以处理多种类型的记录(通常如果它们具有主从关系)。在这种情况下, InitialiseProcedure第一个记录类型将创建 FObj , FinaliseProcedure的第二条记录将释放 FObj每条记录的 ProcessProcedure可以引用 FObj的不同程序( do1do2 )。

最佳答案

At present I have resorted to having 'caller' methods on the host object which can then call the FMyObj instance when needed, but this is creating quite a bloated object with lots of single-line methods.



这是正确的解决方案。由于实例在初始化时不可用,您别无选择。

当您使用 of object你正在定义一个叫做 method pointer 的东西.当您分配给方法指针类型的变量时,实例在分配点被捕获。与方法指针关联的实例没有动态解析的机制。实现这一目标的唯一方法是使用运行时委托(delegate),这是您当前正在做的。通常情况下,使用另一层间接来解决问题!

您的包含许多方法的记录看起来非常像 interface。 .我怀疑最优雅的解决方案将涉及 interface .也许在调用的时候你可以调用一个返回 interface 的函数。 .该函数将使用 FMyObj 的值在调用时定位到相应的接口(interface)。

关于delphi - 如何在对象存在之前将记录字段设置为 'Procedure of object'以便它可以运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com