Створення власного MsgBox “а в Access, MS Office, Програмні керівництва, статті

Можна, сказати, останнім штрихом до створення красивого інтерфейсу стає заміна в програмі стандартних сірих, сумних спливаючих повідомлень – MsgBox “ов. Всім би хотілося розфарбувати їх у тоновий колір власних форм, змінити шрифт, використовувати кольорові кнопочки, власні красиві стильні значки для позначень типів подій, загалом, всім би хотілося переробити MsgBox по своєму смаку.


Скажу відразу – тут не розглядається можливість переробки стандартного MsgBox, я поясню створення власного MsgBox на основі форми Access. А раз це форма Access – значить, з нею можна робити все що завгодно.


Отже, почнемо:


Створимо модуль коду mdlMsgBox і вставимо в нього наступний код:


(Звичайно, код досить задовгий, але бачили б Ви оригінал! 😉


Option Compare Database
Option Explicit

Private mvarResult As Variant “повертається результат
Private strPrompt As String “саме повідомлення
Private lngIconStyle As Long “стиль іконки
Private strTitle As String “заголовок
Private intNumberOfButtons As Integer “кількість кнопок в повідомленні
Private intDefaultButton As Integer “номер кнопки за замовчуванням
Private strCustomButton1 As String “для перенесення підписи першої кнопки
Private strCustomButton2 As String “для перенесення підписи другої кнопки

Function MBox(ByVal Prompt As String, _
Optional Style As Long, _
Optional Title As String) As Variant
“Функція отримує параметри обов’язковий” Повідомлення “, _
необов’язковий стиль повідомлення, _
необов’язковий заголовок повідомлення

ResetVars “обов’язково скинемо всі попередні значення змінних
strPrompt = Prompt “присвоюємо змінної рядок повідомлення

“Допускається три види значків Вигук, Критичний, Інформація
“Проведемо аналіз змінної Style і привласнимо змінної lngIconStyle значення
If (Style And vbExclamation) = vbExclamation Then
    lngIconStyle = vbExclamation
ElseIf (Style And vbCritical) = vbCritical Then
    lngIconStyle = vbCritical
ElseIf (Style And vbInformation) = vbInformation Then
    lngIconStyle = vbInformation
End If


“Особливо хочу звернути увагу на попередній абзац коду –


“Чудова ідея побітового порівняння двох чисел для виділення потрібного!

strTitle = Title “присвоюємо змінної рядок заголовка

“Використовуємо константи VB MsgBox і згідно з ними іменуємо кнопки


“Зверніть увагу – я використовую тільки 2 кнопки – на практиці мені більше не було потрібно …
If (Style And vbRetryCancel) = vbRetryCancel Then
strCustomButton1 = “& Повторити”
strCustomButton2 = “& Скасувати”
    intNumberOfButtons = 2
ElseIf (Style And vbOKCancel) = vbOKCancel Then
    strCustomButton1 = “&OK”
strCustomButton2 = “& Скасувати”
    intNumberOfButtons = 2
ElseIf (Style And vbYesNo) = vbYesNo Then
strCustomButton1 = “& Так”
strCustomButton2 = “& Ні”
    intNumberOfButtons = 2
Else “якщо взагалі ніяких констант не задано, тоді просто кнопка ОК
    strCustomButton1 = “&OK”
    intNumberOfButtons = 1
End If

“Аналізуємо кнопку за замовчуванням – друга або перша?
If (Style And vbDefaultButton2) = vbDefaultButton2 Then
    intDefaultButton = 2
Else
    intDefaultButton = 1
End If


“Ну і відкриваємо саму форму frmMsgBox – імітатор стандартного MsgBox
DoCmd.OpenForm “frmMsgBox”,,,,, acDialog, “MBox” “відкриваємо форму в режимі діалогу
“Поки що викликається діалогове вікно не закриється, подальший код не буде виконуватися.


“Чекаємо-ссс вибору користувача …..


“Тепер аналізуємо повернутий результат
If IsEmpty(mvarResult) Or IsNull(mvarResult) Then
MBox = 1 “якщо нічого немає (Хм. ..), тоді присвоюємо функції 1
Else
MBox = mvarResult “ну тоді функції присвоюємо вже повернений через Property Let MBoxResult результат
End If
End Function


“А тут починаємо перераховувати процедури властивостей, яка використовує наше діалогове вікно
Public Property Get MBoxNumberOfButtons() As Integer
MBoxNumberOfButtons = intNumberOfButtons “передамо кількість кнопок
End Property
Public Property Get MBoxDefaultButton() As Integer
MBoxDefaultButton = intDefaultButton “передамо кнопку за замовчуванням
End Property
Public Property Get MBoxCustomButton1() As String
MBoxCustomButton1 = strCustomButton1 “передамо підпис першої кнопки
End Property
Public Property Get MBoxCustomButton2() As String
MBoxCustomButton2 = strCustomButton2 “передамо підпис другої кнопки
End Property
Public Property Get MBoxPrompt() As String
MBoxPrompt = strPrompt “передамо рядок самого повідомлення
End Property
Public Property Get MBoxTitle() As String
MBoxTitle = strTitle “передамо рядок заголовка
End Property
Public Property Get MBoxIconStyle() As Long
MBoxIconStyle = lngIconStyle “передамо стиль іконки
End Property

Public Property Let MBoxResult(varResult As Variant)


“А ось тут-то не передамо, а отримаємо властивість і його опрацюємо
On Error GoTo 0
If IsObject(varResult) Then
mvarResult = 1 “за замовчуванням присвоюємо ОК
ElseIf IsNull(varResult) Then
mvarResult = 1 “також привласнимо ОК
ElseIf IsNumeric (varResult) Then “ага – тут числовий код вибраного результату!
    mvarResult = CLng(varResult)
End If
End Property

Private Sub ResetVars()
“Скидаємо – переініціалізіруем всі використовувані змінні
mvarResult = Empty
strPrompt = vbNullString
strTitle = vbNullString
intDefaultButton = 0
End Sub


Так-с, з модулем розібралися, тепер безпосередньо створюємо форму frmMsgBox. Я пішов знову ж по шляху спрощення коду 😉 та посилення візуальної сигналізації 😉 оригіналу.


Розмір форми приблизно 12х4 см. Це дозволяє комфортно розміщувати текстовий блок висотою 5 рядків шрифтом 10 пунктів і кнопки вибору внизу без візуальної тісноти. Справа я поклав один на одного три Малюнка з досить великими стильними малюнками: Інформація, Вигук, Критичний. Тон форми відповідає загальній тональності форм додатки. За формою також розтягнув прямокутник з бордюром в 2 пункти, який (Бордюр) розфарбовується в залежності від тональності питання. Внизу розташував дві прозорі! кнопки і два написи, які за розміром точно відповідаю кнопкам. Ці написи також забарвлюються в тон питання і будуть емулювати кнопки вибору, а також отримання “фокусу”. Прозорі кнопки обов’язково потрібні (одними написами не обійтися) і розташовані в шарі вище, ніж написи – прямо над написами, тобто перехоплюють всі натискання кнопок на них (Формат -> На передній план). Ще відключіть контекстне меню для форми. Останнє поясню по ходу коду форми frmMsgBox:


Option Compare Database
Option Explicit

Private mvarReturn As Variant “повертається числове значення
Private mintButtonClicked As Integer “на якій кнопці кликнули

Private Sub cmdButton1_Click()


“Присвоюємо змінної номер кнопки і закриваємо форму
    mintButtonClicked = 1
    DoCmd.Close acForm, Me.Name, acSaveNo
End Sub
Private Sub cmdButton2_Click()
    mintButtonClicked = 2
    DoCmd.Close acForm, Me.Name, acSaveNo
End Sub


“Наведені нижче чотири процедури – найчистіші візуальні прибамбаси для виділення


“Отримання фокусу” кнопок “при натисканні Tab або проведенні мишкою, але як красиво! 😉


Private Sub cmdButton1_GotFocus()
    Me.lblFakeButton1.FontBold = True
    Me.lblFakeButton2.FontBold = False
Me.lblFakeButton1.SpecialEffect = 3 “плоский
Me.lblFakeButton2.SpecialEffect = 0 “втиснутий


mintButtonClicked = 1
End Sub
 


Private Sub cmdButton2_GotFocus()
    Me.lblFakeButton1.FontBold = False
    Me.lblFakeButton2.FontBold = True
    Me.lblFakeButton1.SpecialEffect = 0
    Me.lblFakeButton2.SpecialEffect = 3


mintButtonClicked = 2
End Sub


Private Sub cmdButton1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.lblFakeButton1.FontBold = True
Me.lblFakeButton2.FontBold = False
Me.lblFakeButton1.SpecialEffect = 3
Me.lblFakeButton2.SpecialEffect = 0
mintButtonClicked = 1
End Sub
 


Private Sub cmdButton2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.lblFakeButton1.FontBold = False
Me.lblFakeButton2.FontBold = True
Me.lblFakeButton1.SpecialEffect = 0
Me.lblFakeButton2.SpecialEffect = 3
mintButtonClicked = 2
End Sub
 


“Встановимо властивість Перехоплення натискання клавіш у форми = Так


“Для того, щоб відпрацьовував [Enter]


Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
DoCmd.Close acForm, Me.Name, acSaveNo
End If
End Sub

Private Sub Form_Close()
On Error Resume Next
Select Case StrConv (Mid $ (Me (“cmdButton” & mintButtonClicked). Caption, 2), vbLowerCase) “тут необхідно зрізати перший символ” & “(використовується для швидкого вибору)
“Проведемо аналіз підпису і повернемо результат (Public Property Let MBoxResult)


Case “так”
        MBoxResult = vbYes
Case “ні”
        MBoxResult = vbNo
    Case “ok”
        MBoxResult = vbOK
Case “скасувати”
        MBoxResult = vbCancel
Case “повторити”
        MBoxResult = vbRetry
End Select
End Sub

Private Sub Form_Open(Cancel As Integer)
Dim intCount As Integer, intNumberOfButtons As Integer
Dim intDefaultButton As Integer
Dim lngFormWidth As Long, lngHalfButton As Long

If Not (StrComp(Me.OpenArgs & vbNullString, “MBox”, vbBinaryCompare) = 0) Then


“Проведемо аналіз переданих аргументів, якщо ні то взагалі нічого не відкриємо 😉
    Cancel = True
    Exit Sub
End If

“Одержимо параметри властивостей з mdlMsgBox модуля
Me.txtMessage.Value = MBoxPrompt
“Вкажемо відповідну іконку повідомлення – спочатку малюнки не відображаються
Select Case MBoxIconStyle
    Case vbCritical
        Me.picCritical.Visible = True
Me.recBorder.BorderColor = RGB (230, 70, 30) “тут, звичайно, використовуйте свої
Me.lblFakeButton1.BackColor = RGB (230, 70, 30) “кольору, витримані в
Me.lblFakeButton2.BackColor = RGB (230, 70, 30) “загальною тематикою програми
    Case vbExclamation
        Me.picExclamation.Visible = True
        Me.recBorder.BorderColor = RGB(230, 190, 20)
        Me.lblFakeButton1.BackColor = RGB(230, 190, 20)
        Me.lblFakeButton2.BackColor = RGB(230, 190, 20)
    Case vbInformation
        Me.picInformation.Visible = True
        Me.recBorder.BorderColor = RGB(150, 200, 50)
        Me.lblFakeButton1.BackColor = RGB(150, 200, 50)
        Me.lblFakeButton2.BackColor = RGB(150, 200, 50)
End Select
“Якщо переданий заголовок, тоді отримуємо і вказуємо його в рядку заголовка
If Len(MBoxTitle) > 0 Then Me.Caption = MBoxTitle

“Необхідно розподілити кнопки горизонтально – одна посередині або дві поруч
lngFormWidth = Me.Width
lngHalfButton = Me.cmdButton1.Width * 0.5 “всі кнопки однакові по ширині
Select Case MBoxNumberOfButtons “в залежності від кількості кнопок
    Case 2
        Me.cmdButton1.Left = lngFormWidth * 0.25 – lngHalfButton
        Me.cmdButton2.Left = lngFormWidth * 0.75 – lngHalfButton
        Me.lblFakeButton1.Left = lngFormWidth * 0.25 – lngHalfButton
        Me.lblFakeButton2.Left = lngFormWidth * 0.75 – lngHalfButton
“Підпишемо обидві кнопки – тут краще значення отримати в змінну і нею маніпулювати
        Me.cmdButton1.Caption = MBoxCustomButton1
        Me.lblFakeButton1.Caption = MBoxCustomButton1
        Me.cmdButton2.Caption = MBoxCustomButton2
        Me.lblFakeButton2.Caption = MBoxCustomButton2
        Me.cmdButton1.Visible = True
        Me.cmdButton2.Visible = True
        Me.lblFakeButton1.Visible = True
        Me.lblFakeButton2.Visible = True
    Case Else
        Me.cmdButton1.Left = lngFormWidth * 0.5 – lngHalfButton
        Me.lblFakeButton1.Left = lngFormWidth * 0.5 – lngHalfButton
“Підпишемо кнопку
        Me.cmdButton1.Caption = MBoxCustomButton1
        Me.lblFakeButton1.Caption = MBoxCustomButton1
        Me.cmdButton1.Visible = True
        Me.lblFakeButton1.Visible = True
End Select

“Встановимо кнопку за замовчуванням
intDefaultButton = MBoxDefaultButton
If intDefaultButton > 0 And (intDefaultButton <= MBoxNumberOfButtons) Then
    Me(“cmdButton” & intDefaultButton).Default = True
    Me(“cmdButton” & intDefaultButton).SetFocus


“Хоч кнопка і прозора, але фокус-таки підтримує 😉
Else
    Me.cmdButton1.Default = True
End If
End Sub


Ну от практично все. Можна видалити кнопку закриття і кнопку віконного меню нашої форми – особисто я все це відключив – у мене в діалогове вікно форми має лише сиротливо смужку заголовка без єдиної кнопки. Також можна задати підпис заголовка форми в конструкторі, наприклад “Моя програма” – вона буде відображатися, якщо рядок заголовка не буде передана при виконанні функції.


Ах, так, як же використовувати цю функцію? зовсім забув ;). Виклик цієї функції нічим не відрізняється від виклику стандартної функції MsgBox, з тією лише відмінністю, що викликати треба MBox. Пам’ятайте тільки, що використовуються лише дві кнопки! і уникайте виклику з трьома кнопками (якщо хочете можете доопрацювати код для трьох кнопок ;), але особисто мені на практиці варіанти вибору з трьома кнопками не були потрібні ні разу.


Наприклад, так (і такий текст (Tahoma 10 пт) відмінно виглядає в саморобному MBox “е):


If MBox (“Перед початком архівації перевірте,” & _
“Щоб база була закрита на всіх інших комп’ютерах в мережі.” & VbCrLf & _
“Інакше при спробі архівації виникне помилка.” & VbCrLf & vbCrLf & _
“Починаємо архівацію?”, VbExclamation + vbYesNo + vbDefaultButton2, _
“Архівація даних”) = vbYes Then


……………….
End If


або так:


MBox “Архівація даних необхідно запускати тільки на комп’ютері,” & _
“На якому сама база і знаходиться.”, VbInformation, _
“Архівація даних”


Красивих Вам MBox “ов!

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*