Avatar billede badass Nybegynder
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?
Avatar billede badass Nybegynder
16. juli 2010 - 14:23 #1
Note: problemet opstår selvfølgelig ikke hvis man er i debugging mode i Visual Studio
Avatar billede hossein Nybegynder
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
Avatar billede badass Nybegynder
31. januar 2011 - 16:01 #3
...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester