在我正在开发的软件中,我必须允许用户选择。rtf格式的文档并在TX文本控制中加载它。然后从每行(第2列)提取数据,并将其保存到另一个TX文本控件。
所讨论的文档包含一个Table,其中包含所有文本。
下面是我用来从每行的第二列提取文本的代码:
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文本控件在选择单元格内容时不一致的行为。有时它会选择整行而不是单元格的内容。
为了演示这种不一致,我创建了一个可以从这里下载的演示。
有办法克服这个bug吗?
TIA
瑜珈杨
是。转储"TX文本控件",并使用VB6 RTF控件。您可以通过直接访问TOM来欺骗此控件,使其支持1.0之后的版本(它无法与早期版本的VB向后兼容)。(我借用这个链接来解释)
除了RichTextBox引用之外,您还需要添加TOM引用(如果没有列出可用的参考,请浏览richhed20 .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是顶级对象,这是微软的TOM引用。玩得开心!:)
我已经用另一种方法解决了这个问题。
我所做的是在MS Word中打开有问题的文档,在第一列之后添加一个额外的列,然后保存文档。
现在我在TX文本控件中加载文档,并以编程方式删除添加的(第二列),然后一切似乎都运行良好。
我的初步测试表明,至少对于有问题的文档,问题已经解决了。
感谢大家的宝贵建议、技巧和提示。
问候,
瑜珈杨