Страница: 1 |
|
Вопрос: Автопоиск в ComboBox не работает для русск шрифта
|
Добавлено: 19.04.10 02:19
|
|
Автор вопроса: ЯZ
|
Программа на VB6, БД в Access. Во всех ComboBox с длинными списками работает автопоиск: ввожу с клавиатуры первые 1-2-3 буквы = в ComboBox автоматически появляется вариант с таким началом из справочного списка. Но на практике оказалось, что автопоиск работает на РУССКИЙ ШРИФТ только в среде Win’95, а в Win’XP и выше – реагирует только на английский!
Помогите найти ответ, я не профессиональный программист, но кое-что жизнеспособное удаётся. А вчера упёрлась в эту проблему, два дня бьюсь - сдвинуться с места не могу! Нужен автопоиск в ComboBox из справочника РУССКИХ названий.
Или как в форме Anketaf для всех Combo1 написать функцию автопоиска в моём случае?
***
Private Sub Combo1_Click(Index As Integer)
Dim PrReady As Integer
If PrReadyForChangeComboText Then PrChangeComboText = True
End Sub
***
Private Sub combo1_KeyPress(KeyAscii As Integer)
If KeyAscii = KEY_RETURN Then
SendKeys Chr$(KEY_TAB), True
End If
End Sub
***
Private Sub Combo1_LostFocus(Index As Integer)
If Not Combo1(Index).Visible Then Exit Sub
If PrReadyForChangeComboText And PrChangeComboText Then Sub_Combo_LostFocus Anketaf, Index
End Sub
Ответить
|
Номер ответа: 3 Автор ответа: ЯZ
Вопросов: 4 Ответов: 4
|
Профиль | | #3
|
Добавлено: 20.04.10 03:05
|
Доброе утро, Олег, спасибо за отклик.
Где описан порядок автопоиска сказать точно не могу. Извините, что передаю много лишнего. Заранее спасибо за ответ.
(А как к сообщению прикрепить файл?, на будущее...)
**************************
Option Explicit
'---- toolhelp ------
Type POINTAPI
X As Long
Y As Long
End Type
Type InfFields
Base As String
Field As String
Type As Integer
Width As Integer
SIZE As Integer
RusName As String
SprBase As String
SprViewField As String
KodField As String
RemField As String
Relation As String
AsBase As String
End Type
******************************
Sub SetCombo(Combo As Control, Txt As String, Id As Variant)
PrReadyForChangeComboText = False
Combo.Clear
Combo.AddItem Txt
Combo.ItemData(0) = Id
Combo.ListIndex = 0
PrReadyForChangeComboText = True
End Sub
*******************************
Sub Sub_Combo_LostFocus(Frm As Form, ByVal Index As Integer)
Dim NameSprBase As String
Dim NameMainField As String
Dim Temp As String
Dim NumPos As Integer
If Frm.Combo1(Index).ListIndex = -1 Then Exit Sub
NameMainField = Frm.Combo1(Index).Tag
If Len(NameMainField) > 0 Then
NumPos = InStr(NameMainField, ";"
NameMainField = Mid$(NameMainField, NumPos + 1)
NumPos = InStr(NameMainField, ";"
NameSprBase = Mid$(NameMainField, NumPos + 1)
NameMainField = Left$(NameMainField, NumPos - 1)
Temp = Trim$(Frm.Combo1(Index))
NumPos = InStr(Temp, " ("
If NumPos > 0 Then Temp = Trim$(Left$(Temp, NumPos - 1))
If Frm.Combo1(Index).ListIndex = -1 Then
' в справочник нужно внести новое значение
NumPos = NewDataInSprav(NameSprBase, Temp)
Else
NumPos = Frm.Combo1(Index).ItemData(Frm.Combo1(Index).ListIndex)
End If
gAnketa.Edit
gAnketa(NameMainField) = NumPos
gAnketa.Update
SetCombo Frm.Combo1(Index), Temp, NumPos
End If
End Sub
******************************
Sub Sub_Combo_GotFocus(Frm As Form, ByVal Index As Integer)
Dim Temp As String
Dim NumPos As Integer
Dim StrMain As String
Dim NameSprBase As String
Dim KodOrder As String
If Frm.Combo1(Index).ListCount = 1 Then
StrMain = Frm.Combo1(Index).Tag
NumPos = InStr(StrMain, ";"
If NumPos <> 0 Then
StrMain = Mid$(StrMain, NumPos + 1)
NumPos = InStr(StrMain, ";"
If NumPos <> 0 Then
NameSprBase = Mid$(StrMain, NumPos + 1)
KodOrder = Left$(StrMain, NumPos - 1)
Temp = "Select * from " + NameSprBase
If NameSprBase = "Hospit" And KodOrder = "LPUPrik" Then
Temp = Temp + " Where Hospit.PrLPU"
End If
If NameSprBase = "Status" Then
Temp = Temp + " Order By Status.KodStatus"
End If
' If Left$(KodOrder, 3) = "Kod" Then
' If InStr(KodOrder, NameSprBase) > 0 Then
' Temp = "Select * from " + NameSprBase + " Order By " + KodOrder
' End If
' End If
PrReadyForChangeComboText = False
LoadCombo Frm.Combo1(Index), Temp, "", False
PrReadyForChangeComboText = True
End If
End If
End If
End Sub
******************************
' Модуль загружает результат запроса в COMBO BOX.
' Результат может содержать либо ОДНО ПОЛЕ, либо ДВА.
' если 1 поле - ITEMDATA не используется, и наоборот.
' после вызова модуля необходимо сделать ME.refresh
Sub LoadCombo(Combo As Control, SQL As String, ByVal ViewField As String, ByVal PrSetFocus As Integer)
Dim ss As Recordset
Dim Last As Long
Dim Before As Long
Dim SQLStr As String
Dim i As Long
If Combo.Visible And Combo.Enabled And PrSetFocus Then Combo.SetFocus
If Combo.ListIndex >= 0 Then
Last = Combo.ItemData(Combo.ListIndex) ' - код из базы
Else
Last = -1
End If
Combo.Clear
Set ss = gDB.OpenRecordset(SQL, dbOpenSnapshot)
If ss.RecordCount > 0 Then
ss.MoveFirst
If ss.Fields.Count > 1 Then
If (ss(0).Name = "KodNation" Or ss(0).Name = "KodHospit" Or ss(0).Name = "KodCntr" Or ss(0).Name = "KodRespub" Or ss(0).Name = "KodTown" Or ss(0).Name = "KODREG" And InStr(UCase$(SQL), "ORDER" = 0 And InStr(UCase$(SQL), "WHERE" = 0 Then
i = ss(0)
Combo.AddItem GetTxt(ss(1))
Combo.ItemData(Combo.NewIndex) = i
If i = Last Then Combo.ListIndex = Combo.NewIndex
ss.MoveNext
If Not ss.EOF Then
i = ss(0): Before = i
Combo.AddItem GetTxt(ss(1))
Combo.ItemData(Combo.NewIndex) = i
If i = Last Then Combo.ListIndex = Combo.NewIndex
SQLStr = SQL
SQLStr = SQLStr + " Where " + ss(0).Name + " > " + Trim$(Str$(Before))
SQLStr = SQLStr + " Order By " + ss(1).Name
ss.Close
Set ss = gDB.OpenRecordset(SQLStr, dbOpenSnapshot)
If ss.RecordCount > 0 Then
While Not ss.EOF
i = ss(0)
Combo.AddItem GetTxt(ss(1))
Combo.ItemData(Combo.NewIndex) = i
If i = Last Then Combo.ListIndex = Combo.NewIndex
ss.MoveNext
Wend
End If
End If
Else
While Not ss.EOF
i = ss(0)
If ViewField = "" Then
Combo.AddItem GetTxt(ss(1))
Else
Combo.AddItem GetTxt(ss(ViewField))
End If
Combo.ItemData(Combo.NewIndex) = i
If i = Last Then
Combo.ListIndex = Combo.NewIndex
End If
ss.MoveNext
Wend
End If
Else
While Not ss.EOF: Combo.AddItem GetTxt(ss(0))
ss.MoveNext
Wend
End If
End If
ss.Close
End Sub
******************************
Sub FillPoles(Frm As Form, gBase As Recordset, ByVal StrIndex As String)
Dim TempIndex As String
Dim StrMain As String
Dim NameMainField As String
Dim NameSprBase As String
Dim TempTxt As String
Dim NumPos As Integer
Dim TempKod As Integer
Dim i As Long
Dim tContrl As Control
On Error GoTo errFillPoles
PrReadyForChangeComboText = False
MDI.Enabled = False
Frm.Enabled = False
If StrIndex = "-1" Then ShowStatusDialog "Считывание данных из архива", Frm.Text1.Count + Frm.Combo1.Count
' Обработка Text1
i = 0
For Each tContrl In Frm.Text1
If StrIndex = "-1" Then UpdateStatus i
StrMain = Trim$(tContrl.Tag)
If Len(StrMain) > 0 Then
NumPos = InStr(StrMain, ";"
If NumPos <> 0 Then
TempIndex = Left$(StrMain, NumPos - 1)
StrMain = Mid$(StrMain, NumPos + 1)
End If
If StrIndex = "-1" Or StrIndex = TempIndex Or TempIndex = "0" Then
tContrl = GetTxt(gBase(StrMain))
End If
Else
tContrl = ""
End If
i = i + 1
Next tContrl
For Each tContrl In Frm.Combo1
If StrIndex = "-1" Then UpdateStatus i
StrMain = tContrl.Tag
If Len(StrMain) > 0 Then
NumPos = InStr(StrMain, ";"
If NumPos <> 0 Then
TempIndex = Left$(StrMain, NumPos - 1)
StrMain = Mid$(StrMain, NumPos + 1)
End If
If StrIndex = "-1" Or StrIndex = TempIndex Or TempIndex = "0" Then
NumPos = InStr(StrMain, ";"
If NumPos <> 0 Then
NameMainField = Left$(StrMain, NumPos - 1)
NameSprBase = Mid$(StrMain, NumPos + 1)
Else
NameSprBase = StrMain
End If
If NumPos = 0 Then
tContrl = GetNameSpr(NameSprBase, gBase(NameMainField), 1)
Else
TempKod = NullToZero(gBase(NameMainField))
TempTxt = GetNameSpr(NameSprBase, TempKod, 1)
SetCombo tContrl, TempTxt, TempKod
End If
End If
End If
i = i + 1
Next tContrl
errFillPoles:
If StrIndex = "-1" Then Unload StatusDlg
PrReadyForChangeComboText = True
PrChangeComboText = False
Frm.Enabled = True
MDI.Enabled = True
End Sub
******************************
Sub FindInCombo(Combo As Control, Id As Variant)
Dim i As Integer
Combo.ListIndex = -1
For i = 0 To Combo.ListCount - 1
If Combo.ItemData(i) = Id Then
Combo.ListIndex = i
Exit Sub
End If
Next i
End Sub
Sub GetInfField(ByVal PrViewError As Boolean, Mode As Integer, ByVal tBase As String, ByVal Field As String, Ret As InfFields)
Dim PrNoFind As Boolean
Ret.Base = "": Ret.Field = "": Ret.Type = 0: Ret.Width = 0: Ret.SIZE = 0: Ret.RusName = ""
Ret.SprBase = "": Ret.SprViewField = "": Ret.KodField = "": Ret.RemField = ""
Ret.SprBase = "": Ret.SprViewField = "": Ret.KodField = ""
…
******************************
Sub GetFields()
Dim Info As InfFields
Dim tName As String
Dim tBase As String
'Gets all the fields so that the Sort Menu item can be set up
Dim ct As Integer
Dim ctMenu As Integer
Dim ctTotal As Integer
Dim ct2 As Integer
'Loop through all the valid database fields
ctMenu = -1
GetInfField True, 1, Sect, "-", Info
SetInfGlob.Top = -1: SetInfGlob.Caption = Info.RemField: SetInfGlob.DefColWidth = 2
SetInfGlob.NumColumns = MainForm.Data1.Recordset.Fields.Count - 1
SetInfGlob.HeadLines = 2
SetInfGlob.AllowUpdate = True
ReDim SetInfColumns(0 To MainForm.Data1.Recordset.Fields.Count - 1) As InfTrueGrigColumn
ctTotal = 0
For ct = 0 To MainForm.Data1.Recordset.Fields.Count - 1
tName = MainForm.Data1.Recordset(ct).Name
If Left$(tName, 2) <> "s_" Then
ctMenu = ctMenu + 1
'tBase = MainForm.Data1.Recordset.Name
'tBase = GetNameBase(tBase, tName)
tBase = curTable
tBase = GetNameBase(tBase, tName)
GetInfField True, 0, tBase, tName, Info
SetInfColumns(ct).NameBase = tBase
SetInfColumns(ct).DataField = MainForm.Data1.Recordset(ct).Name
SetInfColumns(ct).Caption = Info.RusName
…
Ответить
|
Номер ответа: 5 Автор ответа: ЯZ
Вопросов: 4 Ответов: 4
|
Профиль | | #5
|
Добавлено: 10.05.10 14:08
|
Executioner, добрый день.
Прошу помочь изменить порядок вывода данных в таблице
Программа на VB6, БД Access.
В БД хранятся карты пациентов, в каждой карте есть таблица со списком Видов исследования, назначенных пациенту. По команде формируется сводная таблица, где в первых столбцах перечислены Фамилии пациентов, а далее, в заголовке каждого отдельного столбца идут названия Видов исследования.
Задача. Надо, наоборот: в строках первого столбца перечислить названия Видов исследования, а далее, в заголовке каждого отдельного столбца - Фамилии пациентов.
Пожалуйста, помогите. Очень важно. Как Вам передать Файлы?
Ответить
|
Страница: 1 |
Поиск по форуму