Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 93.


VBNet VBMania
Голосование:

Ваш голос отсылается по E-mail владельцу сайта, после чего голоса анализируются и на отдельной странице выводятся результаты.

Нет тем.

Рассылки Subscribe.Ru
Мир программирования на Visual BASIC 5.0 и HTML.
Новости сайта IgorykSoft и советы по программированию
Visual Basic.NET Уроки.

Доска почёта:

Sergey Y. Tkachev
Кононенко Роман
Kirill

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • Snoozex Design
  • IgorykSoft
  • Господа!!! читайте MSDN!!!

    Несколько слов от автора:

       Новый выпуск!
    Читайте!


    Содержание выпуска




    Книги

    Переход на VB .NET. Стратегии, концепции, код (цена ~ 158 руб.)

    Эта книга была задумана как одна из первых книг о .NET, которая ознакомит читателя с основными идеями новой архитектуры и подготовит его к знакомству с более детальной литературой, например документацией Microsoft и ее толкованиями, которая неизбежно появится на рынке. Она поможет вам взглянуть на эту технологию с позиций ваших собственных рабочих планов и быстро освоить те концепции, которые покажутся необычными для большинства прогр...

    Автор(ы): Дан Эпплман, Издательство: Питер, 2002 г.


    Программирование на VB.NET. Учебный курс (цена ~ 119 руб.)

    Эта книга является вводным курсом по изучению языка программирования Visual Basic .NET. Даны основные принципы объектно-ориентированного программирования в контексте языка VB .NET, поскольку без хорошей подготовки в этой области невозможно в полной мере пользоваться всеми преимуществами VB .NET.
    Изложены азы всех аспектов языка, которыми должен владеть любой профессиональный разработчик VB .NET

    Автор(ы): Г. Корнелл, Дж. Моррисон, Издательство: Питер, 2002 г.


    VB.NET для разработчиков (цена ~ 125 руб.)

    Основная задача книги - быстро ознакомить разработчиков Visual Basic с изменениями в .NET Framework. Программисты, использующие Java, C++, Delphi или другие инструменты разработки приложений и интересующиеся Visual Basic или технологией .NET Framework, также найдут эту книгу полезной. Хотя книга посвящена Visual Basic.NET, ее основная цель - продемонстрировать взаимодействие Visual Basic и ...

    Автор(ы): Кит Франклин, Издательство: Вильямс, 2002 г.




    Остальные книги о VB можно найти
    здесь.

    наверх


    Пример вызова справки из вашего приложения

    Данный пример довольно прост - имеет всего три шага, но довольно часто задается "юными" программистами, создающими справочные файлы для своих приложений. Итак, вот что нужно для отображения в вашей программе файла Справки myfile.chm:

    'Объявим переменную.
    Const HH_DISPLAY_TOPIC = &H0
    'Объявим API-функцию HtmlHelp.
    Declare Function HtmlHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" (ByVal hwndCaller As Long, ByVal pszFile As String, ByVal uCommand As Long, ByVal dwData As Long) As Long
    'Создадим вызов HtmlHelp
    Private Sub HH_DISPLAY_Click()
    Dim hwndHelp As Long
    'hWnd - переменная типа Long, содержащая указатель формы,
    'которое будет родительским к окну справки
    'hwndHelp - будет содержать указатель созданного окна Справки
    hwndHelp = HtmlHelp(hWnd, "myfile.chm", HH_DISPLAY_TOPIC, 0)
    End Sub
    'Источник: http://www.relib.com/code.asp?id=360

    наверх


    Использование функции MessageBox в программе

    В VisualBasic'е, когда вы вызываете функцию MsgBox
    , все ваши работающие процессы в фоновом режиме (счетчики, таймеры) приостанавливаются до тех пор, пока вы не закроете сообщение. Для преодоления данной проблемы существует API-функция MessageBox.

    Следующий пример покажет разницу между двумя методами. Добавьте на форме 2 элемента CommandButton, элемент Label и элемент Timer.
    Первая кнопка вызывает метод MsgBox, вторая - API-функцию MessageBox.

    Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
    Private Sub Command1_Click()
    MsgBox "Timer ОСТАНОВЛЕН!"
    End Sub
    Private Sub Command2_Click()
    MessageBox Me.hwnd, "Timer НЕ ОСТАНОВЛЕН!", "", vbOKOnly + vbExclamation
    End Sub
    Private Sub Form_Load()
    Timer1.Interval = 1
    End Sub
    Private Sub Timer1_Timer()
    Label1.Caption = Time
    End Sub

    наверх


    Открытие приложения на весь экран (full screen mode)

    На одном из форумов по VB я увидел такой пример.

    При нажатии на CommandButton 1 вы получаете форму, развернутую на весь экран. Панель задач Windows при этом будет скрыта. При нажатии на CommandButton 2 вы всего лишь получаете форму, также развернутую на весь экран, но при этои панель задач не спрятана.

    Добавьте на форму 2 элемента CommandButton.

    'ВАРИАНТ1

    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

    Const SM_CXSCREEN = 0
    Const SM_CYSCREEN = 1
    Const HWND_TOP = 0
    Const SWP_SHOWWINDOW = &H40

    Private Sub Command1_Click()
    Dim ll_Width As Long
    Dim ll_Height As Long
    If Me.WindowState = vbMaximized Then
    WindowState = vbNormal
    End If
    ll_Width = GetSystemMetrics(SM_CXSCREEN)
    ll_Height = GetSystemMetrics(SM_CYSCREEN)
    Call SetWindowPos(Me.hwnd, HWND_TOP, 0, 0, ll_Width, ll_Height, SWP_SHOWWINDOW)
    End Sub

    Private Sub Command2_Click()
    WindowState = vbMaximized
    End Sub

    'ВАРИАНТ2


    Но возможен и такой вариант: установите свойство формы BorderStyle как 0-None и вставьте следующий код

    Private Sub Form_Load()
    Me.Width = Screen.Width
    Me.Height = Screen.Height
    Me.Left = 0
    Me.Top = 0
    End Sub

    наверх


    Условная компиляция

    Решил донести до вас правду об условной компиляции. Есть в бэйсике такая штука. Удобная временами. Что означает условная и для чего это надо в принципе?
    Например, у вас есть программа, которая должна работать как демо-версия и как полная версия.
    Прекрасно, вы можете распространять полный код, делая в нем проверку, какой тип версии сейчас запущен. Однако вам боязно: вдруг сломают? Условная компиляция - это возможность не включать в код ненужные блоки. Или, более приближенный к боевым условиям пример: В программе полно отладочной информации - не тащить же ее в реальный проект. Убрать - раз плюнуть, но в какой-то
    момент может и пригодится.
    Условная компиляция дает нам возможность избежать хранения отдельных версий в виде разных проектов.
    Вот вам для начала пример.
    В модуле создаем паблик-процедуру:

    Public Sub WriteLog(MSG As String)
    Dim iFileNum As Long
    const LogName = "AppLog" ' эту константу стоит убрать в область деклараций модуля
    iFileNum = FreeFile
    Open App.Path & "\" & LogName For Append As iFileNum
    Print #iFileNum, Format(Now, "mm/dd hh:nn:ss") & " " & MSG
    Close #iFileNum
    End Sub

    Процедура делает элементарные вещи. Открывает файл для записи и пишет туда что попросили. Штука полезная для программ, работающих самостоятельно, без участия человека.
    Как будем ее вызывать:

    #if isLog then
    writelog "Сообщение для записи"
    # endif

    После чего идем в свойства проекта и в закладке Make ищем поле для записи, обозначенное как Conditional Compilation Arguments и вписываем туда

    islog = 1

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

    islog = 0,

    код вызова включен не будет.

    Можно писать туда несколько переменных islog (под любым именем), разделяя каждую двоеточием :

    наверх


    Определение "ухода" и "возвращения" в программу

    Иногда требуется определить, когда ваша программа потеряла фокус, то есть стала неактивной в данной момент программой. Также этот пример показывает момент активизации вашей программы.

    В данном примере вам обязательно потребуется дополнительный модуль, в который вы должны вписать следующий код:

    'КОД МОДУЛЯ

    Private Const WM_ACTIVATEAPP = &H1C
    Private Const GWL_WNDPROC = (-4)
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private m_lWndProc As Long
    Public Sub WindowHook(hWnd As Long)
    m_lWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf MessageCenter)
    End Sub
    Public Sub WindowFree(hWnd As Long)
    SetWindowLong hWnd, GWL_WNDPROC, m_lWndProc
    End Sub
    Private Function MessageCenter(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_ACTIVATEAPP Then
    If wParam Then
    Form1.OnAppActivate
    Else
    Form1.OnAppDeActivate
    End If
    End If
    MessageCenter = CallWindowProc(m_lWndProc, hWnd, Msg, wParam, lParam)
    End Function

    'КОД ФОРМЫ

    Private Sub Form_Load()
    WindowHook hWnd
    End Sub
    Public Sub OnAppActivate()
    MsgBox "Добро пожаловать назад!"
    End Sub
    Public Sub OnAppDeActivate()
    MsgBox "Покидаете программу?"
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    WindowFree hWnd
    End Sub

    наверх


    Использование текста в качестве кода программы

    В данном примере вам понадобятся следующие элементы: ComboBox, TextBox, Label, CommandButton. В ComboBox программа добавляет так называемые шаблоны, Label отображает текущее состояние выполнения кода, в TextBox'е содержится непосредственно текст, являющийся кодом программы, ну а CommandButton... и так понятно.

    Как ни жаль, но всех возможностей функции EbExecuteLine я не знаю. Как говорится, вам и карты в руки.

    Чуть не забыл. Вам понадобится дополнительный модуль в вашей программе.

    'КОД МОДУЛЯ

    Public Function secret() As String
    secret = "this is a secret subroutine"
    End Function
    Public Sub secret2()
    MsgBox "this is a secret subroutine 2"
    End Sub

    'КОД ФОРМЫ

    Option Compare Text
    Option Explicit

    Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Foo1 As Long, ByVal Foo2 As Long, ByVal fCheckOnly As Long) As Long

    ' For VB5 IDE
    'Declare Function EbExecuteLine Lib "vba5.dll" (ByVal pStringToExec As Long, ByVal Foo1 As Long, ByVal Foo2 As Long, ByVal fCheckOnly As Long) As Long

    ' FOR Access 97/VBE.dll clients like Word 97 and Excel 97
    'Declare Function EbExecuteLine Lib "vba332.dll" (ByVal pStringToExec As Long, ByVal Foo1 As Long, ByVal Foo2 As Long, ByVal fCheckOnly As Long) As Long

    Function FExecuteCode(stCode As String, Optional fCheckOnly As Boolean) As Boolean
    FExecuteCode = EbExecuteLine(StrPtr(stCode), 0&, 0&, Abs(fCheckOnly)) = 0
    End Function

    Private Sub Combo1_Click()
    Text1.Text = Combo1.List(Combo1.ListIndex)
    End Sub

    Private Sub Command1_Click()
    Dim res As Boolean
    res = FExecuteCode(Text1.Text)
    Label1.Caption = "Status = " & res
    End Sub

    Private Sub Form_Load()
    Combo1.AddItem "?secret"
    Combo1.AddItem "msgbox secret"
    Combo1.AddItem "secret2"
    Combo1.AddItem "For x=0 to 5:?" & Chr$(34) & "hello " & Chr$(34) & "&x:next:beep"
    Combo1.AddItem "sendkeys " & Chr$(34) & "{TAB}" & Chr$(34) & ":sendkeys " & Chr$(34) & "{up}" & Chr$(34)
    Combo1.AddItem "shell " & Chr$(34) & "calc.exe" & Chr$(34) & ",vbNormalFocus"
    Combo1.AddItem "shell " & Chr$(34) & "c:\windows\explorer.exe ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" & Chr$(34) & ",vbNormalFocus"
    Combo1.AddItem "form1.text1.visible=false"
    Combo1.AddItem "form1.text1.visible=true"
    Combo1.AddItem "form1.combo1.listindex=1"
    Combo1.AddItem "msgbox app.Title"
    Combo1.AddItem "form1.combo1.listindex=1:form1.command1.value=true"
    Combo1.ListIndex = 0
    Show
    End Sub

    наверх


    Мои программы

    BalloonMessage for MS Agent

       BalloonMessage for Microsoft Agent реализует диалог программы с пользователем, используя при этом технологию Microsoft Agent. OCX реализует три типа диалоговых окон: InputBox, MsgBox и MsgLabels.

    Автор: Шатрыкин Иван. Соавтор: Павел Сурменок.

    наверх


    Вопрос/Ответ

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Вопросы:


    Автор вопроса:
    Ellias

    Ответ ожидается по этому адресу

       Как можно сделать в программе автооткрывание нода в тривью, при овере элемента над ним ? Типа, как сделано в любом браузере - тащу на папку эл-т, и она открывается спустя определенное время.


    Автор вопроса: Свиридов Игорь

    Ответ ожидается по этому адресу

       1)как можно в одном окне просматривать и каталоги и файлы? Типа Dir и FileBox в одном. И вообще, кто-нибудь знает где можно найти исходники простенького файл-менеджера, а то изобретать велосипед нехота, устал я что-то :-)
    2)Как можно просматривать иконки из dll-файлов?


    Автор вопроса: Demon

    Ответ ожидается по этому адресу

       Помогите разработать Алгоритм Дейкстра а если укого нибудь исходник на VB если есть пришлите пожалуста очень нужно либо как сделать толко в подробном описание




    Ответы:


    Вопрос:

       Как из VB достоверно определить, что устройство является реальным CD-ROMом, а не винчестером или имиджем?

    Ответ:

    Автор ответа: LexA

    Все очень просто, Иван, для этого надо воспользоваться , если конечно у тебя VB6, FileSystemObject (FSO) функциями


    Вопрос:

       Как из VB достоверно определить, что устройство является реальным CD-ROMом, а не винчестером или имиджем?

    Ответ:

    Автор ответа: Alexander

    Если на ощупь твёрдый и холодный, то это CDROM, а если тёплый и мягкий,...
    А ва-абче, вы, ребятки, задолбали с "защитой", типа компашки "Руссобит", которая "заточила" свои "адаптэйты" под Вынь-98 и больше - ни гу-гу! Так что пользователи ME, 2000, XP могут не беспокоиться: им не следует покупать продукцию "Руссобита" ни в коем случае! Причём долбают то потом нас, тех, кто устанавливает и сопровождает системы, а не халтурщиков "Руссобитовцев", блин!


    Вопрос:

       Работаю с Oracle8(использую oracle data control)
    Помогите сделать сортировку, так как используя order by это происходит очень медленно. Если цепляться с Oracle8 другими методами то скорость еще медленнее
    Дайте пожалуйста совет!

    Ответ:

    Автор ответа: Александр Горбылёв

    Это может происходить по причинам (общий подход):
      
    а) неправильного построения запроса: например, вместо того, чтобы использовать курсор сервера, используется курсор клиентской стороны, как следствие - см. пункт (в),
    б) не использовать кэш на большое количество хранимых записей,
    в) плохая работа сети из-за большого количества коллизий пакетов,
    г) не используйте ODBC, а что-либо "по-прямее", типа провайдера курсоров,
    д) неверное распределение нагрузки при мультисерверной обработке,
    ....


    Вопрос:

       Как на ВБ6 сделать кнопку, при нажатии на которую играла бы музыка?

    Ответ:

    Автор ответа: quick

    Option Explicit
    Private Declare Function sndPlaySound Lib "winmm.dll" _
    Alias "sndPlaySoundA" (ByVal lpszSoundName As String, _
    ByVal uFlags As Long) As Long
    Dim Result
      
    Private Sub cmdPlaySound_Click()
         Dim strSoundFile As String
         Dim ReturnLength As Long
         '
         strSoundFile = App.Path & "\mySnd.wav" ' по этому пути должен лежать звуковой файл
         Result = sndPlaySound(strSoundFile, 1)
    End Sub
      


    Вопрос:

       Как на ВБ6 сделать кнопку, при нажатии на которую играла бы музыка?

    Ответ:

    Автор ответа: LexA

    Очень просто. На форму наносишь Picture или Image , вставляешь в них иконку (либо с определенной папки, либо из фаила *.REC) и на событие click объекта Picture или Image пишешь код для проигрывания музыки ( есть много срособов проиграть музыку в разных форматах , но это другой вопрос).


    Вопрос:

       Пишу программу. Прога живет в трее и должна выполнять кое какие действия в строго укаяанное польяователем время. К примеру каждый вторник в 12.00. Стандартный шедулер не подходит. Как вобще органияовать такие проверки. если проверять часто наверняка нагруяим систему, если редко можно пролететь со временем. Как быть? Как вобще устроенны планировщики ?

    Ответ:

    Автор ответа: Шатрыкин Иван

    Проверяй, например, каждые 10 секунд, если тебя это устроит. Нагрузим систему? Чушь! Твой процессор простаивает бОльшую часть времени. Только проверяй время по Timer, а не в цикле Do...Loop.


    Вопрос:

       Я ссылаюсь в программе на апи левой библиотеки(т.е. не системной), при этом в ходе выполнения программы мне сообщается что эта библиотека не найдена, хотя она лежит в папке с проектом. Чужая программа испольяует эту библиотеку бея всяких проблем.

    Ответ:

    Автор ответа: ]CBK[CRaSH

    Кинь ты ее в windows\system если у тебя 9х и sustem32 если NT


    Можете заполнить эту форму, либо отослать вопрос СЮДА

    Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел