Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
1

Оптимизация кода - формы основанные на Template

01.11.2010, 10:03. Показов 673. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос ко всем профи!
У меня есть много форм в программе, выпролняющие похожие функции (работа с БД). У всех есть тоже количество коммандных кнопок, объект ADODB.Recordset, и т.д.
Количество же полей различно.
Мне надоело делать copy-paste для всех форм, контролей и т.д.

В С++ можно было бы создать базовый класс от которого все остальные наследовали бы одинаковые свойства и функции.

Что можно сделать в VB чтобы получить подобный эффект ?

Например для таких свойств и функций:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim adoRS as ADODB.Recordset
 
private sub Form_Load()
    set adoRS = new ADODB.Recordset
    adoRS.Open 'SOME SQL QUERY', sameToAllConnection
end sub
 
private sub txt1_KeyPress( KeyAscii as integer)
     'same operation for all fields
end sub
 
private sub cmdAddNew_Click()
   ' same code for all AddNew commands in each form.
end sub
Спасибо всем, кто откликнится.
(надеюсь мой вопрос будет инересен все кто пишет на VB)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2010, 10:03
Ответы с готовыми решениями:

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона...

Как добраться к Template из кода
Доброго времени суток! Создал я в датагриде колонку в хеадер которой засунул текст бокс.. А теперь...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока...

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я...

4
Comanche
01.11.2010, 11:42 2
Можно создать 'форму-шаблон', назвав её, к примеру, frmTemplate.
Затем описАть формы следующим образом:
Visual Basic
1
2
3
Dim frmFirst As frmTemplate, frmSecond As frmTemplate
Set frmFirst = New frmTemplate
Set frmSecond = New frmTemplate
При необходимости 'лишние' контролы можно делать невидимыми, а недостающие - создавать динамически (при этом надо заранее позаботиться, чтобы на frmTemplate был соответствующий контрол с Index=0).
У форм (поскольку они являются классами) можно сделать Properties, через которые передавать нужные параметры, например - строку подключения:
Visual Basic
1
2
3
4
5
6
7
8
9
' где-то после «Set frmFirst = New frmTemplate», но перед «Load frmFirst»:
frmFirst.ConnString = '........'
' .........
' в коде самой формы:
Private m_ConnString As String
' .........
Property Let ConnString(ByVal NewData As String)
    m_ConnString = NewData
End Property
И т.д. и т.п.
Comanche
01.11.2010, 11:50 3
Кстати, если использовать 'ленточные' формы, то на форме-шаблоне можно разместить 1 ЭУ Label и 1 ЭУ TextBox, оба - с нулевыми индексами. И тогда динамически создавать (N - 1) пар этих контролов, если число полей выборки = N. Т.к. форма будет 'ленточной' (слева - заголовок поля в лейбле, правее заголовка - соотв. текстбокс), то можно (и нужно) формализовать процесс создания/удаления заданного количества пар контролов, описав у формы-шаблона методы Create и Remove (к примеру), которые помимо собственно создания/удаления пар будут также выполнять рутинную операцию правильного размещения пар на теле формы, с ресайзингом как контролов, так и самОй формы.

В итоге может получиться симпатичный 'конструктор' )
Ну а дополн. навороты и удобства - ограничены только твоим временем и фантазией...
Comanche
01.11.2010, 21:00 4
Вот пример, передающий 'основную идею'... но сначала - исходные условия:
1. В проект добавьте форму и модуль. Форму нужно обозвать frmTemplate.
2. В свойствах проекта поставьте 'Запуск с Sub Main'.
3. Подключите к проекту ссылку на MS ADO.
4. Расположите на форме два ЭУ: labFieldName(0) и txtFieldValue(0). Их свойства Left, Width и Height должны соответствовать желаемому расположению; свойство Top роли не играет.
5. Сохраните проект и положите в его папку какой-нибудь MDB-файлик; соотв-но подкорректируйте переменную mdbName в модуле, а также значение, задавемое свойству SqlString формы frmFirst.

КОД ФОРМЫ:
Visual Basic
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
Private mConn As ADODB.Connection
Private mRst As ADODB.Recordset
' -------------------------------------------------------
Private m_FieldsNumber As Integer
Private m_ConnString As String
Private m_SqlString As String
 
Public Property Get FieldsNumber() As Integer
    FieldsNumber = m_FieldsNumber
End Property
 
Public Property Get ConnString() As String
    ConnString = m_ConnString
End Property
 
Public Property Let ConnString(ByVal NewData As String)
    m_ConnString = NewData
End Property
 
Public Property Get SqlString() As String
    SqlString = m_SqlString
End Property
 
Public Property Let SqlString(ByVal NewData As String)
    m_SqlString = NewData
End Property
 
Public Function Connect() As Boolean
    Set mConn = New ADODB.Connection
    On Error GoTo ErrorHandler
    mConn.Open m_ConnString
    Set mRst = New ADODB.Recordset
    With mRst
        .CacheSize = 50
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockReadOnly
        .ActiveConnection = mConn
        .Open m_SqlString
    End With
    ' Если мы здесь - рекордсет удался!
    If Not CreateFields Then
        Connect = False
        Exit Function
    End If
    
    Connect = True
    Exit Function
    
ErrorHandler:
    Connect = False
End Function
 
Public Function Disconnect() As Boolean
    If mRst.State = adStateOpen Then mRst.Close
    Set mRst = Nothing
    If mConn.State = adStateOpen Then mConn.Close
    Set mConn = Nothing
End Function
 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call Disconnect
End Sub
 
Private Function CreateFields() As Boolean
    ' определяет число полей в рекордсете и создаёт для них пары 'label <-> textbox'
    Dim fd As ADODB.Field
    
    On Error GoTo ErrorHandler
    
    labFieldName(0).Visible = False
    txtFieldValue(0).Visible = False
    
    m_FieldsNumber = 0
    For Each fd In mRst.Fields
        m_FieldsNumber = m_FieldsNumber + 1
        Load labFieldName(m_FieldsNumber)
        With labFieldName(m_FieldsNumber)
            .Caption = fd.Name
            .Visible = True
            .Top = 400 * (m_FieldsNumber - 1) + 100
        End With
        Load txtFieldValue(m_FieldsNumber)
        With txtFieldValue(m_FieldsNumber)
            .Text = fd.Value
            .Visible = True
            .Top = 400 * (m_FieldsNumber - 1) + 100
        End With
    Next fd
    
    Me.Height = m_FieldsNumber * 400 + 600
    Me.Caption = 'Пример ленточной формы'
    
    CreateFields = True
    Exit Function
    
ErrorHandler:
    CreateFields = False
End Function
Comanche
01.11.2010, 21:24 5
Примечание: правильнее было бы обойтись без текстбоксов - создавая элементы 'Edit' с помощью API CreateWindowEx. Больно уж жрут текстбоксы память... особенно когда их много на форме. Код от этого усложнится несильно; главное неудобство будет в отказе от событийных процедур, любезно предоставляемых бэйсиком, - заместо них придётся наваять собственные 'оконные' процедуры. Если это привычная для вас задача, то сделаете это быстро.
01.11.2010, 21:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2010, 21:24
Помогаю со студенческими работами здесь

Template definition of non-template при использовании частичной спецификации шаблонов
Всем привет! Есть задача написать шаблон класса, принимающего в качестве параметров типа шаблон и...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки...

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template...

Ошибка компиляции: template-id does not match any template declaration
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru