delphi - 如何在不更改库文件的情况下修改Delphi库文件中的常量?

标签 delphi constants delphi-10-seattle

我使用第三方库,我需要更改其常量。我想自定义库而不覆盖文件。 pas文件是一个库文件,不是一个可继承的类。

目前我可以通过编辑文件来实现我的目标

unit libraryconstants;

interface

uses
  System.Types;

const
  constant1 = 'foo';
  constant2 = 32;
  constant3: Integer = 12;
  constant4: TSize = (cx: 32; cy: 32);

不知何故,我需要像这样更改constant4:

constant4: TSize = (cx: 16; cy: 8);

我可以编辑libraryconstants.pas并保存它,但是当我更新库时(因为发布了新版本)我将丢失此更改。当然,我可以提醒我每次更新库时应用此更改,但如果可能的话我想避免这种情况。

由于该常量不是已发布的属性,我不知道如何实现所需的结果。我希望尽可能少地干扰库代码。

我正在寻找一个我不知道的 Delphi 语言“技巧”。

谢谢。

最佳答案

我错误地认为类型常量存储在只读存储器中,就像在其他语言中一样。事实并非如此。因此,您可以通过指针访问该类型常量来轻松更改它的值。

PSize(@constant4).cx := 16;
PSize(@constant4).cy := 8;

将此代码添加到您的某个单元的初始化部分。您需要确保它运行得足够早,以便在执行依赖于常量的任何代码之前实现更改。

我认为我的误解是由于知道字符串文字存储在只读存储器中而产生的。所以我假设类型常量也是如此。我怀疑当添加可分配类型常量“功能”时,编译器开关只是使编译器拒绝写入类型常量,而不是将它们移动到只读内存。

请注意,我所说的只读内存在桌面编译器上是正确的。我不确定移动编译器是否如此。很可能此代码会因移动编译器上的运行时内存保护错误而失败。在这种情况下,您需要在写入之前暂时更改内存保护。

关于delphi - 如何在不更改库文件的情况下修改Delphi库文件中的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49426067/

相关文章:

android - 如何使用 TArc 制作 Google 加载微调器?

c++ - 为什么 C++ 不允许在复制构造函数中将非 const 转换为 const?

android - 如何更改 Delphi 中 TCalendar 组件的单元格颜色?

delphi - 如何禁用其他使用 CEF 渲染网页的应用程序的硬件加速?

listview - 在 RAD Studio 10 Seattle 中,我的 ListView 的属性 ".Text"和 ".Detail"带有下划线作为错误。我该如何解决?

sockets - TServerSocket : How check if a specific client on ListView still is connected before send message?

delphi - 使用 ReadProcessMemory 扫描整个进程内存

delphi - 如何实现自定义TGraphicControl.OnResize?

java - 在 Java 中使用 "Constant"对象

c - C中的const限定符深入剖析