На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Как залесть в ListBox чужой программы? , И посмотреть что там творится...
    Доброго времени суток!

    Снова я с занудными вопросами по окнах...

    Есть программка. На ней ListBox. Эта программка представляет с себя маленький терманальчик, в которот отслеживается деятельность работы приложения...
    Туда заносятся данные примерно следующего характера:
    • <16:02:15>:Ошибка: Устройство LPT не найдено

    Тоесть сначала идет дата, потом описание сообытия.

    Нужно просмотривать все события (ну, скорей всего последнее в списке) и если там будет ошибка, то вызывать соответствующую функцию.
    Список с ошибками заранее известен! :)

    Накопал примерчик:
    ExpandedWrap disabled
      Const LB_FINDSTRING = &H18F
      Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long
       
      Private Sub Form_Load()
          List1.Clear
          List1.AddItem "Apples"
          List1.AddItem "Banana"
          List1.AddItem "Bread"
          List1.AddItem "Break"
          Text1.Text = ""
      End Sub
       
      Private Sub Text1_Change()
          List1.ListIndex = SendMessage(List1.hWnd, LB_FINDSTRING, -1, ByVal Text1.Text)
      End Sub


    При изменении значения TextBox - в списке выбирается нужное значение. Ищется оно, как видите по hwnd. hwnd ListBox-а нам известно.
    Но он ищет только полные названия строки или с текст, с которой строка начинается.

    Как его можно сделать по маске типа: "*ошибка*", что бы можно было выбирать любое сочетание символов для поиска?

    Заранее благодарен :)
    Сообщение отредактировано: DataKill -
      Цитата DataKill @
      Как его можно сделать по маске типа: "*ошибка*", что бы можно было выбирать любое сочетание символов для поиска?

      C автопоиском по LB_FINDSTRING - никак.
      Можно отслеживать кол-во строк в листбоксе по LB_GETCOUNT и если оно увеличилось, то читать в цикле все добавленные строки по LB_GETTEXT и уже самому смотреть, есть ли в них "заветное слово" :)
        Окай, нашел пример, запустил в отдельной программе. Все работает.
        Пробую цеплять на свою и ничего толкового не получается.... %)

        Код в моей программе:
        ExpandedWrap disabled
          Public Function GetListBoxItems(ByVal hWnd As Long) As String
              Dim lCount As Long, lIndex As Long
              Dim sItem As String, lLen As Long
           
              lCount = SendMessage(hWnd, LB_GETCOUNT, 0&, ByVal 0&)
           
              lLen = SendMessage(CLng(hWnd), LB_GETTEXTLEN, ByVal CLng(lCount) - 1, ByVal CLng(0))
              '
              sItem = Space(lLen)
              '
              Call SendMessage(hWnd, LB_GETTEXT, lCount - 1, ByVal sItem)
              GetListBoxItems = sItem
          End Function


        SendMessage(hWnd, LB_GETTEXT, lCount - 1, ByVal sItem) возвращает -1
        sItem = "N-ое коли-во пробелов" (Пустой буфер)
        Сообщение отредактировано: DataKill -
          Перед Call SendMessage опустил:
          ExpandedWrap disabled
            sItem = Space(lLen)
            Буфер я забыл добавить в пост на форуме. В коде он у меня есть... Это я эксперементировал :)

            Но даже с ним ничего не работает.

            Все как было, так и есть, а sItem по прежнему возвращает пустой буфер
              Решенно :)
              Нужно было написать:

              ExpandedWrap disabled
                call SendMessage(hWnd, LB_GETTEXT, ByVal lCount - 1, ByVal sItem)
                Цитата DataKill @
                Но даже с ним ничего не работает.

                Все как было, так и есть, а sItem по прежнему возвращает пустой буфер


                Не может быть.
                А у меня работает без ByVal.

                Я думаю что, ты первый раз не добавил sItem = Space(lLen), и по этому код не работало.
                  Как я уже только не пробывал )))))
                  И с sItem = Space(lLen), и без него, получилось так как написал выше :)
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0544 ]   [ 16 queries used ]   [ Generated: 28.06.25, 01:12 GMT ]