- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通常在程序开始时初始化一些变量,例如 TStringList 类型,然后释放它们。单独初始化感觉很尴尬,例如
listOne := TStringList.Create;
listTwo := TStringList.Create;
listTree := TString.Create;
{ etc, etc}
我更喜欢这样的过程,最后用另一个 for Free 来结束它们:
CreateStrings(listOne, listTwo, listThree);
CreateStrings([listOne, listTwo, listTree]); //using an array
是否有一个过程可以对可变数量的对象执行类似的操作?
如果不能对任意对象类型执行此操作,至少对相似类型或具有相同 Create 签名的类型如此?
最佳答案
我能想到的最好的办法是:
PROCEDURE CreateObjects(ClassType : TClass ; VAR O1); OVERLOAD;
BEGIN
TObject(O1):=NIL;
TObject(O1):=ClassType.Create
END;
PROCEDURE CreateObjects(ClassType : TClass ; VAR O1,O2); OVERLOAD;
BEGIN
TObject(O1):=NIL; TObject(O2):=NIL;
TObject(O1):=ClassType.Create; TObject(O2):=ClassType.Create
END;
PROCEDURE CreateObjects(ClassType : TClass ; VAR O1,O2,O3); OVERLOAD;
BEGIN
TObject(O1):=NIL; TObject(O2):=NIL; TObject(O3):=NIL;
TObject(O1):=ClassType.Create; TObject(O2):=ClassType.Create; TObject(O3):=ClassType.Create
END;
PROCEDURE FreeObjects(CONST Objects : ARRAY OF TObject);
VAR
O : TObject;
E : Exception;
ADR : POINTER;
BEGIN
E:=NIL;
FOR O IN Objects DO TRY
O.Free
EXCEPT
ON X:Exception DO BEGIN
E:=X; ADR:=ExceptAddr
END
END;
IF Assigned(E) THEN RAISE E AT ADR
END;
PROCEDURE TMainForm.FormCreate(Sender : TObject);
VAR
SL1,SL2 : TStrings;
BEGIN
CreateObjects(TStringList,SL1,SL2);
FreeObjects([SL1,SL2])
END;
您需要为要同时创建的每个对象创建一个重载过程。同一 CreateObjects 调用中的所有对象都将创建为相同类型(您将作为第一个参数提供),并且只能使用该类型的无参数构造函数来创建。
在构造之前进行 NIL 赋值的原因是为了确保传入的变量始终具有有效值(NIL 或指向请求类型的类)。这也意味着与普通代码相比:
O:=TObject.Create;
TRY
// Blah, Blah
FINALLY
O.Free
END;
你应该使用
TRY
CreateObjects(TObject,O1,O2);
// Blah, Blah
FINALLY
FreeObjects([O1,O2])
END;
即。将对象的创建移至 TRY/FINALLY block 内。
如果你是 FreeAndNIL 的支持者,那么你可以这样做:
PROCEDURE FreeAndNilObjects(VAR O1,O2); OVERLOAD;
BEGIN
TRY
FreeAndNIL(O1)
FINALLY
FreeAndNIL(O2)
END
END;
PROCEDURE FreeAndNilObjects(VAR O1,O2,O3); OVERLOAD;
BEGIN
TRY
FreeAndNIL(O1)
FINALLY
TRY
FreeAndNIL(O2)
FINALLY
FreeAndNIL(O3)
END
END
END;
这个有点奇怪的构造确保在所有传入的对象上调用 FreeAndNIL,但也意味着如果发生任何异常,它将是您将收到的最后一个引发的异常,并且任何先前的异常都将被丢失的。然而,它确实确保所有对象都被(尝试)释放。
编辑:更新了 FreeObjects 以正确处理任何对象的 .Free 调用中可能发生的任何异常。与 FreeAndNilObjects 过程一样,它将处理除最后一个异常之外的任何异常,并在确保至少尝试在每个传入对象上调用 .Free 后重新引发此异常。
关于freepascal - 是否有一个过程可以在运行时在单个过程中初始化可变数量的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20660146/
平台:Lazarus 1.1、FreePascal 2.7.1、Win 7 32 位。 我有一个字符串值如下: FileName[12345][45678][6789].jpg 默认情况下(假设这是默
我想使用 Atom 编辑器来学习 Pascal。从编辑器编译和运行简单 Pascal 文件的正确方法是什么?我在 Windows 上使用 FreePascal 编译器。 编辑:我使用 build 得到
我通常在程序开始时初始化一些变量,例如 TStringList 类型,然后释放它们。单独初始化感觉很尴尬,例如 listOne := TStringList.Create; listTwo := TS
我在 Mac Mavericks 上使用 fpc 2.6.2 和 Lazarus 1.0.12 我创建了一个这样的变量 var MyVar : 7..200; 如果我给 MyVar 赋值在 7.
我有 Free pascal 代码,我有来自 a/b 的实数 3.285714287142857E+000。 program threedigits; var a,b:real; begin a:=2
我需要将一些代码从 FreePascal 移植到 C。我是一名专业的 C 开发人员,但对 Pascal 一无所知。大多数代码可以很容易地移植,但有一行代码让我很头疼。这到底应该做什么: New(new
我在 java 和 freepascal(lazarus) 应用程序之间的通信有问题。我使用套接字。它们正确连接。一切都很顺利,直到我想从一个应用程序向另一个应用程序发送一些东西。在java而不是“a
我需要在使用Lazarus / Freepascal开发的程序中加密一些文本,但是我应该能够将它们作为文本加载并解密,而不是二进制文件,因为我需要将它们保存在TStrings类型属性中。 哪种算法适合
这是我的问题:我想创建一个记录类型,其中在变体记录的情况下,一些(但不是全部)将具有特定字段。根据wiki ,这是完全合法的。然而,当我尝试编译以下代码时: program example; {$mo
我正在寻找一种方法来获取 FPC 下控制台视频的行数和列数。我正在寻找最便携的方式,但至少可以在 Windows 下(最好也在 Linux 下)工作。 从旧的 Turbo Pascal 时代开始,我写
我有一个具有指定结构的文本文件,即(对于每一行):char、space、char、space、double value、endline。例如 q w 1.23 e r 4.56 t y 7.89 在
我必须在 FreePascal 中制作随机二维数组 (4x4)。每个元素必须介于 0 和 100 之间。 例如: 12 99 1 85 43 75 5 11 0 100 77 31 64 15 9
这是我第一次在这个网站上。通常,我在旧帖子中找到回复没有问题,但我的实际问题没有成功。 我想知道如何使用 RTTI 函数在运行时知道 Lazarus/FPC 下记录的属性/成员?我知道如何为类(Tpe
我们在 Turbo Pascal 中有一个旧应用程序,它可以将其内部状态保存到文件中,并且我们需要能够在 C# 应用程序中读取/写入该文件。 旧应用程序通过转储各种内存中数据结构来生成文件。在一个地方
我有一些 Delphi/汇编代码,可以在 Win32、Win64 和 OSX 32 上编译并正常工作 (XE2)。但是,由于我需要它在 Linux 上工作,所以我一直在考虑编译它的 FPC 版本(所以
我正在尝试找出是否有一种方法可以完成类似于 Delphi 的增强 RTTI 功能的操作。 据我所知,FPC 不提供自 Delphi 2010 以来出现在 Delphi 中的 RTTI 功能。但我想找到
是否有任何工具允许对 Free Pascal 源进行静态代码分析?我更喜欢允许检查整个 Lazarus 项目的解决方案。 最佳答案 静态代码分析是一项通用技术,本身并不是一种工具。 Lazarus I
由于性能问题,我想尝试将 Freepascal 函数(SHA1Update,来自 SHA1 单元)转换为汇编。我使用 Freepascal 2.6.4 和 Lazxarus 1.2.4。 原因是,我有
我的主窗体中有一个 ListView ,我希望另一个非模态窗体能够添加内容。 我如何将 ListView 传递给非模态表单? 我希望能够修改它的表单由 MainForm 在单击按钮时显示,只需使用 F
我有一个当前仅使用 SHA1 对文件进行哈希处理的程序。没有其他选择。它使用 Lazarus 和 Free Pascal 编译器中的 SHA1 散列函数对它们进行散列。 我已经通过使用 DCPCryp
我是一名优秀的程序员,十分优秀!