Взаимосвязь двух DataCombo....

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Взаимосвязь двух DataCombo....

Сообщение Rojohn » 25.07.2005 (Пн) 15:02

Решил создать новую тему и дать более конкретную формулировку...
Исходная задача:
Есть на форме два DataCombo, есть в БД Access таблица с двумя полями ("Code" и "Title"). Заполняем DataCombo1 значениями из поля "Code", а DataCombo2 - значениями из поля "Title". Теперь необходимо сделать так, чтобы при переходе на другую запись в DataCombo1, значение DataCombo2 менялось на соответствующее записи DataCombo1 (в соответствии с таблицей БД).

Я пытался реализовать это путём привязки этих 2-х DataCombo к одному Adodc. Получилось, что при изменении записи в Adodc оба DataCombo становятся на эту запись. Но необходим обратный процесс, чтобы запись в Adodc менялась при нажатии на DataCombo.
Использую именно DataCombo по причине необходимости спец. поиска. Adodc должен быть невидим. DataCombo только для чтения. Или подскажите, пожалуйста, другие варианты решения исходной задачи.

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

Сообщение GSerg » 25.07.2005 (Пн) 15:11

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

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Спецпоиск (писал ранее)

Сообщение Rojohn » 25.07.2005 (Пн) 15:13

Поиск в DBCombo по первым введенным буквам.
Постепенно вводя буквы находишь нужную запись.

Private Sub DBCombo1_KeyUp(KeyCode As Integer, Shift As Integer)
Dim n%
Select Case KeyCode
Case Is >= 48
DBCombo1.SelStart = Len(DBCombo1.Text) -Combo1.SelLength+ 1
n = DBCombo1.SelStart
Data1.Recordset.FindFirst "[Название поля] LIKE '" & DBCombo1.Text & "*'"
If Data1.Recordset.NoMatch = False Then
DBCombo1.Text = Data1.Recordset.Fields("Название поля").Value
End If
DBCombo1.SelStart = n
DBCombo1.SelLength = Len(DBCombo1.Text) - n
End Select
End Sub

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

Сообщение GSerg » 25.07.2005 (Пн) 15:23

Жуть.

Берём обычный ComboBox.
Заполняем из рекордсета, Title пишем в List, Code в ItemData, то есть:
Код: Выделить всё
combo.add rst!Title.Value
combo.ItemData(combo.NewIndex) = rst!Code.Value


Потом подрубаем к Combo код инкрементального поиска. http://bbs.vbstreets.ru/viewtopic.php?t=13462
Всё.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 25.07.2005 (Пн) 15:41

С ентим надо ещё разобраться:))) Потом скажу.... Мене пока даже енти 2 строчки не совсем ясны, что говорить об инкрементальном поиске....;))) Спасибо за прогрессивный взгляд на проблему!))

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.07.2005 (Пн) 15:49

Да, здесь формулировка получше.

Я же тебе это уже говорил, пользуй ItemData - смотри свою прошлую тему...
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.07.2005 (Пн) 15:52

Только про инкрементальный поиск не подумал, хотя эту фишку знал... :oops:
Код: Выделить всё
SendMessage(Combo.hWnd, CB_FINDSTRING, -1, ByVal Combo.Text)
А я все практикую лечение травами...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Куда пишется Code?

Сообщение Rojohn » 25.07.2005 (Пн) 16:02

Никогда не пользовался ItemData... Куда пишутся значения поля Code и как их оттуда достать? Они должны выводиться синхронно во второй CpmboBox...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.07.2005 (Пн) 16:08

У каждого элемента в списке есть свойство ItemData (содержит только числовые данные). Ссылаться на него так: itdt=Combo1.ItemData(i), записывать Combo1.ItemData(i)=itdt.
Вот и пиши туда ID из таблиц, а потом сравнивай по ItemData...
А я все практикую лечение травами...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Дополнение...

Сообщение Rojohn » 25.07.2005 (Пн) 16:09

Получается так: В первый Combo пишем в значение ItemData второго поля, а в ItemData второго Combo пишем значения поля первого? Не будет глюков или накладок при поиске или простом выборе?

З.ы. c инкрементальным поиском пока не разобрался:)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.07.2005 (Пн) 16:16

Нет, я ж сказал - ItemData только числа...
У тя в таблицах должно быть поле ID, причем связь между таблицами должна быть именно по этому полю, а не по порядковому номеру записи. :wink: Ты в ItemData обоих комбо пишешь ID, и по ним синхронизируешь...

Думаю, понятно объяснил... :lol:
А я все практикую лечение травами...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 25.07.2005 (Пн) 16:21

