Замена richTextBox'у

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Замена richTextBox'у

Сообщение 13GHOST » 01.11.2006 (Ср) 15:23

Как известно RichTextBox не может держать длину более 32000 символов. Вот хотел узнать существует ли какая перспектива RichTextBox'у? Что бы он мог держать большую длину, или вообще какаие либо лучшие замены ему :?: :roll:
заранее спасибо...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Re: Замена richTextBox'у

Сообщение GSerg » 01.11.2006 (Ср) 15:26

13GHOST писал(а):Как известно RichTextBox не может держать длину более 32000 символов.

Откуда сия глупость?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 01.11.2006 (Ср) 15:28

нуу.... как откуда из опыта!
вы попробуйте - программа просто зависнет если длина сиволов превысит данное число

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.11.2006 (Ср) 15:29

Драйвера надо переустановить.
Lasciate ogni speranza, voi ch'entrate.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 01.11.2006 (Ср) 15:30

alibek драйвера? и они тут причем?
просто я пишу чат, и он всегда зависал при превышении длины, причем не только у меня!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.11.2006 (Ср) 15:32

Я открыл мегабайтную текстовую книгу в риче только что.

Рассмотрите вариант измерения коэффициента кривизны рук, использованного при написании того самого чата, пожалуйста...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 01.11.2006 (Ср) 15:38

создал пустой проект с Richtextbox'ом - все нормально, а там виснет! с чем это может быть связано?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.11.2006 (Ср) 15:41

телепаты в отпуске
:lol:

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 01.11.2006 (Ср) 15:59

нашел причину - виснет вот из-за этой строчки:
POS = SendMessage(rch.hwnd, EM_CHARFROMPOS, 0&, pt) если длина больше 32000
мне эта строчка нужна для опредиления слова над которым находится курсор

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.11.2006 (Ср) 16:02

типы данных какие и как объявлена SendMessage :?:
pt?
POS?

Код: Выделить всё
Form1, add RichTextBox
Option Explicit
Private Declare Function SendMessageAny Lib "USER32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetCursorPos Lib "USER32" (lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "USER32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Private Type POINTAPI
    x As Long
    y As Long
End Type
Private Const EM_CHARFROMPOS& = &HD7

Private Sub RichTextBox1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim pt As POINTAPI, lSelStart As Long

    GetCursorPos pt
    ScreenToClient RichTextBox1.hWnd, pt
    lSelStart = SendMessageAny(RichTextBox1.hWnd, EM_CHARFROMPOS, 0&, pt)
    Caption = lSelStart
End Sub
Последний раз редактировалось Konst_One 01.11.2006 (Ср) 16:11, всего редактировалось 1 раз.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 01.11.2006 (Ср) 16:05

Код: Выделить всё
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
    Dim pt As POINTAPI
    Dim POS As Long

код работает корректно на длине менее 32000

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 01.11.2006 (Ср) 16:11

кароче вот вся процерура по опредилению слова под курсором:
Код: Выделить всё
Public Function RichWordOver(rch As RichTextBox, X As Single, Y As Single) As String
    Dim pt As POINTAPI
    Dim POS As Long
    Dim start_pos As Integer
    Dim end_pos As Integer
    Dim ch As String
    Dim Txt As String
    Dim txtlen As Integer
    Dim i As Integer, j As Integer
   
    pt.X = X \ Screen.TwipsPerPixelX
    pt.Y = Y \ Screen.TwipsPerPixelY

    On Error Resume Next
    POS = SendMessage(rch.hwnd, EM_CHARFROMPOS, 0&, pt)
   
    If POS <= 0 Or POS >= Len(rch.Text) Then
        RichWordOver = ""
        Exit Function
    End If
   
    Txt = ""
    For i = POS To 1 Step -1
        ch = Mid(rch.Text, i, 1)
        If ch = " " Or _
           ch = "," Or _
           ch = """" Or _
           ch = "'" Or _
           ch = Chr(9) Then
            start_pos = i
            GoTo haha
        End If
    Next i
haha:
    Txt = ""
    For i = POS To Len(rch.Text)
        ch = Mid(rch.Text, i, 1)
        If ch = " " Or _
           ch = "," Or _
           ch = """" Or _
           ch = "'" Or _
           ch = Chr(9) Then
            end_pos = i
            Exit For
        End If
    Next i
   
    If end_pos > Len(rch.Text) Or end_pos <= 0 Then end_pos = Len(rch.Text)
   
    RichWordOver = RightR(Replace(Mid(rch.Text, start_pos, end_pos - start_pos), Chr(13), ""), 1)
End Function

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.11.2006 (Ср) 16:13

On Error Resume Next

убери, что возвращается в POS?

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 01.11.2006 (Ср) 16:31

в POS длина символов до того где находится курсор.
убрал On Error Resume Next все стало нормально работать :x

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.11.2006 (Ср) 16:33

значит проблема дальше где-то


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 125

    TopList