API поиск в ListBox

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

API поиск в ListBox

Сообщение dear » 06.02.2008 (Ср) 22:34

Имеется окно с двумя ListBox (см. вложение).
Нашел хэндл и основного окна, и двух листбоксов
Необходимо найти номер строки по названию элемента.
SendMessageByString(hw, LB_FINDSTRINGEXACT, -1, "Normal"), как и
SendMessage(hw, LB_FINDSTRINGEXACT, -1, "Normal")
возвращают пустую строку.
Подскажите, пожалуйста, что я неправильно делаю
Вложения
Untitled-1.gif
(4.37 Кб) Скачиваний: 83

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 07.02.2008 (Чт) 1:08

А просто LB_FINDSTRING пробовал?
Код: Выделить всё
'This project needs a ListBox, named List1 and a TextBox, named Text1
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
Const LB_FINDSTRING = &H18F
Private Sub Form_Load()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Add some items to the listbox
    With List1
        .AddItem "Computer"
        .AddItem "Screen"
        .AddItem "Modem"
        .AddItem "Printer"
        .AddItem "Scanner"
        .AddItem "Sound Blaster"
        .AddItem "Keyboard"
        .AddItem "CD-Rom"
        .AddItem "Mouse"
    End With
End Sub
Private Sub Text1_Change()
    'Retrieve the item's listindex
    List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
End Sub
Подпись проходит рефакторинг

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 07.02.2008 (Чт) 1:47

Пробовал, ничего не получается. Может быть все дело в символах, стоящих перед наименованием стилей (знак абзаца в верхнем ListBox или подчеркнутая буква А в нижнем). Но как это обойти - не знаю.
Само окно - таблица стилей из QuarkXpres

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 07.02.2008 (Чт) 8:03

dear, а собственно какую строку ты хочешь получить? Функция индекс должна вернуть. И как объявлены функции?
Весь мир матрица, а мы в нем потоки байтов!

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 08.02.2008 (Пт) 0:30

Прошу прощения за поздний ответ - не дома был
Хочу получить строку с названием имени стиля - " а в ответ тишина"

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 08.02.2008 (Пт) 8:11

В чем тишина то заключается? И еще раз, как объявлена функция/функции?
Весь мир матрица, а мы в нем потоки байтов!

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 09.02.2008 (Сб) 17:38

Прошу прощения, может неправильно сформировал вопрос.
Я хочу получить номер строки, которая содержит стиль "Normal"
В ответ функция выдает значение (-1), что, как я понял, значит, что строка не найдена
Функция объявлена следующим образом:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Зарание большое спасибо за внимание.

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

Сообщение alibek » 10.02.2008 (Вс) 10:00

Объяви ByVal lParam As String.
Lasciate ogni speranza, voi ch'entrate.

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 10.02.2008 (Вс) 22:47

Спасибо, завтра на работе буду пробовать

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 13.02.2008 (Ср) 21:19

Попробовал. Возвращает "-1".
Могу средствами API выделить строку, удалить и т.д.
Но найти в ней какую-либо строку не могу. М.Б. мешает первый символ (подчеркнутое А). Тогда как его обойти, может подскажете.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 13.02.2008 (Ср) 22:09

dear
Походу подчеркнутое A = &A. Если не прав то поправте. Попробуй заменить первый символ на подчеркнутый и повторить поиск :)
#define ROFL 0xDDDD

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 14.02.2008 (Чт) 22:47

И опять ничего не получилось.
Такое ощущение, что эта А и знак абзаца - какие-то графические изображения и находятся в первой колонке ListBox, а сами наименования стилей - во второй. И поиск происходит по первой колонке, естественно, ничего не находится.
Возможен ли поиск по второй колонке?

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 14.02.2008 (Чт) 23:10

DirectXManiac
Не, я тоже так сначала подумал, а потом оказалось что в листбоксе вместо подчеркивания отображается амперсанд (&).
dear
А это точно листбокс? :)
Подпись проходит рефакторинг

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 15.02.2008 (Пт) 0:09

Как мне кажется да, это ListBox. По крайней мере, WinDowse, Winspector Spy показывают именно этот класс. Мало того, Restorator'ом просмотрел файл QuarkXpress.exe, где лежит это окно - тоже показано что это ListBox (также показывает стили окна, свойственные этому классу. К тому же API -сообщения LB_SETSEL и другие с префиксом "LB_" работают (кроме необходимых LB_FINDSTRING :-( )
Конечно, можно было бы просто высчитать номер строки и делать ее активной, но вся беда в том, что порядок строк меняется от файла к файлу. Беда-а-а-а-{. Да и задело к тому же.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 15.02.2008 (Пт) 0:44

А попробуй послать этому листбоксу LB_GETTEXT и посмотри что он там вернет. А потом используй LB_FINDSTRING... Может и получится, хотя конечно это изврат...
Подпись проходит рефакторинг

dear
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 23.01.2008 (Ср) 23:12

Сообщение dear » 15.02.2008 (Пт) 21:55

Попробовал. Возвращаемое значение = 0. Если попробовать вставить строку - Кварк виснет.
Я думаю, пора прекращать. Сделаю ini-файл, в котором надо будет вводить вручную номер строки.
Огромная спасяба всем, кто помогал
С уважением, dear


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

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

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

    TopList