Лана... с ентим ясно:) а вот в простых Combo во время поиска список так не расскрывается как в DataCombo... Или ентот инкрементальный поиск сильно изменяет внешний вид Combo?) Надо, чтобы список по буквам раскрывался, а не одно поле как в combo. Может можно тоже самое использовать для DataCombo?

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

Сообщение GSerg » 25.07.2005 (Пн) 16:21

У одного в itemdata code, в list title
У другого в itemdata ничего, в list code.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Ещё одно....

Сообщение Rojohn » 25.07.2005 (Пн) 23:07

Спасибо за ответы, особенно за инкрементальный поиск!) Всё получилось, не совсем понял пока синтаксис API. Теперь мне надо предусмотреть клавиши Backspace и Del. А для этого надо делать проверки при их нажатии. Как лучше сравнить текст в активном окне Combo со всем списком? Всё понятно, смущает только один случай: икрементальный поиск выбирает значение, стираем последний символ, во втором Combo должно быть пусто, но там сохраняется выбранное значение. Как это обработать?
И если можно, как расчитывается i через API? Или где посмотреть?
Спасибо!

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Ещё...

Сообщение Rojohn » 25.07.2005 (Пн) 23:21

Кстати... как в цикле сравнить ItemData двух Combo, не изменяя их? Если делать цикл:

Код: Выделить всё
Private Sub cbRayon1_Click() 'Это второй Combo
  Dim i As Long, valFindR1 As Boolean

  If cbRayon1.Text = "" Then Exit Sub
  valFindR1 = False
  For i = 0 To cbRayon.ListCount - 1
    If cbRayon.ItemData(i) = CLng(Trim(cbRayon1.Text)) Then
      cbRayon.Text = cbRayon.List(i)
      valFindR1 = True
    End If
  Next i
  If valFindR1 = False Then cbRayon.Text = ""
End Sub   


Это работает, но громоздко:) А не сравнивая с текстом это можно сделать? Одними ItemData?

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

Re: Ещё одно....

Сообщение GSerg » 26.07.2005 (Вт) 2:58

Rojohn писал(а):Теперь мне надо предусмотреть клавиши Backspace и Del.

А разве они не предусмотрены?

Rojohn писал(а):Всё понятно, смущает только один случай: икрементальный поиск выбирает значение, стираем последний символ, во втором Combo должно быть пусто, но там сохраняется выбранное значение. Как это обработать?

Это обработать тем, что если найденное инкрементальным поиском значение не точно совпадает с нужным, то очистить второй вообще.

Rojohn писал(а):И если можно, как расчитывается i через API? Или где посмотреть?Спасибо!

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

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Шаману:)

Сообщение Rojohn » 26.07.2005 (Вт) 9:28

Теперь мне надо предусмотреть клавиши Backspace и Del.


Предусмотрено как раз их игнорирование, что правильно для поиска, но см. пункт 2 (при удалении нужна сверка).

Это обработать тем, что если найденное инкрементальным поиском значение не точно совпадает с нужным, то очистить второй вообще.


Это-то и не понятно... Мне удалось пока только очищать, когда поиск активен, а при удалении нужно прогонять по всему Combo для проверки... Как это лучше сделать (с учетом ItemData)?

И если можно, как расчитывается i через API? Или где посмотреть?


Енто в инкрементальном поиске:

Код: Выделить всё
Private Const CB_FINDSTRING = &H14C&

Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

I = SendMessage(Combo.hWnd, CB_FINDSTRING, -1, ByVal Combo.Text) + 1


Теоретически i здесь должно означать какой-то текущий символ в Combo. Хотя бы вкратце про енто API, а то вставляю в свой проект какой-то Alias, не зная как он работает;)

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

Сообщение GSerg » 26.07.2005 (Вт) 9:33

Что значит "при удалении"? Удалении чего и откуда?
И ещё это посмотри.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 26.07.2005 (Вт) 9:34

ИМХО, I обозначает номер строки...
А я все практикую лечение травами...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Продолжение темы...

Сообщение Rojohn » 26.07.2005 (Вт) 9:41

Individual Control Information :) С ентим ещё разберусь, в смысле API:)

И всё же вопрос №2 остался: как лучше сравнить текущую запись в Combo с другими записями ентого же Combo? Чёто по всякому изощрялся, но трудность в том, что когда удаляешь букву с конца найденного в Combo, ItemData остаётся от найденной записи. Как её сбросить чтоли или не учитывать? Вообще, как лучше сделать енту проверку?

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

Сообщение GSerg » 26.07.2005 (Вт) 9:47

Я вообще не понимаю проблему.
Особенно я не понимаю её, читая всё, что написано выше :)

