在网上搜索时,我在VB中只有几行代码用于从EMF文件中提取图像。

我试图将其转换为Delphi,但不起作用。

帮我将这段代码转换为delphi。 通用标签

有帮助吗?

解决方案

您发布的是 EnumMetaFileProc 回调函数,所以我们从签名开始: 通用标签

首先要声明一堆变量,但是由于我不知道我们真正需要哪个变量,因此我现在将跳过该变量,并且VB的类型系统比Delphi更有限。我将在需要它们时声明它们;您可以将它们全部移到函数顶部。

接下来使用大多数相同的方法调用 PlayEnhMetaFileRecord 传递给回调函数的参数。该函数返回一个布尔值,但随后代码将其忽略,因此我们不要再为lRet打扰了。 通用标签

接下来,我们初始化RecordCount。它被声明为静态的,这意味着它保留了从一个调用到下一个调用的值。看起来有点可疑;它可能应该作为指针传递给lpClientData参数,但是现在我们不要偏离原始代码太远。 Delphi用类型化常量来处理静态变量,它们需要可修改,因此我们将使用$ J指令: 通用标签

接下来,我们将一些元记录复制到另一个变量中: 通用标签

将TMetaRecord结构复制到TEMR结构似乎有点奇怪,因为它们并不十分相似,但是我又不想过多地偏离原始代码。

接下来是有关iType字段的案例说明。第一种情况是1: 通用标签

下一种情况是它是emr_StretchDIBits。它会复制更多的元记录,然后分配其他一些指针来引用主数据结构的子节。 通用标签

然后是看似功能的实质,我们在其中使用上一代码提取的DIBits创建一个显示上下文和一个位图,以与其配合使用。 通用标签

最后,我们为回调函数分配一个返回值: 通用标签

因此,有您的翻译。将其包装在begin-end块中,删除我的注释,然后将所有变量声明移到顶部,您应该拥有与您的VB代码等效的Delphi代码。但是,所有这些代码最终所做的只是生成内存泄漏。 hBitmap变量是该函数的局部变量,因此该函数返回后,它所保存的位图句柄就会泄漏。不过,我认为VB代码适合您,因此我想您还有其他计划来使用它。

如果您正在使用图元文件,是否考虑过使用 TMetafile “图形” 单元中的类?它可以使您的生活更轻松。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top