Разное
Количество просмотров: 31038
Если у вас есть
хитрости, которыми хочется поделиться с товарищами по ремеслу - пишите,
они обязательно будут опубликованы.
|
|
Option Explicit
Private Declare Function RegisterServiceProcess Lib "kernel32.dll" _
(ByVal dwProcessId As Long, ByVal dwType As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long
Private Sub toVisible()
Call RegisterServiceProcess(GetCurrentProcessId, 0)
End Sub
Private Sub toInvisible()
Call RegisterServiceProcess(GetCurrentProcessId, 1)
End Sub
|
| Добавлено: 24 августа 2002 |
Запуск внешней программы с ожиданием ее завершения |
Автор: Борис Рудой |
|
Private Const INFINITE = &HFFFF
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, _
ByVal fInherit As Integer, ByVal hObject As Long) As Long
Private Sub Command1_Click()
WaitForProcessToEnd "C:\test.BAT"
'Let the user know when the process is finished.
MsgBox "The process is finished! "
End Sub
Public Sub WaitForProcessToEnd(cmdLine As String)
'You can substitute a discrete time
'value in milliseconds for INFINITE.
Dim retVal As Long, pID As Long, pHandle _
As Long
pID = Shell(cmdLine)
pHandle = OpenProcess(&H100000, True, pID)
retVal = WaitForSingleObject(pHandle, INFINITE)
End Sub
|
| Добавлено: 24 августа 2002 |
|
|
Приложения Microsoft Office по разному хранят созданные пользователем вручную или с помощью VBA панели инструментов - Word - в шаблонах (dot) или в документах (doc), Excel - где-то в общей настройке, независящей от XLS-фалов, Power Point - еще как-то (разобраться со всем этим можно самостоятельно, ничего сложного нет; подробности исключены так как "хитрость" не совсем об этом).
Независимо от приложения и того, как оно хранит пользовательские панели, в VBA-программах нельзя выполнять следующие действия (попытка приводит к ошибке приложения) :
- Удалить панель, которая в этот момент не существует
- Создать новую панель, причем ее имя совпадает с именем уже существующей панели
(очень распространенная ошибка начинающих VBA-программистов - перед началом работы приложения создается панель - но ведь она уже есть, та же самая; в Excel, например, она была создана при самом первом запуске приложения, да так и болтается, если не была удалена вручную через диалоговое окно "Вид - Панели - инструментов - Настройка")
- Любым образом обратиться к элементам или свойствам несуществующей панели.
Конструктивный вывод из этих печальных фактов - до выполнения таких действий мы должны убедиться в наличии или отсутствии панели.
Так как это требуется довольно часто, пишем библиотечную функцию.
Public Function CommandBarIsReady(CommandBarName As String)
Dim CommandBarIsReady As Boolean
CommandBarIsReady = False
Dim Cycle As Byte
Cycle = 1
For Each Cycle In CommandBars
'цикл по элементам коллекции
If Cycle.Name = CommandBarName Then
CommandBarIsReady = True
 Exit For
'панель с указанным именем обнаружена,
' цикл не нужен
End If
Next
End Function
А вот пример ее использования - в данном случае до описания панели проверяем - может быть она уже есть, тогда делаем ее видимой, если нет, описываем панель (наиболее актуален такой подход для Excel):
Public Sub ИнициализацияПанели()
If CommandBarIsReady("Моя панель") = True Then
Application.CommandBars("Моя панель").Visible = True
'такая панель есть, делаем ее видимой так как считаем, _
что это именно нужная нам панель
Else
' если панели нет, то описываем ее и затем ее элементы
With Application.CommandBars.Add("Моя панель", Temporary:=True)
.Visible = True
.Position = msoBarFloating
With .Controls
With .Add(msoControlButton)
.Caption = "Первая кнопка"
.Style = msoButtonCaption
.TooltipText = "Описание первой кнопки"
.OnAction = "Процедура1"
End With
With .Add(msoControlButton)
.Caption = "Вторая кнопка"
.Style = msoButtonCaption
.TooltipText = "Описание второй кнопки"
.OnAction = "Процедура2"
End With
End With
End With
End If
End Sub
|
| Добавлено: 24 августа 2002 |
|