Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 699
от 03.02.2008, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 276, Экспертов: 40
В номере:Вопросов: 3, Ответов: 11

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 120610: Здравствуйте уважаемые эксперты! Такой вот вопрос. Когда-то мне понадобилось, чтоб при запуске программы в трее создавалась иконка, которая при нажатии правой кнопкой вызывала PopUp Меню. С сайта Артёма Луканина скачал пример, который Вам и присылаю ...
Вопрос № 120655: Доброго времени суток уважаемые эксперты. Вопрос мой в следующем: Дело происходит в VBA под Access. Как можно произвести простые вычисления над числовыми значениями в переменных по формуле, которая находится тоже в переменной? Напри...
Вопрос № 120717: Добрый день! Помогите решить проблему. Написал простенькую программку на VB6, типо калькулятор - в текстовое поле вводим цыфры, нажимаем кнопочку и все считает. Проблема: если вдруг вводят не цыфры, а буквы тутже вылетает ошибка и программка закрывае...

Вопрос № 120.610
Здравствуйте уважаемые эксперты! Такой вот вопрос. Когда-то мне понадобилось, чтоб при запуске программы в трее создавалась иконка, которая при нажатии правой кнопкой вызывала PopUp Меню. С сайта Артёма Луканина скачал пример, который Вам и присылаю . Сейчас вспомнил про него и решил попробовать (раньше ничего, кроме как иконки в Трее не работало). Мучился , мучился так ни чего и не добился. Не могу понять зачем надо помещать на форму PictureBox и
называть его picNotifier если толку от него ни какого. Естественно в программе экспериментировал, но так и не добился, какого либо реагирования иконки при нажатии на правую кнопку. Пожауйста если не трудно напишите пример (простенький, чтоб при нажатии на иконку в Трее всплывало меню) или же как правильно
использовать этот пример. Уменя Visual Basic 6.0. Заранее
благодарен Вам! С уважением Полюхович Игорь.

Приложение:

Отправлен: 28.01.2008, 23:06
Вопрос задал: Полюхович Игорь Львович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: HookEst
Здравствуйте, Полюхович Игорь Львович!
1. Создаете стандартный модуль с кодом:

Option Explicit
'Декларация для NotifyIcon
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
uCallBackMessage As Long
hIcon As Long
szTip As String * 64
End Type

Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2

Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4

Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201 'Button down
Public Const WM_LBUTTONUP = &H202 'Button up
Public Const WM_LBUTTONDBLCLK = &H203 'Double-click
Public Const WM_RBUTTONDOWN = &H204 'Button down
Public Const WM_RBUTTONUP = &H205 'Button up
Public Const WM_RBUTTONDBLCLK = &H206 'Double-click

