如何克服VB6中TX文本控件ActiveX的不一致行为?

如何克服VB6中TX文本控件ActiveX的不一致行为?,vb6,activex,txtextcontrol,Vb6,Activex,Txtextcontrol,在我正在开发的软件中,我必须允许用户选择.RTF格式的文档并将其加载到TX文本控件中。然后从每行(第2列)提取数据并将其保存到另一个TX文本控件 该文件包含一个表,其中包含所有文本 下面是我用来从每行的第二列提取文本的代码: With TXTextControl1 .SetFocus .ResetContents .LoadSaveAttribute(txLoadImages) = True .Load fn, 0, 5 DoEvents I

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

该文件包含一个表,其中包含所有文本

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

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
使用TXTextControl1
.SetFocus
.重置目录
.LoadSaveAttribute(txLoadImages)=真
.载荷fn,0,5
多芬特
I=.TableNext(I,CurTableID)
如果CurTableID=0,则
MsgBox“文档格式不正确”,vbInformation,应用程序标题
Screen.MousePointer=vbNormal
出口接头
如果结束
对于J=1到.TableRows(CurTableID)-1“步骤7”循环遍历所有行
.SelStart=.TableCellStart(CurTableID,J,2)-1
.SelLength=.TableCellLength(CurTableID,J,2)
调试。打印“行:”&J、.TableColAtInputPos
List1.AddItem“Row:”&J&“Col Cnt:”&.TableColAtInputPos&IIf(.TableColAtInputPos=0,”Yes。转储“TX文本控件”并使用VB6 RTF控件。通过直接访问TOM,可以诱使此控件支持1.0以上的版本(由于与早期版本的VB向后兼容而被禁用)。(我想借用一下我的解释。)

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


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

我以不同的方式解决了这个问题

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

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

我的初步测试表明,至少对于所讨论的文档,问题已经解决

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

问候,


Yogi Yang

我不确定是否有人知道这个控件可能是什么。有这个标签的两篇帖子都是你的,没有人回答。你不能依靠回答者下载演示来了解问题所在。没有人会冒着安全风险安装它来检查你的演示。所以,假装你对你的sit一无所知我以前从未见过TX文本控件,我正在向您描述这个问题。在我告诉您“有时它选择整行而不仅仅是单元格内容”之后,应该很快就会清楚"你仍然没有足够的信息来帮助我解决这个问题。假设你指出什么代码应该做选择和预期的行为。谢谢你的提示。我一定会检查它。但实际上,对于这个特定的项目,采用任何其他的方法都是不可能的,因为我们的客户坚持要我们使用TX Text C控制。另一个问题是:VB6提供的RTF是否正确处理文档中的表?VB6 RTF控件使用RTF 1.0规范,除非您欺骗它使用更高的规范。您将要查找TOM,看看最新版本是否处理表。我想是的,但我让您研究一下。重点是我们ing TOM允许您访问RTF的更高版本。但是,通常情况下,TOM比Office使用的RTF版本落后一两个版本,因此您必须小心一点。
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