本例将转换 C:\cavo28SP3\Samples\Controls\Richedit 文件夹中的 VOPAD AEF 文件。
使用与第一个示例相同的选项进行转换后,我们的文件夹结构将如下所示:
C:\XporterOutput\Examples\VoPad
C:\XporterOutput\Examples\VoPad\VoPad
文件 |
包含 |
VoPad.sln |
VS 解决方案文件 |
VoPad.viproj |
XIDE 项目文件 |
项目文件夹包含以下文件:
文件 |
包含 |
!Readme!.prg |
模块源代码 |
image.IMAGE.rc |
VS 的图像资源 |
image.prg |
模块源代码 |
image.rc |
用于 XIDE 的图像资源 |
Manifest.CREATEPROCESS_MANIFEST_RESOURCE_ID.rc |
用于 VS 的 Manifest 资源 |
Manifest.prg |
模块源代码 |
Manifest.rc |
XIDE Mainfest 资源 |
PadHelp About.HelpAbout.rc |
关于 VS 资源的帮助 |
PadHelp About.HELPABOUT.xsfrm |
关于 VS 二进制表单的帮助 |
PadHelp About.POWVOBMP.rc |
用于 VS 的 Splash资源 |
PadHelp About.prg |
模块源代码 |
PadHelp About.rc |
XIDE 的帮助资源 |
PadMenus.StandardPadMenu.rc |
用于 VS 的菜单资源 |
PadMenus.StandardPadMenu.xsmnu |
用于 VS 的二进制菜单 |
PadMenus.StandardPadMenu_Accelerator.rc |
用于 VS 的加速器资源 |
PadMenus.prg |
模块源代码 |
PadMenus.rc |
用于 XIDE 的资源 |
PadShell.IDI_VOPADICON.rc |
用于 VS 的应用程序图标资源 |
PadShell.prg |
模块源代码 |
PadShell.rc |
用于 XIDE 的应用程序图标资源 |
PadStart.prg |
模块源代码 |
PadWin.oMarginDialog.rc |
用于 VS 的表单资源 |
PadWin.oMarginDialog.xsfrm |
用于 VS 的表单二进制文件 |
PadWin.prg |
模块源代码 |
PadWin.rc |
XIDE 的表单资源 |
Vopad.viapp |
XIDE 应用程序 |
Vopad.xsproj |
VS 项目 |
在 VS 中打开项目并编译。您将看到以下错误/警告
PadWin.prg(473,1): warning XS1030: #warning: 'The following method did not include a CLASS declaration'
PadWin.prg(480,1): warning XS1030: #warning: 'The following method did not include a CLASS declaration'
PadHelp About.prg(78,3): error XS9046: Cannot assign to 'font' because it is a 'method'
PadHelp About.prg(81,8): error XS0119: 'TextControl.Font(params __Usual[])' is a method, which is not valid in the given context
PadHelp About.prg(88,3): error XS9046: Cannot assign to 'font' because it is a 'method'
PadHelp About.prg(91,8): error XS0119: 'TextControl.Font(params __Usual[])' is a method, which is not valid in the given context
PadWin.prg(166,19): error XS1061: 'RichEdit' does not contain a definition for 'RTFChangeFont' and no extension method 'RTFChangeFont' accepting a first argument of type 'RichEdit' could be found (are you missing a using directive or an assembly reference?)
让我们双击错误/警告来检查一下:
首先是警告。这些是 XPorter 发现代码中存在问题而插入的 #warning 预处理器语句生成的:
•源代码中有一个 ACCESS FilterIndex CLASS SaveAsDialog。这增加了对 GUI 类中一个类的访问。这在 .Net 中是不允许的。
XPorter 创建了一个特殊的 SaveAsDialog 子类来保存这个额外的属性。
幸运的是,这个 ACCESS 已经不再需要了,因为它已经被添加到图形用户界面类中。
因此我们可以完全删除这段代码。
•有一个 RTFChangeFont CLASS RichEdit 方法。与 SaveAsDialog:FilterIndex 的问题相同。在这种情况下,该方法是必要的。该方法已被移至 RichEdit 的子类中。不过,由于原始代码仍指向 RichEdit 类,因此可能会出现运行时问题,因为该方法不是 richedit 类的一部分。
这里有两种可能的解决方案:
1.将方法更改为扩展方法
2.更改使用 RichEdit 类的代码,以使用更改后的类
方案 1 是最好的选择,因为我们没有使用 RichEdit 类的任何私有或受保护属性。为此,请将代码从
CLASS RichEdit_external_class INHERIT RichEdit
METHOD RTFChangeFont()
etc
to
STATIC CLASS RichEditExtensions
STATIC METHOD RTFChangeFont( SELF oEdit as RichEdit) AS VOID
LOCAL oFontDlg AS StandardFontDialog
oFontDlg := StandardFontDialog{oEdit:Owner}
oFontDlg:FontColor := oEdit:TextColor
oFontDlg:Font := oEdit:ControlFont
oFontDlg:Show()
oEdit:TextColor := oFontDlg:FontColor
oEdit:ControlFont := oFontDlg:Font
END CLASS
扩展方法可以很好地增强现有类,但有一个缺点: 在本例中这不是问题,但在其他地方可能会成为问题。
现在我们添加了一个扩展方法,它可以像普通方法一样使用。
这一改动也解决了 PadWin.prg 中的错误。
再看看其他问题:它们都与 TextControl 类中的字体属性有关。不幸的是,VO 类库为 TextControl 类提供了一个 Font() 方法和一个 Font() Access/Assign。.Net不允许使用同名的方法和属性。
在将 VO Gui 类移植到 Vulcan 时,我们决定将 Font 属性重命名为 Controlfont。因此,我们需要进行更改。只需双击错误并更改
:Font
to
:ControlFont
(4次)
之后,代码将编译并运行。点击工具栏上的字体按钮将显示字体对话框(来自 RTFChangeFont 扩展方法)。
对代码所做的一些修改(省略了示例 1 中的修改):
•Manifest.prg 为空,但已包含,因为它有一个依赖资源。
您可以在 XSharp 示例文件夹中找到 “Code before ”和 “Code after”。