16. juli 2010 - 14:01
Der er
2 kommentarer og
1 løsning
Stringbuilder kan ikke læse resterende linier
Hvis jeg har en textbox udfyldt som eksemplet herunder.
AAA
bbb
ccc
d
EEE
fff
Så kan en stringbuilder ikke læse alle linier efter linien med et enkelt "d" efterfulgt af CR+LF. Den er simpelthen tom. Linieantallet hentes korrekt.
Problem: <et tegn><efterfulgt af CR+LF>
Herunder er min kode:
Dim LineCount As Integer = SendMessage(Ctrl.Handle, EM_GETLINECOUNT, 0, 0)
Dim Buffer As StringBuilder
For LineIndex As Integer = 0 To LineCount - 1
' Read text from line X into buffer
Buffer = New StringBuilder(256)
SendMessage(Ctrl.Handle, EM_GETLINE, LineIndex, Buffer)
' Print text from buffer
Grphcs.DrawString(Buffer.ToString(), Ctrl.Font, Brush, X, _Y, StrF)
Next
Er der nogen der kan hjælpe med mit problem?
23. august 2010 - 20:41
#2
Hi
jeg ku ikke se din API kald og variablerne, derfor kunne ikke genskabe problemet. Men se om nedenstående virker.
Private Const EM_GETLINECOUNT As Integer = &HBA
Private Const EM_GETLINE As Integer = &HC4
Private Const EM_LINELENGTH As Integer = &HC1
Private Const EM_LINEINDEX As Integer = &HBB
Private Declare Function SendMessageINT Lib "user32.dll" _
Alias "SendMessageA" (ByVal hWnd As IntPtr, _
ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As IntPtr) As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim LineCount As Integer = SendMessageINT(TextBox1.Handle, EM_GETLINECOUNT, 0, IntPtr.Zero)
Dim counter As Integer = 0
Dim LineIndex As Integer = 0
Dim lineLength As Integer
Dim curLine As String = ""
Dim stringPTR As IntPtr
For counter = 0 To LineCount - 1
LineIndex = SendMessageINT(TextBox1.Handle, EM_LINEINDEX, counter, IntPtr.Zero)
lineLength = SendMessageINT(TextBox1.Handle, EM_LINELENGTH, LineIndex, IntPtr.Zero)
'Buffer
curLine = New String("0"c, lineLength + 1)
'Pointer til buffer
stringPTR = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(curLine)
SendMessageINT(TextBox1.Handle, EM_GETLINE, counter, stringPTR)
'Læser linien
curLine = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(stringPTR)
curLine = curLine.Substring(0, lineLength)
TextBox2.Text = TextBox2.Text + curLine + vbCrLf
'Ryd op
System.Runtime.InteropServices.Marshal.FreeHGlobal(stringPTR)
stringPTR = IntPtr.Zero
Next
End Sub