Public Declare Function SetForegroundWindow Lib "user32" _
(ByVal hwnd As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32" _
Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean

Public nid As NOTIFYICONDATA


2. В модуль формы вставляете код:

Option Explicit

Private Sub Form_Load()
'форма должна быть видима перед Shell_NotifyIcon
Me.Show
Me.Refresh
With nid
.cbSize = Len(nid)
.hwnd = Me.hwnd
.uId = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallBackMessage = WM_MOUSEMOVE
.hIcon = Me.Icon
.szTip = "Подсказка для иконки" & vbNullChar
End With
Shell_NotifyIcon NIM_ADD, nid
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'эта процедура обрабатывает callback сообщения от System Tray icon.
Dim Result As Long
Dim msg As Long
'значение X зависит от scalemode
If Me.ScaleMode = vbPixels Then
msg = X
Else
msg = X / Screen.TwipsPerPixelX
End If
Select Case msg
Case WM_LBUTTONUP '514
Me.WindowState = vbNormal
Result = SetForegroundWindow(Me.hwnd)
Me.Show
Case WM_LBUTTONDBLCLK '515
Me.WindowState = vbNormal
Result = SetForegroundWindow(Me.hwnd)
Me.Show
Case WM_RBUTTONUP '517
Result = SetForegroundWindow(Me.hwnd)
Me.PopupMenu Me.mPopupSys
End Select
End Sub

Private Sub Form_Resize()
If Me.WindowState = vbMinimized Then Me.Hide
End Sub

Private Sub Form_Unload(Cancel As Integer)
Shell_NotifyIcon NIM_DELETE, nid
End Sub

'обработчики для меню
Private Sub mPopExit_Click()
Unload Me
End Sub

Private Sub mPopRestore_Click()
Dim Result As Long
Me.WindowState = vbNormal
Result = SetForegroundWindow(Me.hwnd)
Me.Show
End Sub


3. в свойствах формы выставляете:

Icon = Иконку для вашего приложения
Minbutton = True
ShownInTaskbar = False

4. создаете для формы меню:
на главном уровне:

Caption=&SysTray
Name=mPopupSys
Enabled=True
Visible=False

в него вставляете подпункты(уровнем ниже)

Caption=&Восстановить
Name=mPopRestore
Enabled=True
Visible=True

и

Caption=&Закрыть
Name=mPopExit
Enabled=True
Visible=True


picNotify не нужен, для обработки callback сообщений используется процедура самого окна, в нашем случае в обработчике Form_MouseMove
Успехов.
Ответ отправил: HookEst (статус: Практикант)
Ответ отправлен: 29.01.2008, 06:30
Оценка за ответ: 5
Комментарий оценки:
Спасибо за ответ и пример. Это как раз то, что нужно. Оказалось всё не так уж и сложно.


Вопрос № 120.655
Доброго времени суток уважаемые эксперты.
Вопрос мой в следующем:
Дело происходит в VBA под Access.
Как можно произвести простые вычисления над числовыми значениями в переменных по формуле, которая находится тоже в переменной?
Например:
strAlg = "A+B"
A=1
B=2
Sum=.....
Спасибо.
Отправлен: 29.01.2008, 11:31
Вопрос задал: grist (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: KunkTator
Здравствуйте, grist!
Встроенными средствами - никак. Нужно писать отдельную (-под)программу, анализирующую Вашу strAlg через Mid. В сложном случае тянет на курсовую.
Общая идея такая. Удаляем из strAlg все пробелы (или еще какой мусор). Создаем динамический массив текстовых переменных. Заносим в первую переменную массива то, что между первой и последней скобками в strAlg. Ищем есть ли в ней еще скобки. Если есть, то заносим во вторую. И т.д. Потом анализируем переменные из массива начиная с конца на предмет выявления обозначений функций (знаки "+","-","*","/", "ln","exp" и т.п.), и выполняем соответствующие действия согласно приоритетам (сначала возведение в степень, потом синусы-косинусы и т.д).
Прошу прощения, может не очень развернуто - но еще раз повторюсь: задачка в общем виде не простая. Скорее всего можно упростить согласно конкретным требованиям.
---------
Sapienti sat!
Ответ отправил: KunkTator (статус: 3-ий класс)
Ответ отправлен: 29.01.2008, 12:44
Оценка за ответ: 4
Комментарий оценки:
Спасибо. Рекомендую решение от HookEst.

Отвечает: HookEst
Здравствуйте, grist!
Именно у Access.Application есть метод Eval (см. мануал), он позволяет выполнять вычисления кода из строки.
Единственная сложность, то что код выполняется в глобальном контексте, и надо продумать, как Вы будете подставлять туда значения переменных, через контролы формы, или еще как.
Вот, в приложении, например, вариант простой текстовой замены имен переменных на их значения. т.к. в коде можно использовать не только простые операторы но и именованные функции, надо предусмотреть чтобы имя переменной не входило больше ни в какие имена в коде. Для реального использования, нужно наверное доработать, но как пример.
Успехов.

Приложение:

Ответ отправил: HookEst (статус: Практикант)
Ответ отправлен: 29.01.2008, 13:50
Оценка за ответ: 5
Комментарий оценки:
Великолепное решение.....имхо! :-) Спасибо большое HookEst. Решение красивое, в моем случае подходит на все 100.

Отвечает: Тесленко Евгений Алексеевич
Здравствуйте, grist!
В простом случае можно воспользоваться подобной функцией.
Удачи Вам.
Евгений.

Приложение:

Ответ отправил: Тесленко Евгений Алексеевич (статус: Студент)
Ответ отправлен: 29.01.2008, 18:51
Оценка за ответ: 4
Комментарий оценки:
Спасибо Тесленко Евгений Алексеевич, но это не мой случай. Формулы в таблице. Таблица это справочник, формируемый пользователем..... В общем в жизни все не так просто, но все равно спасибо. Удачи.


Вопрос № 120.717
Добрый день! Помогите решить проблему. Написал простенькую программку на VB6, типо калькулятор - в текстовое поле вводим цыфры, нажимаем кнопочку и все считает. Проблема: если вдруг вводят не цыфры, а буквы тутже вылетает ошибка и программка закрывается. Я понимаю проблема в обработке различных типов данных. Подскажите как избежать ошибки.
Отправлен: 29.01.2008, 17:32
Вопрос задала: CLov233 (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: AlexanderZh
Здравствуйте, CLov233!
Очевидно нужно проверять вводимые данные :)
Метод проверки зависит от того, как организуется ввод. Можно проверять каждый символ в событии "нажание кнопки" и если он не соответствует критерию (не является цифрой, точкой или математическим знаком) то запрещать его ввод.
Можно проверять значение поля на "правильность" уже после ввода всего числа. Или встроить такую проверку перед выполненинем математических действий.
Очень жалко, что вы не привели кода программы...
---------
Людей можно поделить на 10 типов: тех, кто понимает двоичную систему и тех, кто нет... © народное
Ответ отправил: AlexanderZh (статус: Практикант)
Ответ отправлен: 29.01.2008, 17:48

Отвечает: Максим Sly
Здравствуйте, CLov233!
попробуйте воспользоваться процедурой обработки нажатия клавиши, приведенной ниже...
должно помочь.. этот код позволяет нажимать клавиши с цифрами, и клавиши для удаления этих цифр т.е. Back Spase или Delete...
если же нажата какая либо другая клавиша, то она игнорируется.

Приложение:

---------
Мы не ищем легких путей.... они сами нас находят:)

