Show/Hide Toolbars

XSharp

 

本例将转换 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”。