Проблема с фокусом

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Проблема с фокусом

Сообщение cashman » 30.07.2005 (Сб) 23:26

Одной из функций моей проги являеется - скачивание нужной информации из Инета и уже в TextBoxe ее редактирование.
Но так как скачивать множество страниц и их редактирование занимает ВРЕМЯ, возникает проблема.
Так как, чтобы выкинуть ненужное из текста (TextBox) его нужно найти и выделить, а значит поставить на TextBox ФОКУС (здесь проблема).
Это делает невозможным работу в это время с другими программами, т.к. фокус постоянно перекидывается на мою прогу.
Подскажите пожалуста решение.
Зарание благодарен.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 31.07.2005 (Вс) 2:46

Если редактировать будет пользователь, то есть свойство txtTextBox.HideSelection, а если программа, то есть VBA.Replace.

Если же думать совсем не хочешь, прикрепи сюда проект.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 31.07.2005 (Вс) 9:58

TextBox.HideSelection - уже стоит на все TextBox
а VBA.Replace - такого в выборе нет, т.к. работаю в VB5 (посмотрел, эта функция есть в VB6).
Может я не совсем ясно выразился:
1)прога во время редактирования постоянно берет на себя фокус
2)любое приложение (даже просто открытая папка в Windows), этот фокус теряют

Это не позволяет заниматься чем-либо другим, пока прога (сама) редактирует текст.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 31.07.2005 (Вс) 14:05

Ну, и зачем программе брать на себя фокус, если всё равно редактирует она сама? Хочешь, чтобы она была видна - SetWindowPos и HWND_TOPMOST.

А насчёт Replace - нет, так напиши свою. InStr и Mid ещё никто не отменял.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 31.07.2005 (Вс) 16:00

Вот код, с помощью которого прога выкидавает из текста ненужные тэги:
Код: Выделить всё
Text5.SetFocus   ' для того, чтобы можно было выделять текст
p = 1
Do While InStr(p, Text5.Text, "</span><pre>")
If InStr(p, Text5.Text, "</span><pre>") <> 0 Then
Text5.SelStart = InStr(p, Text5.Text, "</span><pre>") - 1
Text5.SelLength = Len("</span><pre>")
Text5.SelText = ""
End If

Я как раз не хочу чтобы программа была видна (не хочу, чтобы брала на себя фокус), но незнаю как это сделать.
Либо менять КОД либо "нечто, чего я пока не знаю".

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 31.07.2005 (Вс) 17:11

Мои догадки оказались верны...
Ладно, держи код.

Код: Выделить всё
Public Function ReplaceStr(ByVal strString As String, ByVal strReplace As String, _
    Optional ByVal strReplaceWith As String = vbNullString, _
    Optional CompareMethod As VbCompareMethod) As String
    Dim iLenOut As Integer, iLenIn As Integer
    Dim i As Long
    iLenOut = Len(strReplace)
    iLenIn = Len(strReplaceWith)
    If Len(strString) > 0 Then
        If iLenOut > 0 Then
            i = InStr(1, strString, strReplace, CompareMethod)
            Do Until i = 0
                If iLenIn > 0 Then
                    strString = Left$(strString, i - 1) & strReplaceWith & Mid$(strString, i + iLenOut)
                Else
                    strString = Left$(strString, i - 1) & Mid$(strString, i + iLenOut)
                End If
                i = InStr(i + iLenIn, strString, strReplace, CompareMethod)
            Loop
        End If
    End If
    ReplaceStr = strString
End Function


Как пользоваться этой функцией...

Код: Выделить всё
Private Sub Form_Load()
    '...
    Text5.Text = ReplaceStr(Text5.Text, "</span><pre>", vbNullString, vbBinaryCompare)
    '...
End Sub
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 01.08.2005 (Пн) 22:54

Код шикарный, работает, но мне до конца не понятен.
Буду признателен, если ты словесно объяснишь:
Код: Выделить всё
strString = Left$(strString, i - 1) & strReplaceWith & Mid$(strString, i + iLenOut)

и его отличие от:
Код: Выделить всё
strString = Left$(strString, i - 1) & Mid$(strString, i + iLenOut)


Пытался экспериментировать, но не получилось, чтобы при нахождении удалял все до этой точки справа/слева - подскажи!))
P.S. насколько я понял прибавленный знак "$" - означает удалить

P.P.S. Для статистики, насколько этот код (на уровне переменных) работает быстрее чем через контрол TextBox?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 01.08.2005 (Пн) 23:43

1. Для оптимизации. Второе можно и не использовать.
2. Не понял. Что значит "до этой точки"?
3. $ - определение переменной как String.
4. А ты проверь.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 02.08.2005 (Вт) 7:57

1)Я не понимаю назначения "StrReplaceWith"?
Я пробовал отключать строчку:
Код: Выделить всё
Else
strString = Left$(strString, i - 1) & Mid$(strString, i + iLenOut)

Все виснет, видимо уходит в бесконечный цикл. Тогда эта оптимизиция является обязательной?
2)т.е. найдя слово:
Код: Выделить всё
i = InStr(1, strString, strReplace, CompareMethod)

прога удаляла начиная с "этой точки" все что до нее (слева) или все что после (справа)?
3)отличие Left от Left$ - последняя определяет переменную как String?

P.S. Для ясности понимания:
Left$(strString, i - 1) - из текста возвращает количество символов до "i"-1
strReplaceWith - исходя из описания переменной "Optional ByVal strReplaceWith As String = vbNullString" - возвращает строку 0 (что это значит?), строка - это позиция символа?
Mid$(strString, i + iLenOut) - не понял как работает фактически, но теоретически должен возвращать весь остальной текст (исключая найденное "</span><pre>").

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 02.08.2005 (Вт) 15:36

Что мне с тобой делать...

Прочти это: http://vb.hut.ru/vb_tutor_rus.chm
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 02.08.2005 (Вт) 23:28

Посмотрел ссылку - полезный хелп, только не полный почему-то и мне в проблеме не помог.
Несколько часов в сидел эксперементировал с твоим 1-ым кодом, со всеменем понял и смог его применить на иные ситуации.
Это стоило мне несколько седых волос, но я это сделал!!!
А тебе очень благодарен.
P.S. из решенных проблем - появилась новая((( - непонятный символ. Посмотри ссылку:http://bbs.vbstreets.ru/viewtopic.php?p=140689#140689


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

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

Сейчас этот форум просматривают: Google-бот и гости: 47

    TopList