Ответ отправил: Максим Sly (статус: 1-ый класс)
Ответ отправлен: 29.01.2008, 17:49

Отвечает: KunkTator
Здравствуйте, CLov233!
Если свойство CauseValidate у Text1 существует (в Вашей версии VB) и установленно в TRUE, то
Private Sub Text1_Validate(Cancel As Boolean)
If Not IsNumeric(Text1.Text) Then
MsgBox "Please enter numbers only.", vbInformation
'можно протереть
Text1.Text = ""
Cancel = True
End If
End Sub
---------
Sapienti sat!
Ответ отправил: KunkTator (статус: 3-ий класс)
Ответ отправлен: 29.01.2008, 18:58
Оценка за ответ: 5

Отвечает: Тесленко Евгений Алексеевич
Здравствуйте, CLov233!
В дополнение к сказанному AlexanderZh и Максим Sly.
значение поля на "правильность" проверяется проверяется примерно так:
If Not IsNumeric(Text1.Text) Then Exit Sub
А при проверке ввода при нажантии клавиши, необходимо проверять код разделителя целой и дробной части. запятая или точка, код 44 или 46, в зависимости от национальной настройки. Иначе математические операции с нецелыми числами будут невозможны.
Евгений.
Ответ отправил: Тесленко Евгений Алексеевич (статус: Студент)
Ответ отправлен: 29.01.2008, 19:19

Отвечает: DrakoN
Здравствуйте, CLov233!
дополним ответ последнего експерта)

