Новости
Карта сайта
Авторы
Поиск
Рассылки
Статьи и информация
VB хитрости
Популярные ошибки
Книги
Конференция
Программы
Контролы
Примеры
Разное
Ссылки

Хитрости

Разное

Количество просмотров: 31038

Если у вас есть хитрости, которыми хочется поделиться с товарищами по ремеслу - пишите, они обязательно будут опубликованы.

Печать форм, размер которых превышает размер экрана
 
Автор: Сергей Лучанинов

Используйте PrintForm. Только нужно форму делать дитем от МДИ, наче печатает только то, что было бы видно на экране (я эти формы даже не показываю), без рамок и с белым цветом фона. Размер формы должен соответствовать размеру бумаги - лекго считать через твипы и миллиметры. Чтобы размер изобраджений
соответствовал бланку я сканирую чистый бланк (с экранным разрешением), кладу его фоновым рисунком, рисую по нему таблицы, текст и т.д, а потом убираю.

Добавлено: 24 августа 2002



Сделать программу невидимой в списке задач Windows 9х
 
Автор: Роман Овчинников

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



Вывод на экран постоянного показа позиции курсора в ToolTyp'е
 
Автор: Михаил Эскин

В своей программке столкнулся с необходимостью вывода на экран постоянного
показа позиции курсора в ToolTyp'е.
Я думаю, что этот пример подойдет для твоего раздела хитростей:
 
1. Создаем форму Form1, размещаем на ней PictureBox с именем Picture1. Вводим код:

Option Explicit
Private clsPictureBox1 As Class1

Private Sub Form_Load()
    Set clsPictureBox1 = New Class1
    Set clsPictureBox1.Coordinat = Picture1
End Sub

2. Создаем модуль класса Class1 и размещаем в нем код:
Option Explicit

Private WithEvents pic As PictureBox

Public Property Set Coordinat(OutsidePictureBox As PictureBox)
    Set pic = OutsidePictureBox
End Property

Private Sub pic_MouseMove(Button As Integer, Shift As Integer, _ 
                          X As Single, Y As Single)
    pic.ToolTipText = "X = " & X & "; Y = " & Y
End Sub

Добавлено: 24 августа 2002



Microsoft Office - настройки пользователя
 
Автор: Alexander Dubina

Приложения 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



Как выбрать n - ый элемент не перебирая все n-1
 
Автор: Борис Рудой

Мало кто использует встроенную функциб Бэйсика
Choose. А зря. Все очень просто:
Choose(5, "A", "B", "C", "D", "F")
Вернет вам F , очень удобно для работы с днями недели,
месяцами, или просто для выбора

Добавлено: 24 августа 2002



К хитростям

Rambler's Top100
Хостинг от Parking.ru