powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранение значений свойств для ActiveX Control
10 сообщений из 10, страница 1 из 1
Сохранение значений свойств для ActiveX Control
    #34941262
Borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго здоровичка! Прошу помощи!!!
Создал элемент управления для доступа и работы с БД. Для сохранения значений свойств его в режиме разработки использую PropertyBag. При однократном использовании *.ocx в проекте все работает нормально. Если же добавлять его на несколько форм одного проекта, то свойства в режиме разработки вроде как сохраняются, но в режиме выполнения используется первое активизированное значение элемента управления.
В чем дело не пойму! Помогите кто чем сможет!
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34941412
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все правильно делаете? PropertyChanged вызывается?
Вообще хорошо бы код показать.
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34942717
Borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код приложил.
Смысл в том, что строка подключения к серверу и путь к sql-файлам читаются из ini-файла, а имена таблиц БД и sql-файлов устанавливаются в режиме разработки. Элемент управления - обычный Дата_Навигатор. На одной форме работает - на нескольких лажа...
P.s.: я мог где-то уже "нарушить" алгоритм - эту последняя версия.
Заранее благодарен!
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34947956
Borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго понедельника! Возвращаюсь к своей теме.
Еще раз "сужаю" свою проблему:
1. при инициализации ActiveX надо считать значение свойства Table (OpenRecordset) - получается,
что UserControl_ReadProperties происходит после UserControl_Initialize;
2. при добавлении ActiveX на несколько форм одного проекта свойства в режиме разработки вроде как сохраняются, но в режиме выполнения используется первое активизированное значение элемента управления ActiveX (свойства Table и SQLFileName).
Думаю решение связанно с контейнером (у меня это Форма), но в его тексте свойства элемента управления отображаются как надо.
Не проходите мимо!!!
Еще раз привожу код (укороченный):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
Option Explicit

Dim WithEvents mrstMain As ADODB.Recordset
Dim WithEvents mcnnMain As ADODB.Connection

'Модуль класса для работы с ini-файлами
Dim clsReadINI As clsINIDLL.clsINI

'Переменные для хранения значений свойств
Private sUDLFileName As String, sTable As String, sSQLFileName As String, sSQLFilePath As String

Const sSQLFileNameDefault = "{Имя файла}.sql", sTableDefault = "{Имя таблицы}"

Private Sub OpenRecordset()
On Error GoTo opRsErr
    If mcnnMain Is Nothing Then
        Set mcnnMain = New ADODB.Connection
        mcnnMain.CursorLocation = adUseClient
        mcnnMain.ConnectionString = sUDLFileName
        mcnnMain.Open
    End If
    If mrstMain Is Nothing Then
        Set mrstMain = New ADODB.Recordset
        mrstMain.Open Table, mcnnMain, adOpenKeyset, _
                        adLockOptimistic, adCmdTable
        If Not (mrstMain.BOF And mrstMain.EOF) Then mrstMain.MoveFirst
    End If
    Exit Sub
opRsErr:
    MsgBox Err.Description, vbOKOnly + vbExclamation, "Îøèáêà âûïîëíåíèÿ"
End Sub

Private Sub CloseRecordset()
On Error GoTo clsRsErr
    If mrstMain.State <> adStateClosed Then mrstMain.Close
    Set mrstMain = Nothing
    If mcnnMain.State <> adStateClosed Then mcnnMain.Close
    Set mcnnMain = Nothing
    Exit Sub
clsRsErr:
    MsgBox Err.Description, vbOKOnly + vbExclamation, "Îøèáêà âûïîëíåíèÿ"
End Sub

'Импорт данных в Excel
Private Sub cmdImpExcel_Click()
On Error GoTo err_import
Dim ImportExcel As impExcelDLL.impExcelClass
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim myQuery As String
    
    Set rs = New ADODB.Recordset 
    modOpenSQLFile.openSQLFile sSQLFilePath, sSQLFileName 'чтение данных (sql-запрос) из файла
    myQuery = sSQLFileContentFull
    
    rs.Open myQuery, mcnnMain

    'непосредственно импорт данных в Excel
    Set ImportExcel = New impExcelDLL.impExcelClass
    ImportExcel.Recordset = rs
    ImportExcel.ImportExcel

    Set rs = Nothing    
    Set cn = Nothing    
    Exit Sub
err_import:
    MsgBox Err.Description, vbOKOnly + vbExclamation, "Îøèáêà âûïîëíåíèÿ"
End Sub

Private Sub UserControl_GetDataMember(DataMember As String, Data As Object)
    If DataMember = "Main" Then
        Set Data = mrstMain
    Else
        MsgBox "DataMember" & DataMember & "не найден"
    End If
End Sub

    ''инициализация объекта
Private Sub UserControl_Initialize()
On Error GoTo err_ini
    InitProperties
    OpenRecordset
    DataMembers.Add "Main"
    Exit Sub
err_ini:
    Exit Sub
End Sub

    ''его уничтожение
Private Sub UserControl_Terminate()
    DataMembers.Clear
    CloseRecordset
End Sub

'Установка свойств объекта
    ''чтение
Public Property Get ConnectionString() As String
    ConnectionString = sUDLFileName
End Property
    ''запись
Public Property Let ConnectionString(ByVal s_NewFileName As String)
    sUDLFileName = s_NewFileName
    PropertyChanged ConnectionString
End Property

Public Property Get Table() As String
    Table = sTable
End Property

Public Property Let Table(ByVal s_NewTable As String)
    sTable = s_NewTable
    PropertyChanged Table
End Property

Public Property Get SQLFileName() As String
    SQLFileName = sSQLFileName
End Property

Public Property Let SQLFileName(ByVal s_NewSQLFileName As String)
    sSQLFileName = s_NewSQLFileName
    PropertyChanged SQLFileName
End Property

Public Property Get SQLFilePath() As String
    SQLFilePath = sSQLFilePath
End Property

Public Property Let SQLFilePath(ByVal s_NewSQLFilePath As String)
    sSQLFilePath = s_NewSQLFilePath
    PropertyChanged SQLFilePath
End Property

'Используем объект PropertyBag для:
    ''чтения свойств
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    SQLFileName = PropBag.ReadProperty("SQLFileName", sSQLFileNameDefault)
    Table = PropBag.ReadProperty("Table", sTableDefault)
End Sub

    ''записи свойств
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "SQLFileName", sSQLFileName, sSQLFileNameDefault
    PropBag.WriteProperty "Table", sTable, sTableDefault
End Sub

'Инициализация значений свойств
Private Sub InitProperties()
    Set clsReadINI = New clsINIDLL.clsINI
    clsReadINI.INIFileName = "C:\InLabControl\Program\InLabControl.ini"
    
    ConnectionString = clsReadINI.GetPrivateINIString("Options", "ConnectionString")
    SQLFilePath = clsReadINI.GetPrivateINIString("Options", "SQLFilePath")
End Sub

'"Первичная" инициализация свойств
Private Sub UserControl_InitProperties()
    SQLFileName = sSQLFileNameDefault
    Table = sTableDefault
End Sub
Модератор:
Не забывайте про тег SRC
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34957405
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ лежит на поверхности - не открывайте рекордсет в событии UserControl_Initialize.

Сохранение строки подключения в свойствах контрола - не самая лучшая практика. Вы что, подключаетесь к БД не через диалог Login? Обращение к файлу на диске в событии Initialize каждого контрола на форме - то же не лучшая практика.
В VB6 лучше работать через один коннекшн, а если у вас будут десятки коннекшенов, по числу форм, программа замедлится, СУБД нагрузится.
И обратите внимание на замечание модератора, иногда люди попросту не будут изучать длинный неотформатированный программный код.
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34957416
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и еще, работая через множество коннекшенов вы рискуете Deadlock получить. Так что подумайте о том что бы "ручками" давать коннекшн контролу.
А еще лучше чтобы UserControl вообще не открывал рекордсет, тем более коннекшн, более удачное решение - когда userControl умеет привязать свои контролы к готовому рекордсету в рантайме.
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34957539
Borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Worobjoff,спасибо за участие!
Продумаю ситуацию...Но, в принципе, как быть со свойствами?
К своему примеру: при добавлении ActiveX на несколько форм одного проекта свойства в режиме разработки вроде как сохраняются, но в режиме выполнения используется первое активизированное значение элемента управления ActiveX (у меня это свойства Table и SQLFileName).
Это на будущее для меня.
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34957556
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень понимаю такой вопрос. В событии UserControl_ReadProperties передается параметр PropBag который и содежрит сохраненные значения свойств.
Есть ошибка в вашем коде
PropertyChanged ConnectionString
надо заменить на
PropertyChanged "ConnectionString"
Аналогично - остальное
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34957573
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многие программисты находятся в заблуждении относительно информативности кода по сравнению со свойствами элементов на форме. Это происходит потому что на форме нет кода. Но можно освоить такую практику программирования, когда у вас в форме будет мало программного кода, и тогда строки в нем станут более информативны чем свойства контролов в конструкторе форм.
...
Рейтинг: 0 / 0
Сохранение значений свойств для ActiveX Control
    #34957934
Borisych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Worobjoff, спасибо за комментарии!
Буду думать как "жить" дальше.
А Вам удачи!!!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранение значений свойств для ActiveX Control
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]