Delphi 如何获取可视组件属性的原始文本?

Delphi 如何获取可视组件属性的原始文本?,delphi,delphi-7,Delphi,Delphi 7,我希望能够在运行时读取组件(已发布)属性(可能)更改后的原始文本 上下文是我正在编写我们在应用程序中使用的翻译库的扩展。该图书馆是旧的,不再由供应商支持,所以我自己的工作 不幸的是,库的编码方式使它无法从ISAPI Dll(例如,在应用程序中)使用。字典部分可以工作,但自动翻译组件不能(主要是因为它试图覆盖内存中的某些代码部分)。因此,我试图在重写不起作用的部分(实际上,只有我感兴趣的元素)的同时,挽救起作用的部分(表单翻译工具和字典存储) 然而,当一个组件文本属性被翻译后,它将不再与原始文本匹

我希望能够在运行时读取组件(已发布)属性(可能)更改后的原始文本

上下文是我正在编写我们在应用程序中使用的翻译库的扩展。该图书馆是旧的,不再由供应商支持,所以我自己的工作

不幸的是,库的编码方式使它无法从ISAPI Dll(例如,在应用程序中)使用。字典部分可以工作,但自动翻译组件不能(主要是因为它试图覆盖内存中的某些代码部分)。因此,我试图在重写不起作用的部分(实际上,只有我感兴趣的元素)的同时,挽救起作用的部分(表单翻译工具和字典存储)

然而,当一个组件文本属性被翻译后,它将不再与原始文本匹配,也不会在字典中找到,这一事实阻止了我

这段代码应该在Delphi7中工作,尽管我计划在有足够的时间时尽快将其迁移到XE5

组件文本属性转换后,将不匹配 原文再也找不到了,字典里也找不到了。”

你能自己保留一个单独的查找映射,将翻译后的内容映射到原始内容吗?每当字符串被其翻译内容替换时,都要添加到该列表中。这样你就可以随意在原文和译文之间来回走动


在XE5中,最简单的方法是使用TDictionary。在D7中,您可能需要滚动自己的容器。

您可以创建一个过程,将原始值保存到列表或某个数组中,然后在表单的Loaded方法中调用该过程(您必须重写它,不要忘记在它的末尾调用inherited。)然后在该列表中搜索目录项。从DFM加载所有组件后,在FormCreate之前调用表单的Loaded方法。因此,您可以在这里找到所有原始属性。

据我所知,您想要的是在编译时获取存储在DFM中的字符串属性的值

因此,我想最可靠的方法是DFM本身。据我所知,DFM总是作为资源存储在二进制文件中(尽管可能有一些例外…)。我不久前也考虑过做类似的事情。由于研发时间不多(我只有几个小时),我没能让它正常工作,但如果你想调查一下的话,我会从

TCustomForm.Create
  InitInheritedComponent
    InternalReadComponentRes
      TStream.ReadComponent
        TReader.ReadRootComponent

也许有人可以确认这种方法是否可行,需要注意的是什么,但在此之前,我认为这是一个有效的研究方向。

两种解决方案非常相似,但坦率地说,这似乎是一个糟糕的解决方法。如果我找不到更好的,我会实现它。你用的是什么翻译库?(顺便说一句,这可能值得一提)如果它是旧的和不受支持的,你是否考虑过完全转移到另一个,而不是拯救它的一小部分并使用像这样的黑客/丑陋的代码?不是真的:反正它是一个死产品。他们从源代码翻译到资源翻译,把客户抛在了身后。多年来,我不得不修正他们代码中的问题基调,这样最终的结果就不会像原来的那样了