код проверки считалки

Try
здесь считаем
Catch ex as Exception
MsgBox("введены невреные данные")
end try
код проверки числа

после нажатия кнопки любого действия
try
Cdbl(TextBox.Text)
catch ex as Exception
MsgBox("плохие данные")
end try

И именно дабл так как Операции IsNumeric запретят вводить запятую и прочие мат знаки вообщем плохая это затея

---------
От Винта!
Ответ отправил: DrakoN (статус: Студент)
Ответ отправлен: 29.01.2008, 23:17

Отвечает: HookEst
Здравствуйте, CLov233!
Ответов много, добавлю свой.
Вариантов решения несколько.
Можно просто наплевать на то, что ввел пользователь, а перед использованием, значение поля "прогнать" через Val (не забывая, что Val принимает только (.) как разделитель):

Private Sub Command1_Click()
MsgBox Val(Replace(Text1, ",", "."))
End Sub

Можно просто информировать об ошибке и все.
Эти варианты не очень уважительно относятся к пользователю.

Есть неплохой, очень эффективный вариант, вообще запретить фокус ввода для поля, а весь ввод обрабатывать в обработчиках формы(KeyPreview=True), так сделано в калькуляторе Windows(calc.exe).
что-нибудь вроде:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim t As String
Dim dec As String
t = Val(Text1)
dec = IIf(Right(Text1, 1) = ".", ".", "")
Select Case KeyCode
Case vbKey0 To vbKey9
t = t & dec & Chr(KeyCode)
Case vbKeyNumpad0 To vbKeyNumpad9
t = t & dec & Chr(KeyCode - 48)
Case vbKeyDelete
t = ""
Case vbKeyBack
If dec = "." Then
dec = ""
Else
t = Left(t, Len(t) - 1)
End If
End Select
Text1 = Val(t)

If KeyCode = vbKeyDecimal Then If dec = "" Then Text1 = Val(t) & "."
End Sub

таким образом, можно делать проверки любой сложности, перехватывать буфер обмена и т.д. и т.п.
этот вариант - мощный, но достаточно сложный для реализации.

Варианты попроще, те что уже озвучили, это проверять ввод в обработчиках поля.

OnKeyPress - очень удобный, простой, но не учитывает то, что из буфера обмена, значени можно вставлять не только нажимая Ctrl+V, а например с помощью мыши. В таком случае, данный вариант не сработает.

OnValidate - также удобный для нас, но проверка ввода происходит только в момент потери фокуса поля, что не очень удобно для пользователя.

OnChange - этот вариант еще не озвучили, но мне он нравится больше всего:

Private Sub Text1_Change()
Static OldVal As String
Dim ss As Long
Dim sl As Long
If Trim(Text1) = "" Then OldVal = "": Text1 = "": Exit Sub
If Not IsNumeric(Text1) Then
With Text1
ss = .SelStart
sl = .SelLength
.Text = OldVal
.SelStart = ss - 1
.SelLength = sl
End With
Else
OldVal = Text1
End If
End Sub

просто, удобно, не зависит от способа изменения данных, мне нравится.

Все эти способы можно комбинировать.
Вообщем, что хотел - сказал.
Успехов.
Ответ отправил: HookEst (статус: Практикант)
Ответ отправлен: 30.01.2008, 06:56
Оценка за ответ: 5

Отвечает: Черников Игорь Владимирович
Здравствуйте, CLov233!
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 8, 44, 46, 48 To 57 'При вводе десятичных цифр (48-57) Вам понадобится точка (46) или запятая (44) - ненужное уберите
Case 13 'Код клавиши Enter
' здесь можно вставить код вычисления
Case Else
KeyAscii = 0
End Select
End Sub
---------
От каждого по способностям, каждому по труду
Ответ отправил: Черников Игорь Владимирович (статус: 10-ый класс)
Ответ отправлен: 30.01.2008, 17:58


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.70 от 17.01.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное