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


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

Голосования сайта VBNet.Ru. Результаты голосований передаются на сайт. Проследите, что есть соединение с интернетом.



Рассылки Subscribe.Ru
VB.NET-World
Новости сайта IgorykSoft и советы по программированию
DanSoft о Visual Basic
Visual Basic.NET Уроки.

Ссылки:

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

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

       Внимание! Кто хочет помочь в разработке новой версии сайта VBNet.Ru на ASP .NET, просьба обратиться ко мне: pavel@vbnet.ru. Желательны знания архитектуры .NET Framework и хотя бы на начальном уровне - ASP .NET.
    Читайте!


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




    CD

       Внимание! В магазине компакт-дисков VBNet.Ru новые цены!
       Снижены до 50 рублей цены на VBNet CD 12 2002 и VBNet CD 04 2003.
       А также введена новая система расчёта расходов на пересылку, теперь они подсчитываются по формуле 30+(10*n), где n - количество заказываемых дисков.
       Комплект из всех 5 дисков с учётом почтовых расходов всего за 350 рублей!

       Заходите: http://vbnet.ru/vbshop/cdshop.asp.

    наверх


    Как загрузить в ListView текст из файла?

    Вопрос:

    Как загрузить в ListView текст из файла?

    Ответ:

    При условии, что файл текстовый, то есть нормально прослеживается EOF, сделай так:

    Dim Str As String
    Open "C:\autoexec.bat" For Input As 1 'вместо autoexec.bat указывается свой файл
    Do Until EOF(1)
    Input #1, Str
    ListView1.ListItems.Add , , Str
    Loop

    Чтобы было красивее, можно вставить ListView1.View=2. Тогда все данные будут выводиться как список.

    Игорь

    наверх


    Как сделать чтобы форма была всегда поверх всех окон?

    Вопрос:

    Как сделать чтобы форма была всегда поверх всех окон?

    Ответ:

    Делается это очень просто.
    Это в модуль:

    Public 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
     Public Const HWND_NOTOPMOST = -2
     Public Const HWND_TOPMOST = -1
     Public Const SWP_NOACTIVATE = &H10
     Public Const SWP_NOMOVE = &H2
     Public Const SWP_NOSIZE = &H1

    Public Sub SetFormPosition(frmHandl As Long, TopPosition As Boolean)
    If TopPosition Then
    SetWindowPos frmHandl, HWND_TOPMOST, 0, 0, 0, 0, _
    SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE
    Else
    SetWindowPos frmHandl, HWND_NOTOPMOST, 0, 0, 0, 0, _
    SWP_NOSIZE Or SWP_NOMOVE
    End If
    End Sub

    Это в любом месте формы:

    call SetFormPosition(Me.hwnd, True)

    Комментарий:
    Это работает точно под WINDOWS 98 и под WINDOWS 98 SE, под другие ОС не пробовалось, проблемы есть точно в WIN XP.

    b17

    наверх


    Как с помощью API вызвать диалоговое окно выбора цвета?

    Вопрос:

    Как с помощью API вызвать диалоговое окно выбора цвета и сохранить новые значения?

    Ответ:

    Private Type ChooseColor
       lStructSize As Long
       hwndOwner As Long
       hInstance As Long
       rgbResult As Long
       lpCustColors As String
       flags As Long
       lCustData As Long
       lpfnHook As Long
       lpTemplateName As String
    End Type

    Private Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
    Private Sub Command1_Click()
        Dim cc As ChooseColor
        Dim ret as long

        cc.lStructSize = Len(cc)
        'При указании хендела доступ к форме временно блокируется, до закрытия вызванного диалога(выбор цвета).
        cc.hwndOwner = Form1.hWnd 'Хендел вызывающей формы.
        cc.hInstance = App.hInstance
        cc.flags = 0 'Состояния вызываемого окна. 0-default state. (0-14) шагом = 2
        cc.lpCustColors = String$(16 * 4, 0)
        
        ret = ChooseColor(cc) 'Вызываем диалог

        If (ret) Then 'Если была нажата кнопка ОК
           BackColor = cc.rgbResult 'Меняем цвет фона формы на выбранный нами цвет
        Else
           MsgBox "Действие отменено"
        End If
    End Sub

    SC

    наверх


    Как на VB установить шрифты в систему?

    Вопрос:

    Как на VB установить шрифты в систему? Пробовал использовать API функцию AddFontResource. Она устанавливает выбранный шрифт в систему, только после перезагрузки шрифт удаляется из системы.

    Ответ:

    Бывает необходимо добавить в систему шрифт. Для его использования не достаточно просто скопировать файл шрифта в C:\WINDOWS\Fonts.

    Необходимо инсталлировать, это выполняет функция API AddFontResource, которая объявляется так:

    Declare Function AddFontResource& Lib "gdi32" Alias "AddFontResourceA" (ByVal lpFileName As String)

    Использование:

    1.Можно файлы шрифтов включить в дистрибутив с помощью встроенных возможностей Package & Deployment Wizard .
    В форме:
    2.Потом с, помощью MyFile = Dir("C:\WINDOWS\Fonts\Helvenlt.ttf"), проверяем из своей программы, наличие файла в системе:

    If MyFile = "Helvenlt.ttf" Then
    Exit Sub
    Else 'если его нет, то копируем и устанавливаем шрифт.
    'Копируем шрифт в систему
    FileCopy App.Path & "\Helveblt.TTF", "C:\WINDOWS\Fonts\Helvenlt.ttf" 'Необходимо скопировать шрифт в систему
    'Устанавливаем шрифт
    Call AddFontResource("Helvenlt.ttf") 'Команда устанавливает шрифты в систему
    End If
    Текст1.FontName = "HelveticaLT" 'Используем шрифт

    slavik

    наверх


    Как получить адрес папки для временных файлов в W2k Server?

    Вопрос:

    Есть переменная WindowsDirectory и я всегда ее использовал для временных файлов, так стабильнее чем Temp но вдруг мне пришло письмо что моя программа не работет в W2k Server так как он не распознает эту переменную и пишет файл куда хочет, а когда его нужно прочитать то читает тоже откуда хочет и эти папки не сходятся. Отсюда информация не теряется, а просто пишется в одно месте, а читается из другого места - т.е. файла нулевого!
    Стандартные переменные $System_Root$ VB не понимает!

    P.S. В W2K Proffesional все работает!

    Ответ:

    Попробуй воспользоваться API функцией GetTempPath.

    Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

    Помести куда нужно:

    Dim szTempPath As String * 100
    GetTempPath 100, szTempPath

    Всё. Теперь переменная будет содержать путь Темп директории 8)

    SC

    наверх


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

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

    Вопросы:


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

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

       Не сталкивался ли кто-то с OpenOffic-ом.
    В чем проблема: программа осуществляет экспорт в документ .doc, как это реализовать в среде VB6 но организуя экспорт через OpenOffice?


    Автор вопроса: Соколов Алексей

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

       Как запустить макрос Excel из программы на VB?


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

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

       Как в VB отсортировать массив чисел?


    Автор вопроса: Борис

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

       Как средствами VB зарегистрировать в Windows библиотеку DLL и проверить, что она зарегистрирована?


    Автор вопроса: Andy Ferolli

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

       Для программирования баз данных Майкрософт предлагает вб-программистам такие гриды как:

    MSFlexGrid
    MSHFlexGrid
    Grid
      
    К сожалению ни один из них (по многим причинам) меня не устраивает (они мне кажутся какими-то не представительными).
    Я видел много баз данных, где используются очень симпатичные, с невероятными возможностями, гриды.
    Будьте добры, подскажите, где можно скачать или приобрести, например, такой грид как в программе Телефонный справочник (Semantica)?


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

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

       В подпрограмме есть N-подпрограмм (для GOSUB). Каким образом можно сделать непосредственный переход на адрес подпрограммы или её имя без использования условий типа Case или IF?
    В Ассемблере это переход типа Call eBx.
    Смысл: надо обрабатывать сразу, без перебора типа сравнения из N-признаков. Дабы избежать затрат времени...


    Автор вопроса: Мартынова Н. В.

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

       Как сделать, чтобы TextBox добавлялся в форму автоматически, если, например, нажать ins?


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

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

       Прошу прошения, если вопросы покажутся банальными. Просто я только начинаю изучать VB.
    Как сделать так, чтобы объекты Сombo в которых отображаются, шрифт и размер шрифта работали так же как и в Worde. Т.Е. если ставлю курсор на любое место в тексте, а в объектах Combo должно отражаться использованный шрифт и размер шрифта.


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

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

       Основная форма моей программы должна находится у правого края экрана, в таймере я пишу:

    Me.Left = Screen.Width - Me.Width.

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


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

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

       Пишу курсовую работу по "Базам данных" нужны справки, коды. Если у кого есть готовые коды по созданию базы данных для библиотеки, вышлите, очень прошу.


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

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

       Как с помощью мыши выделить прямоугольный и круглый участок на PictureBox (на подобие Paint)?


    Автор вопроса: Ефремов СЮ

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

       Имеется ряд компьютеров в локальной сети. На одном из них находится некая программа. Каким образом можно с этого компа запустить эту прогу на любом компе в сети?




    Ответы:


    Вопрос:

       Срочно нужен ответ на вопрос:
    Существует запись объявленная в модуле как глобальная:

    private type aaa
         dim j() as string
    end type
    Public v as aaa

    Нужно в какой то момент ее выгрузить из памяти, как это сделать.
    Хотя бы как выгрузить массив например в той же записи:

    v.j()

    неиспользуя redim v.j(0) ?

    Ответ:

    Автор ответа: C...R...a...S...H

    private type aaa
          j() as string
    end type
    Public v as aaa
    Public XXX as aaa 'если ааа-private ххх-пустой
      
    v=xxx


    Вопрос:

       Как сделать, чтобы датчик случайных чисел выдавал целые числа в заданных интевалах (например, от 1 до 30)?

    Ответ:

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

    rnd() * 30 - выдаст числа от 0 до 30
    rnd() * 29 +1 - выдаст числа от 1 до 30
      
    т.е. rnd() возвращает дробные числа от 0 до 1
    При умножении результата на какое-либо число - получим результат от 0 до этого числа ( т.к. 0*X=0, а 1*X = X)
      
    Добавление к результату числа "сдвигает" диапазон получаемых чисел на величину этого числа...


    Вопрос:

       Как правильнои передать фокус от одной форме к другой?
    Имеются 2 формы.
    Сначала с формы1 вызывается модальная форма2.

       Private Sub Command1_Click(Index As Integer)' код в форме1
       Select Case Index
       Case 0
         Form1.Visible = False
         Form2.SetFocus ' вызов формы 2
       End Select

    После выполнения необходимых процедур форма2
    закрывается командой "unload form2" и при попытке
    передать фокус обратно форме1 происходит ошибка
    выполнения.

    Private Sub Form_Unload(Cancel As Integer) ' код в форме2
      Form1.Visible = False
      Unload Form2
      Set Form2 = Nothing
      Form1.Visible = True
      Form1.SetFocus


    Т.е. команда form1.setfocus выполняется,
    осуществляется переход (как видно при пошаговом выполнении)
    обратно в форму1 на строку "Form2.SetFocus" с которой ранее
    вызывалась форма2 и при этом происходит ошибка (№364).
    Ошибка происходит потому что форма форма2 уже закрыта, но как
    предотвратить это не могу понять. Ведь команда "Form2.SetFocus"
    уже отработала и переход должен был произойти на следующую за ней
    строку.

    Пожалуста подскажите в чем ошибка или дайте ссылку на пример кода.

    Ответ:

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

    Чего ж тебе Form2 такого плохого сделала, что ты ее в ее собственном обработчике выгрузки так пинаешь? :)

    Это работает:
    'Первая форма
    Private Sub Command1_Click()
         Form1.Hide
         Load Form2
         Form2.Show
    End Sub

    'Вторая форма
    Private Sub Form_Unload(Cancel As Integer)
       Form1.Show
    End Sub



    Ответ:

    Автор ответа: Александр

    > Private Sub Form_Unload(Cancel As Integer) ' код в форме2
    > Form1.Visible = False
    > Unload Form2
    ' можно сказать, что имеет место рекурсия (т.е. ситуация "у попа была
    собака..."), что плохо сказывается на "самочуствии", например, стэка и
    пресекается самим VB.

    > Set Form2 = Nothing
    ' здесь это уже "удар оп почкам"

    Вот как раз для таких ситуаций оч-ч-ень полезно введение в форму события "Event".
    Т.е. структура примерно такая ("главная" - Form1, которая время от времени вынуждена вызывать Form2):


    Event MyEventTralialia [(argumentlist)]) - где-то вначале Form1
    процедуры прочие, где где-то есть вызов Form2:
    Form2.Show
    ......
    Sub Form1_MyEventTralialia [argumentlist] - продолжение обработки после
    завершения отработки в Form2!
         ' Здесь типа
         Unload Form2 (или Form2.Visible=False)
         'всё-что-угодно
    .....
    процедуры прочие



    Private WithEvents mForm1 As Form1 - где-то вначале Form2
    процедуры прочие
    .....
      Sub Form_activate
          Set mForm1 = Form1 ' подключаемся к обработчику события в Form1!
      Sub Form_deactivate
          Set mForm1 = Nothing ' отключаемся от обработчика события в Form1
    ....
    процедуры прочие
    Где-то в них есть такое:
         'Генерировать вызов:
          RaiseEvent MyEventTralialia [(argumentlist)]) ' вот здесь вызывается
    Form1 ("продолжение")

    P.S. можно разобраться, если посмотреть MSDN, например, поискать "Event Statement Example" или "Declaring and Raising Events" и т.п.


    Вопрос:

       Как в VB6 вывести на принтер (сразу, а не через какой-нибудь редактор) информацию из DataGrid так, чтобы соблюдался формат полей грида, т.е. если формат данных "Currency", то поле выравнивалось по правому краю?

    Ответ:

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

    Советую использовать DataReport c DataEnvinonment'ом.


    Вопрос:

       Есть форма на ней TextBox и Кнопка. В TextBox вводим число, например, "1.3", как сделать, чтоб при нажатии на кнопку "1.3" изменился на
      "1,3" и внеся в TextBox?

    Ответ:

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

    Private Sub Command1_Click()
       Text1.Text=Replace(Text1.Text,".",",")
    End Sub

       В результате действия функции Replace возвращается исходная строка с замененным строковым фрагментом.



    Ответ:

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

    dim l as integer
    Do
         l=instr(Text,".")
         if l>0 then
             mid$(Text,l,1)=","
         end if
    loop until l<>0



    Ответ:

    Автор ответа: Александр Юрьевич

    Используй функцию Replace:

       Text1.Text = Replace(Text1.Text, ".", ",")



    Ответ:

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

    Private Sub Command1_Click()
       Dim I%, sf$, ss$
       I = InStr(1, Text1.Text, ".")
       sf = Left(Text1.Text, I - 1)
       ss = Mid(Text1.Text, I + 1, Len(Text1.Text) - I)
       Text1.Text = sf & "," & ss
    End Sub



    Ответ:

    Автор ответа: Годяев Сергей

    Private Sub Command1_Click()

    For i = 1 To Len(Me.Text1)
    If Mid$(Me.Text1, i, 1) = "." Then Me.Text1 = Mid$(Me.Text1, 1, i - 1) + "," + Mid$(Me.Text1, i + 1, Len(Me.Text1))
    Next i

    End Sub


    Вопрос:

       Я написал незамысловатую программу на VB .Net (у меня стоит VS .Net 2003) мне надо, что бы она работала под любой Windows. Как это сделать?

    Ответ:

    Автор ответа: Александр Юрьевич

    Для работы приложения нужен .NET Framework 1.1 (дистрибутив около 24 Mb). Устанавливаешь на нужную ОС .NET Framework (кроме Windows 95, который официально уже не поддерживается) и дело в шляпе :)



    Ответ:

    Автор ответа: Артем Кривокрисенко

    Самую малость - наличие на машине .NET Framework 1.1 (22 мб).


    Вопрос:

       Есть кнопка в форме. Как сделать чтобы кнопка нажималась при нажатии клавиши на клаве?

    Ответ:

    Автор ответа: Александр Юрьевич

    Если кнопка в находится фокусе, то надо обрабатывать событие KeyPress, где пишешь:

         ...
         Command1.Value = True
         ...

       Тоже самое надо написать в обработчике KeyPress других элементов, в случае, если кнопка не в фокусе.



    Ответ:

    Автор ответа: Годяев Сергей

    В свойствах формы: KeyPreview = True.

    Private Sub Form_KeyPress(KeyAscii As Integer)

    Command1_Click

    End Sub


    Вопрос:

       Как в VB 6.0 делается 3D-графика?

    Ответ:

    Автор ответа: Александр Юрьевич

    В VB 6 реализовать работу с 3D-графикой можно используя DirectX (Direct3D) Для этого к проекту надо подключить библиотеку dx7vb.dll (для 7 версии DirectX) или dx8vb.dll (для 8 версии). Подробности работы с Direct3D смотри в MSDN.



    Ответ:

    Автор ответа: Артем Кривокрисенко

    Через Direct3D можно, но по личному опыту скажу - это просто отстой. Даже самая простая фигура (цилиндр) с текстурой уже заметно тормозит.

    Подробнее читай в DirectX SDK.


    Вопрос:

       Как сделать так, чтобы при нажатии на кнопку программа копировала сама себя в другую директорию? И из новой директории яапускала себя.

    Ответ:

    Автор ответа: Александр Юрьевич

    Например так:

       Private Sub Command1_Click()
          Dim sPath As String
          sPath = App.Path & "\" & App.EXEName
          FileCopy sPath, "C:\NewPath\" & App.EXEName
          Call Shell("C:\NewPath\" & App.Path)
       End Sub



    Ответ:

    Автор ответа: Годяев Сергей

    Private Declare Function GetDesktopWindow Lib "user32" () As Long
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

    Function StartDoc(DocName As String) As Long

    Dim Scr_hDC As Long
    Scr_hDC = GetDesktopWindow()
    StartDoc = ShellExecute(Scr_hDC, "Open", DocName, "", "C:\", 1)

    End Function

    Private Sub Command1_Click()

    Dim CurPath, NewPath, a, b
    CurPath = App.Path + "\" + App.EXEName
    NewPath = "c:\my folder\" + App.EXEName

    a = CopyFile(CurPath, NewPath, False)
    'False - заменить, если файл существует. True - отмена копирования.
                 
    If a = 1 Then
         b = StartDoc(NewPath)
    Else
         'Ошибка копирования
    End If


    End Sub


    Вопрос:

       В программе EXCEL есть такая функция "КОНМЕСЯЦА(дата)", которая выдает последний день месяца указанной даты т.е. КОНМЕСЯЦА(12.02.2004) возвращает 29.02.2004.
    Хотелось бы знать, есть такая функция под VB?

    Ответ:

    Автор ответа: Edvard Mokin

    Просто вариант DateSerial(2004,03,0)



    Ответ:

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

    Стандартной функции в VB нет. Но ты можешь создать свою. Вот пример:

    Function dhFirstDayInMonth(Optional dtmDate As Date = 0) As Date
         If dtmDate = 0 Then dtmDate = Date
         dhFirstDayInMonth = DateSerial(Year(dtmDate), Month(dtmDate), 1)
    End Function

    Function dhLastDayInMonth(Optional dtmDate As Date = 0) As Date
         If dtmDate = 0 Then dtmDate = Date
         dhLastDayInMonth = DateSerial(Year(dtmDate), Month(dtmDate) + 1, 0)
    End Function



    Ответ:

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

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

    Public Function DaysOfMonth(month As Integer, Year As Integer) As Integer
      Dim Temp As Date

         Temp = CDate("01 " & CStr(month) & " " & CStr(Year))
         Temp = DateAdd("m", 1, Temp)
         Temp = DateAdd("d", -1, Temp)
         DaysOfMonth = Day(Temp)

    End Function




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

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

    наверх


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

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