Ты удалил символ. И после этого ты снова ищешь SendMessage(Combo.hWnd, CB_FINDSTRING, -1, ByVal Combo.Text). И если результат =-1, значит, такого поля в списке нет, и ему не соответствует ни один элемент из второго списка.
Что не понятно? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Проблема...

Сообщение Rojohn » 26.07.2005 (Вт) 10:01

Изменил текст так:

Код: Выделить всё
Dim valComboStr As Boolean

Sub AutoFillCombo(Combo As ComboBox)
  Dim i&, P&
 
  i = SendMessage(Combo.hWnd, CB_FINDSTRING, -1, ByVal Combo.Text) + 1
  If i > 0 Then
    P = Combo.SelStart
    Combo.ListIndex = i - 1
    Combo.SelStart = P
    Combo.SelLength = Len(Combo.Text) - P
    valComboStr = False
  Else
    valComboStr = True
  End If
End Sub

Private Sub cbRayon_Change()
  Dim i1&
 
  If Not (LastComboKeyAscii = 8) And Not (LastComboKeyAscii = 46) Then
    AutoFillCombo cbRayon
    LastComboKeyAscii = 0
    If valComboStr = True Then cbRayon1.Text = ""
  Else
    i1 = SendMessage(cbRayon.hWnd, CB_FINDSTRING, -1, ByVal cbRayon.Text) + 1
    If i1 = -1 Then cbRayon1.Text = ""
  End If
  Verif_Edit
End Sub


В Combo есть записи 'Район1' и 'Район2'. Пишем Район1 - поиск его находит и в другом Combo появляется его код. Затем стираем единицу в конце - в другом Combo должно быть пусто, а там остаётся код 'Района1'. Зато, если к 'Район' приписать '3' (которого нет в списке), то Сombo2 нормально обнуляется.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 26.07.2005 (Вт) 10:15

Потому что
Код: Выделить всё
I = SendMessage(Combo.hWnd, CB_FINDSTRING, -1, ByVal Combo.Text) + 1
ищет вхождение символов сначала строки (GSerg же давал ссылку :? ).
Скорее всего, тебе в данном случае надо перебереть циклом и смотреть не вхождение символов сначала строки, а полное соответствие строк.
А я все практикую лечение травами...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Эпилог:)

Сообщение Rojohn » 26.07.2005 (Вт) 10:29

Скорее всего, тебе в данном случае надо перебереть циклом и смотреть не вхождение символов сначала строки, а полное соответствие строк.


В ентом-то всё и дело! Я уже спрашивал до ентого, как лучше енто сделать... незаметили видно:)

Лана, короче сделал я всё енто наконец. Остальное дело техники. Всем аагромное спасибо, особенно Шаману, но не в обиду Продвинутому;)

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

Сообщение GSerg » 26.07.2005 (Вт) 12:15

Чел :)

Вот смотри :)
Вот есть CB_FINDSTRING.
А есть CB_FINDSTRINGEXACT.
Простейшие знание английского нам говорит о чём? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

:)

Сообщение Rojohn » 26.07.2005 (Вт) 13:48

А чё ж раньше-то?;) Вопрос один пока - значение CB_FINDSTRINGEXACT, // message ID
можно ставить любое или для него регламентировано значение?

Код: Выделить всё
Private Const FINDSTRING= &H14C&
Private Const FINDSTRINGEXACT= &H15C&


Так? А всё остальное без изменений?

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

Сообщение GSerg » 26.07.2005 (Вт) 15:32

Const CB_FINDSTRINGEXACT As Long = &H158
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Шаману...

Сообщение Rojohn » 27.07.2005 (Ср) 10:44

Не проходит, точнее эффект 0 (как будто ничё и не писал:)

Код: Выделить всё
Private Const CB_FINDSTRINGEXACT As Long = &H158

Sub ChangeCombo(ChCombo As ComboBox, ChCombo1 As ComboBox)
  Dim i1&
 
  If Not (LastComboKeyAscii = 8) And Not (LastComboKeyAscii = 46) Then
    AutoFillCombo ChCombo
    LastComboKeyAscii = 0
    If valComboStr = True Then ChCombo1.Text = ""
  Else
    i1 = SendMessage(ChCombo.hWnd, CB_FINDSTRINGEXACT, -1, ByVal ChCombo.Text) + 1
    If i1 = -1 Then ChCombo1.Text = ""
  End If
End Sub


Потом енто всё в Change Combo-боксов. Чё не так?

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

Сообщение GSerg » 27.07.2005 (Ср) 10:48

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

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

ГЫ:)))

Сообщение Rojohn » 27.07.2005 (Ср) 11:01

Спасиб! Заработало!:)

З.ы. если'б сразу знал чё написано в ентой строке...
Но я ещё разберусь с ентим API;)


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

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

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

    TopList