【问题标题】:How to overcome inconsistent behavior of TX Text Control ActiveX in VB6?如何克服 VB6 中 TX 文本控件 ActiveX 的不一致行为?
【发布时间】:2014-05-19 14:08:54
【问题描述】:

在我正在开发的软件中,我必须允许用户选择 .RTF 格式的文档并将其加载到 TX 文本控件中。然后从每一行(第 2 列)中提取数据并将其保存到另一个 TX Text Control。

相关文档包含一个表格,其中包含所有文本。

这是我用来从每行的第二列中提取文本的代码:

With TXTextControl1

    .SetFocus
    .ResetContents
    .LoadSaveAttribute(txLoadImages) = True
    .Load fn, 0, 5
    DoEvents

    I = .TableNext(I, CurTableID)
    If CurTableID = 0 Then
      MsgBox "Document Format is NOT Proper", vbInformation, App.Title
      Screen.MousePointer = vbNormal
      Exit Sub
    End If

    For J = 1 To .TableRows(CurTableID) - 1 'Step 7 'Loop through all Rows
      .SelStart = .TableCellStart(CurTableID, J, 2) - 1
      .SelLength = .TableCellLength(CurTableID, J, 2)
      Debug.Print "Row: " & J, .TableColAtInputPos
      List1.AddItem "Row: " & J & " Col Cnt: " & .TableColAtInputPos & IIf(.TableColAtInputPos = 0, " <= Problem Here", "")
      TXTextControl2.SelText = J & vbCrLf
      TXTextControl2.RTFSelText = .RTFSelText
      TXTextControl2.SelText = vbCrLf
      DoEvents
    Next J
  End With

但此代码似乎在选择单元格内容时显示了 TX 文本控件的不一致行为。有时它会选择整行而不是单元格内容。

为了证明这种不一致,我创建了一个演示,它可以是downloaded from here

任何想法如何克服这个错误?

TIA

杨洋

【问题讨论】:

  • 我不确定是否有人知道这个控件可能是什么。有这个标签的两个帖子都是你的,没有人回答。
  • 您不能依靠回答者下载演示来查看问题所在。没有人会冒着安全风险安装它来检查您的演示。因此,假设您对自己的情况一无所知,以前从未见过 TX 文本控制,我正在向您描述问题。应该很快清楚的是,在我告诉您“有时它会选择整行而不是单元格内容”之后,您仍然无法获得帮助我解决问题所需的信息。假设您指出应该使用哪些代码进行选择和预期的行为。

标签: vb6 activex txtextcontrol


【解决方案1】:

是的。转储“TX 文本控件”并使用 VB6 RTF 控件。您可以通过直接访问 TOM 来欺骗此控件以支持 1.0 之后的更高版本(它因向后兼容 VB 的早期版本而被削弱)。 (我借用this link 的解释。)

除了 RichTextBox 引用,您还需要添加对 TOM 的引用(如果未列为可用引用,请浏览riched20.dll)。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_USER = &H400&
Private Const EM_GETOLEINTERFACE = (WM_USER + 60)

Dim myIUnknown As IUnknown
Dim tomDoc As ITextDocument

SendMessage rtbText.hwnd, EM_GETOLEINTERFACE, 0&, myIUnknown
Set tomDoc = myIUnknown

这将使您直接引用 RTF 控件中 TOM 的底层实现。 ITextDocument 是顶级对象,here's Microsoft 的 TOM 参考。玩得开心! :)

【讨论】:

  • 感谢您的提示。我一定会检查出来的。但实际上对于这个特定的项目,采用其他任何东西是不可能的,因为我们的客户坚持我们使用 TX Text Control。
  • 另一个问题是:VB6 提供的 RTF 是否正确处理文档中的表格?
  • VB6 RTF 控件使用 RTF 1.0 规范,除非您欺骗它使用更高版本的规范。您需要查找 TOM,并查看最新版本是否处理表格。我认为确实如此,但我会让你去研究它。关键是使用 TOM 允许您访问更高版本的 RTF。但是,通常 TOM 比 Office 使用的 RTF 版本落后一两个版本,因此您必须小心一点。
【解决方案2】:

我已经用不同的方式解决了这个问题。

我所做的是在 MS Word 中打开有问题的文档,并在第一列之后添加一个额外的列并保存文档。

现在我正在 TX 文本控件中加载文档并以编程方式删除添加的(第二列),然后一切似乎都运行良好。

我的主要测试表明,至少对于相关文档而言,问题已得到解决。

感谢大家提供宝贵的提示、技巧和提示。

问候,

杨洋

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2023-03-20
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多