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


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

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

Subscribe.Ru увеличило максимальный размер рассылки до 100 кб. В связи с этим вопрос:
Какого размера Вы хотели бы получать рассылку?

Менее 20 кб
От 20 до 40 кб
От 40 до 60 кб
От 60 до 80 кб
Выше 80 кб


В какой день (дни) недели Вы хотели бы получать рассылку "Visual Basic: новости сайтов, советы, примеры кодов."?
Понедельник
Вторник
Среда
Четверг
Пятница
Суббота
Воскресение


С какой периодичностью Вы хотели бы получать рассылку "Visual Basic: новости сайтов, советы, примеры кодов."?
Каждый день
2 раза в неделю
Раз в неделю
Раз в две недели
Раз в месяц
Реже


Результаты голосования
Рассылки Subscribe.Ru
Мир программирования на Visual BASIC 5.0 и HTML.


Рассылки Subscribe.Ru
Старые игры

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

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

Ссылки:

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

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

       Внимание!!! Частота выхода рассылки увеличилась! Теперь рассылка будет выходить два раза в неделю по понедельникам и пятницам. В пятничном выпуске будут размещаться примеры, советы и раздел Вопрос/Ответ. Количество публикуемого материала увеличится. А в понедельник в рассылке будут публиковаться новости VB-сайтов, новые темы форума VBNet, анонсы новых книг на VBNet и т.д.
    Читайте!


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




    Пример использования (вызова) файла HTML Help из программы на Visual Basic

    Данный пример довольно прост - имеет всего три шага, но довольно часто задается нашими читателями, создающими справочные файлы для своих приложений. Итак, вот что нужно для отображения в вашей программе файла Справки 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

    наверх


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

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

    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

    наверх


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

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

    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 (под любым именем), разделяя каждую двоеточием :

    наверх


    ASP: Особенности передачи параметров в формах

    Информация взята с сайта
    prosto.pp.ru
         При обработке параметров форм возникает особая ситуация, когда передаваемые значения содержат символы "(кавычки) и/или '(апостроф).
         Пусть, для примера, форма имеет вид:


     <%' принятое значение%>
     <%sTest=Request.QueryString("Test")%>
    <FORM>
       <INPUT TYPE="Text" NAME="Test"
            VALUE="<%=sTest%>">
       <INPUT TYPE="Submit" VALUE="Тест">
     </FORM>


         Т.е. форма получает параметр сама от себя. Все будет хорошо, пока введенная строка не содержит символа "(кавычки). Считанный параметр Test приведет к тому, что тег Test примет вид типа


    <INPUT TYPE="Text" NAME="Test" VALUE="aaa"bbb">


         Как видно налицо разрушение значения VALUE - бровзер отобразит только aaa - в результате параметр станет неверен. Такая же ситуация возможна при использовании символа '(апостроф) для задания значения (VALUE='').
         Для исключения подобных эффектов можно применить следующие функции:

    ' Замена в строке " на кавычки("); ' на апостроф(')
    Function Repl_Load_HTML(str)
       Repl_Load_HTML=Replace(str&"",""","""")
       Repl_Load_HTML=Replace(Repl_Load_HTML,"'","'")
    End Function

    ' Замена в строке кавычек(") на " амперсанда(') на #39;
    Function Repl_Teg_HTML(str)
       Repl_Teg_HTML=Replace(str&"","""",""")
      Repl_Teg_HTML=Replace(Repl_Teg_HTML,"'","'")
    End Function

         При их использовании форма приобретает вид:

    <%' принятое значение%>
    <%sTest=Repl_Load_HTML(Request.QueryString("Test"))%>
    <FORM>
      <INPUT TYPE="Text" NAME="Test"
           VALUE="<%=Repl_Teg_HTML(sTest)%>">
      <INPUT TYPE="Submit" VALUE="Тест">
    </FORM>

         Полезными для при решении подобных проблем можут оказаться методы Server.HTMLEnCode и Server.URLEnCode. При работе с JavaScript на стороне клиента - escape и unescape.

    наверх


    Как данные из файла перекинуть в массив

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

    Private Sub Command1_Click()
    Dim txt
    Dim FN As Integer
    FN = FreeFile
    Dim FName As String
    FName = "D:\1.txt"
    'открыть файл
    Open FName For Input As #FN
    'присвоить переменной содержимое файла
    txt = Input(LOF(FN), #FN)
    'закрыть файл
    Close #FN
    'создать нулевой массив
    Dim str1() As String
    'создать отдельные элементы массива
    'вместо постоянной vbCrLf можно использовать любой разделить
    str1 = Split(txt, vbCrLf)
    'перебор элементов массива идет от 0 до n-1
    For i = 0 To UBound(str1()) - 1
    'вот, собстенно, и проверка
    MsgBox str1(i)
    Next
    End Sub

    наверх


    Проверка на наличие некорректных символов

    Данный пример проверяет строковую переменную на наличие в ней определенных символов. Добавьте на форму CommandButton и TextBox. Вы можете определить те символы, наличие которых вы хотите проверить в строковой переменной в переменной BadChars$.

    Function IsValidString(StringToTest As String, Invalid As String)
    For X = 1 To Len(Invalid)
    If InStr(1, StringToTest, Mid$(Invalid, X, 1), 0) Then
    IsValidString = False
    Exit Function
    End If
    Next X
    IsValidString = True
    End Function

    Private Sub Command1_Click()
    Dim MyString As String
    MyString = Text1.Text
    'Замените '@#$%^&' теми символами, которые вы хотите проверить
    BadChars$ = "@#$%^&"
    X = IsValidString(MyString, BadChars$)
    If X Then
    MsgBox "Это нормальная переменная"
    Else
    MsgBox "Это НЕнормальная переменная"
    End If
    End Sub

    наверх


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

    BalloonMessage for MS Agent

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

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

    наверх


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

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

    Вопросы:


    Автор вопроса:
    Мунгалов Андрей

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

       В программах 1С очень удобные отчеты. можно ли их прицепить к своей программе на VB. и можно ли их таскать со свой программой (без установки всего предприятия). Я пробовал добавить ссылку на Moxel.dll, ругается.


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

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

       Как вывести результаты расчета из программы в текстовый файл с расположением данных по горизонтали (в ряд через промежуток) и добавлением записи в конец файл после уже существующих записей?


    Автор вопроса: Лися aka FOX

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

       Подскажите где можно скачать толковую книгу по VB или VBA, а желательно две,по ним обоим.


    Автор вопроса: Константин

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

       Подскажите, как программно позвонить по телефону?




    Ответы:


    Вопрос:

       1. При установке любой программы (после её закабинечивания мастером упаковки) пишет "неверные линии" в файле Setup.LST как раз там, где указан путь распаковываемых файлов. После сообщения о фатальной ошибке установка ПО прекращается. Пришлось выделить 600 метров диска для установки ещё одной версии Windows SE и VB5. Последняя создаёт нормальную установку, но она не делает кабинетов а файлы *.EX_. Может у кого-нибудь ещё была такая проблема?

    2. Как сделать, что прогамма, выполняющая например 2+2 не занимала 5-7 Мб установки.

    Ответ:

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

    1. Одно из решений проблемы - при создании дистрибутива измените системные
    чзыковые настройки Windows на американский формат. Второе решение - почитать
    статью "Package & Deployment Wizard. Досадная ошибка" на сайте www.vbnet.ru

    2. Нельзя! Не будет работать.


    Вопрос:

       Как сделать некоторые участки формы прозрачными (что-бы через них можно было видеть Рабочий стол) в VB 3-6.
    Можно ли подключать какие-нибудь скины в программу ?

    Ответ:

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

    Устал повторять, что на сайте www.vbnet.ru есть моя статья про создание таких окон.
    http://www.vbnet.ru/articles/showarticle.asp?id=22
    Почитайте! Там все рассказывается.


    Вопрос:

       Кто знает как вставить новую строку в ADODB.RecordSet, открытый как adCmdTableDirect, если там( в table) есть поле IDENTITY(счетчик) и в него надо вставить свое значение. При вызове .addnew и присвоении этому полю значения - он ругается.

    Ответ:

    Автор ответа: Дмитрий Данелия

        Во-первых, если Recordset создается программно, то такая вставка делается любым способом:
        Есть База - c:\temp\db1.mdb, в ней таблица Tabl, а в ней два поля: f1 - счетчик и f2 - строка

    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection
    Dim com As ADODB.Command

    Private Sub Form1_Load()
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    Set com = New ADODB.Command

    cn.CursorLocation = adUseClient
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=c:\temp\db1.mdb", "Admin", ""

    ' хоть с помощью ADODB.COMMAND
    With com
       .ActiveConnection = cn
       .CommandText = "INSERT INTO Tabl (f2) VALUES ('Запись2')"
       .Execute
    End With

    ' хоть с помощью ADODB.RECORDSET
    With rs
       .ActiveConnection = cn
       .LockType = adLockOptimistic
       .Source = "SELECT * FROM Tabl"
       .Open

       .AddNew
       .Fields(0) = 3
       .Fields(1) = "Запись3"
       .Update
       .Close
    End With

    Set com = Nothing
    Set rs = Nothing
    Set cn = Nothing

    End Sub

        Если же у тебя на форме висит ADODC-контрол, с чьим Recordset-ом ты работаешь, то тут у меня получается интересная штука - если на форме только один ADODC - не получается, но если я кладу на форму TextBox и устанавливаю его свойства
    DataSource = Adodc1
    DataField = f2 (а можно и f1), то добавление происходит без проблем
       With Adodc1.Recordset
         .AddNew
         .Fields(0) = 4
         .Fields(1) = "Запись4"
         .Update
       End With

        Естественно, если ты задаешь значение для поля Счетчик, то оно должно быть уникальным - это уже ложится на тебя, ну а если не задаешь, то не очем беспокоиться, Microsoft Jet сам присвоит ему уникальный номер.


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

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

    наверх


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

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