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


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



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

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • VB по русски
  • MDesign
  • IgorykSoft
  • DanSoft
  • Господа!!! читайте 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 можно найти
    здесь.

    наверх


    Citycat by Email

       Программа Citycat by Email позволяет работать с сервером Subscribe.ru с помощью электронной почты. Теперь Вам не нужно тратить деньги на работу в online и просматривать мегабайты рекламы для того, чтобы подписаться на нужную рассылку! Вам просто необходимо скачать небольшую базу данных по всем рассылкам каталога с нашего сайта, после чего Вы сможете подписываться и отписываться от рассылок, заказывать архивы прошлых выпусков, выполнять поиск по каталогу рассылок и многое другое.
       Программу Citycat by Email можно бесплатно загрузить с сайта http://sapisoft.h1.ru.

    наверх


    Новости сайта VBNet

    Дата: 17.06.2003 14:27 | Раздел: Примеры кода | Автор: MUXzzzz

    MWS - MiniWebServer - HTTP сервер на ВБ! пример показывает как можно организовать у себя на компе хостинг для сайта, тобишь HTTP сервер. Пример может одновремменно держать до 65535 соеденений!, а такое количество одновременных скачек ОЧЕНЬ маловероятно, если только ваш сайт не Яндекс или подобное, есть настройки страниц, который сервер подсовывает при различных событиях(например если страница не найдена).

    Дата: 16.06.2003 14:27 | Раздел: ActiveX контролы | Автор: Кузнецов А. В.

    ExtraTextBox - TextBox с расширенными возможностями.

    Дата: 15.06.2003 10:43 | Раздел: Примеры кода | Автор: Юмашин Алексей

    SHBrowseForFolder - Пример работы с API-функцией SHBrowseForFolder. Добавлены 2 полезные вещи:
    1). Возможность задавать стартовую папку обзора (перевёл с Дельфи)
    2). Возможность контролировать, что пользователь выберет только папку, отвечающую заданным требованиям, - а именно, содержащую заданные типы файлов (написал сам).

    Дата: 14.06.2003 14:27 | Раздел: Примеры кода | Автор: Лисин Денис Викторович

    Resources - Пример работы с файлом ресурсов на Visual Basic .NET.

    Дата: 13.06.2003 12:53 | Раздел: Примеры кода | Автор: Турков Максим

    Read and Write - Чтение и запись текстовых файлов в .NET с помощью классов из пространства имён System.IO.



    Последние 20 тем форума на VBNet.Ru:

    13:57 / 17 июн.  Как из VB достать дату из BIOS??? | Хитов: 0 |  Ответов: 0
    13:55 / 17 июн.  Новое сообщение без темы | Хитов: 2 |  Ответов: 0
    13:55 / 17 июн.  Новое сообщение без темы | Хитов: 1 |  Ответов: 0
    11:48 / 17 июн.  MSHFlexGrid - как по ячейкам удобней бегать? | Хитов: 4 |  Ответов: 1
    11:47 / 17 июн.  Access report update | Хитов: 4 |  Ответов: 0
    10:11 / 17 июн.  как нестандартные формы в vb.net | Хитов: 6 |  Ответов: 1
    07:09 / 17 июн.  Этим летом Граждане Форумяне возвращаются :-))) | Хитов: 31 |  Ответов: 3
    06:21 / 17 июн.  VB: подсчет выделенных в ListView | Хитов: 29 |  Ответов: 7
    22:48 / 16 июн.  Подскажите что делать!? | Хитов: 34 |  Ответов: 6
    22:31 / 16 июн.  VB+MS_EQUATION | Хитов: 11 |  Ответов: 0
    19:48 / 16 июн.  VB и HTML-формы | Хитов: 19 |  Ответов: 0
    18:23 / 16 июн.  БД | Хитов: 23 |  Ответов: 2
    15:30 / 16 июн.  .NET - считывание из *.txt | Хитов: 17 |  Ответов: 1
    15:15 / 16 июн.  ASCII в .NET | Хитов: 7 |  Ответов: 0
    14:57 / 16 июн.  Cоздать папку в активном окне Windows | Хитов: 17 |  Ответов: 0
    13:48 / 16 июн.  Размеры формы | Хитов: 40 |  Ответов: 5
    13:42 / 16 июн.  ASP _ UNICOD | Хитов: 14 |  Ответов: 0
    12:21 / 16 июн.  Сравнение цветов по RGB характеристикам | Хитов: 31 |  Ответов: 4
    11:59 / 16 июн.  MAPI. Как расширить действие компонентов. | Хитов: 25 |  Ответов: 2
    10:55 / 16 июн.  Файло через интернет | Хитов: 34 |  Ответов: 5


    Последние поступления в Библиотеку кодов:

    Отправка письма средствами TheBat! (50)
    Получение объекта Graphics для PictureBox (35)
    Получение текущей строки DataGrid (46)
    Очистка всех листбоксов на форме (23)
    Шифрование по алгоритму RC4. (72)


    Новости от VBNet-чиков!:



    наверх


    Новости сайта VBMania



    наверх


    Новости сайта Азбука VB



    наверх


    Новости сайта MSDN



    наверх


    Новости сайта GotdotNet



    Новые статьи:



    наверх


    Новости сайта dotSite

    Новые статьи:

    • InfoPath 2003. Новый продукт в семействе Microsoft Office System.
      Мне в руки попалась вторая бета InfoPath 2003 - нового приложения от компании Microsoft. Свои заметки о ней я и решил изложить в небольшой публикации, ориентированной прежде всего на разработчиков и сотрудников IT отделов.
    • Понимание SOAP
      Цикл переводов посвященных технологии WebService
    • Создание приложения для карманных компьтеров с использованием БД.
      Compact Framework and ADO.NET


    Новые примеры:



    наверх


    Один момент из жизни форума: Как в программе сохранить настройки?

    Вопрос:
    Автор вопроса: Jen

       Есть программа, которая сохраняет свой настройки в самой же себе. Можно ли такое сделать на Basic?


    Ответы:

    Атор: JEDI
       Открываешь Для считки свой ехе и дописываешь в конец то что надо, а потом читешь!

    Автор: E-Man
       'ЗАПИХАТЬ:

    open app.path & "\" & app.exename for binary as #1
    a=vbcrlf & "###"
    put #1,lof(1)+1,a
    a= "12345"
    close 1

    'ВЫТАЩИТЬ:

    open app.path & "\" & app.exename for binary as #1
    do
    line input #1, a
    loop until a="###"
    line input #1,a
    msgbox a
    'вылезет окно 12345
    close 1
       Код писал не в IDE - если че подправь...



    наверх


    Доска объявлений

       Ищу телеработу.

    • Переводы: английский, украинский, русский.
    • Cipper программист.
    • Assembler программист.
    • PIC разработчик
    • композитор
    • Прогрессивные стили
    • 3D анимация
    • GIF анимация
    Антон Лозовский.

    наверх


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

    BalloonMessage for MS Agent

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

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

    наверх

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

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

    Вопросы:


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

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

       Как сделать, чтобы скрытые папки отображались в DirListBox’e?


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

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

       Как в реестре (в любое его место) записать, прочитать, удалить ключи и значения?


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

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

       Как работая напрямую с объектами ADODB.Connection и ADODB.Recordset выполнить асинхронный запрос к БД?


    Автор вопроса: Вячеслав Л.

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

       Как для элемента DataGrid програмно задать формат столбца?


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

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

       Помогите написать код программы который при наведении курсора на папку в Explorer показывал бы ее размер на Form. Или хотя бы ссылку на инфу или исходники или API функции которыми можно воспользоваться.




    Ответы:


    Вопрос:

       У немя возник тут такой вопрос
    Как сделать так что-бы можно было обводить несколько контролов во время работы программы (типа как в VB во время разработки)

    Ответ:

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

    load command(command1.count)
    with command1(command1.count - 1)
    .visible = true
    .move rnd * 500,rnd * 500
    .caption = command1.count - 1
    end with


    Вопрос:

       Подскажите пожалуйста или пришлите кусочек исходника как считать данные из памяти или записать при помощи VB

    Ответ:

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

    Что конкретно необходимо записать в память и куда?
    Можешь использовать функцию CopyMemory, описание в МСДН.

    Вот пример программки, читающей весь файл и отображающей её на некоторую область памяти т.н. filemapping. А затем программа работает с выделенной областью памяти.

    Тело модуля:
    Option Explicit
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

    Public Declare Function FlushFileBuffers Lib "kernel32" (ByVal hFile As Long) As Long

    Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
    Public Const GENERIC_READ = &H80000000
    Public Const GENERIC_WRITE = &H40000000
    Public Const FILE_SHARE_READ = &H1
    Public Const FILE_SHARE_WRITE = &H2
    Public Const OPEN_EXISTING = 3

    Public Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, ByVal lpSecurityAttributes As Long, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
    Public Const PAGE_NOACCESS = &H1
    Public Const PAGE_READONLY = &H2
    Public Const PAGE_READWRITE = &H4
    Public Const PAGE_WRITECOPY = &H8
    Public Const PAGE_EXECUTE = &H10
    Public Const PAGE_EXECUTE_READ = &H20
    Public Const PAGE_EXECUTE_READWRITE = &H40
    Public Const PAGE_EXECUTE_WRITECOPY = &H80
    Public Const PAGE_GUARD = &H100
    Public Const PAGE_NOCACHE = &H200

    Public Declare Function MapViewOfFile Lib "kernel32" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
    Public Const SECTION_EXTEND_SIZE = &H10
    Public Const SECTION_MAP_EXECUTE = &H8
    Public Const SECTION_MAP_READ = &H4
    Public Const SECTION_MAP_WRITE = &H2
    Public Const SECTION_QUERY = &H1
    Public Const FILE_MAP_COPY = SECTION_QUERY
    Public Const FILE_MAP_READ = SECTION_MAP_READ
    Public Const FILE_MAP_WRITE = SECTION_MAP_WRITE

    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Function UnMapViewOfFile Lib "kernel32" Alias "UnmapViewOfFile" (ByVal lpBaseAddress As Long) As Long

    'получает параметром путь к файлу(любому)
    Sub FileRead(sFileName As String)
    Dim iFileSize As Long
    Dim iFileHandle As Long
    Dim iFileMappingHandle As Long
    Dim iFileBaseAddress As Long
    Dim iFileEndAddress As Long
    Dim bFile() As Byte
    Dim bChar As Byte
    Dim i As Long
    Dim sString As String
    Dim iReturnValue As Long

    'это размер файла
    iFileSize = FileLen(sFileName)

    ' открывает существующий файл
    iFileHandle = CreateFile(sFileName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)
    ' создает объект маппинга
    iFileMappingHandle = CreateFileMapping(iFileHandle, 0&, PAGE_READWRITE, 0&, iFileSize, 0&)
    'получает базовый адрес памяти
    iFileBaseAddress = MapViewOfFile(iFileMappingHandle, FILE_MAP_WRITE, 0&, 0&, 0&)
    'получает общий размер выделенной памяти
    iFileEndAddress = iFileBaseAddress + iFileSize
    ' в цикле ксорит весь файлик по 7 и соответственно записфывает обратно
    For i = iFileBaseAddress To iFileEndAddress
    'скопировать в переменную байт
         Call CopyMemory(bChar, ByVal i, 1)
    'отксорить его по 7
         bChar = bChar Xor 7
    ' записать обратно в файл
         Call CopyMemory(ByVal i, bChar, 1)
    Next i

    'закрыть все дескрипторы
    iReturnValue = UnMapViewOfFile(iFileBaseAddress)
    iReturnValue = CloseHandle(iFileMappingHandle)
    iReturnValue = CloseHandle(iFileHandle)
    End Sub



    Вопрос:

       Скажите, пожалуйста, как сделать контрол DirListBox в виде проводника?

    Ответ:

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

    Никак!!!
    DirListBox - это готовый контрол!
    Чтобы его исправить тебе нужен его исходник.
    Легче написать свой контрол, который будет представлять совокупность двух - TreeView и ListView.
    Синхронизируй их работу и дерзай!


    Вопрос:

       Как можно в проге сделать так, чтобы она была поверх всех окон (как у StatWin 5.5), и запретить или что-то в этом роде доступ к другим программам(меню и др.) кроме этой. И как скрыть её от Ctrl+Alt+Del?

    Если знаете, то киньте мне на мыло или опубликуйте здесь.

    Ответ:

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

    'Функция нерегистрации приложения
    Public Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessId As Long, ByVal dwType As Integer) As Long
    'вызов
    Call RegisterServiceProcess(0, 1)
    '*****************************************************************
    НО БУДЬ ОСТОРОЖЕН! В ВинНТ она не сработает, вызвав ошибку вызова
    несуществующей функции из кернел32. Поэтому советую проверить перед
    вызовом ОС.
    '*****************************************************************

    Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
    Public Type OSVERSIONINFO
             dwOSVersionInfoSize As Long
             dwMajorVersion As Long
             dwMinorVersion As Long
             dwBuildNumber As Long
             dwPlatformId As Long
             szCSDVersion As String * 128
    End Type
    Public Const VER_PLATFORM_WIN32_WINDOWS = 1

    'полный вызов с проверкой
    Dim udtOSVer As OSVERSIONINFO
    udtOSVer.dwOSVersionInfoSize = Len(udtOSVer)
    Call GetVersionEx(udtOSVer)

    If udtOSVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
         Call RegisterServiceProcess(0, 1)
    End If



    Ответ:

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

    Public Const HWND_TOPMOST = -1
    Public Const HWND_NOTOPMOST = -2
    Public Const SWP_NOACTIVATE = &H10
    Public Const SWP_SHOWWINDOW = &H40
    Public Const SWP_NOMOVE = &H2
    Public Const SWP_NOSIZE = &H1
    Declare Sub 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)
    'Поверх всех окон
    SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
    'Не поверх всех окон
    SetWindowPos Me.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE


    Вопрос:

       У меня пара вопросиков:

    1. Возможно ли сделать под VB форму нестандартной геометрии? К примеру, с отверстиями, скруглёнными краями и т.п. В Delphi такая фишка имеется. Если можно, примерчик пжалста...

    2. Как проверить, существует ли такая-то директория или файл в ней?

    Ответ:

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

    По твоему второму вопросу:

    Создай объект FileSystemObject.(Project->References->Microsoft Scripting RunTime), а дальше так:

    Dim fso As New FileSystemObject
    Dim bFolderExist As Boolean
    Dim bFileExist As Boolean

    bFolderExist = fso.FolderExists("c:\DISTR")
    bFileExist = fso.FileExists("c:\autoexec.bat")

    Иначе воспользуйся встроенной функцией ВБ - Dir. Возващает имя файла или пустую строку.



    Ответ:

    Автор ответа: Nechaev Sergey

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

    2. просто попытайся обратиться к этой директории и отлови ошибку Доступ закрыт или путь не существует (номер не помню, посмотри). Если ошибка произошла, значит директория не создана, если обращение прошло нормально, значит папка есть.



    Ответ:

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

    На Vbnet.ru есть статья про окна нестандартной формы.
    А чтобы проверить, существует ли файл/папка используй Dir(PathToYourFile).
    Если возвращает пустую строку, значит файла нет.



    Ответ:

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

    1. Да можно
    Напривет элиптическую - при помощи CreateEllipticRgn и Set WindowRgn API-функций
      
    private sub form_load()
         dim region as long
         region=CreateEllipticRgn(0,0,200,100)
         Set WindowRgn hWnd,region, true
    end sub

    2. Открываешь файл и проверяешь, если ошибки нет (Err.Number=0) - файл существует.



    Ответ:

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

    Привет! Для начала ответ на второй вопрос:
    Используй функцию CurDir
    Пример:

    Const testBD = "tm1.tmb"
    Const rezBD = "tm2.tmb"
    Private Sub Form_Load()
    'при загрузке определяем текущий каталог и проверяем наличие в нем файлов БД
    If Len(Dir(CurDir & "\" & testBD)) > 0 And Len(Dir(CurDir & "\" & rezBD)) > 0 _
    Then
         Test_Connect_Path = "Provider=Microsoft.Jet.oledb.4.0; Data Source=" & CurDir & "\" & testBD
         Rez_Connect_Path = "Provider=Microsoft.Jet.oledb.4.0; Data Source=" & CurDir & "\" & rezBD
    Else
         WrongTimer.Enabled = True
    End If
    End Sub

    А теперь ответ на второй вопрос (эта инфа по поводу нестандартных форм заимствована из статьи Сергея Миллера.)

    ---Начало цитаты---

    "Создание нестандартных окон - это просто!
    В Visual Basic очень легко создавать простые виндосовские окна! Но ведь они такие прямоугольные серые и некрасивые... К сожалению в VB нет интегрированных методов решения этой проблемы и нам приходится прибегать к помощи API-функций. В этой статье я покажу почти все возможности использования регионов: регионы любой формы, регионы с загруглёнными углами и комбинирование регионов! Итак, начнём!
    Окна любых форм
    1.Конечно же нужно создать стандартный EXE-проект. Теперь создайте единственный на форме объект Image. Назовём его stern.
    2.Так, начнём с создания регионов любой формы. Мне кажется красивее будет если на форме будет рисунок, вокруг которого мы и "отрежем" лишнее. Поэтому запустим Paint, аттрибуты рисунка установим 249 по высоте и 313 по ширине. Теперь нарисуем самый угловатый рисунок - звёздочку (как у октябрят :)), примерно такую:
      
    Кто очень талантливый может посерёдке нарисовать вoждя мирового пролетариата - на регионы это никак не повлияет :)))!
    3.Сохраните рисунок. Теперь объекту image по имени stern присвоим этот рисунок.
    4.Присвоили? Теперь сдвиньте его подальше вниз за пределы формы, чтобы он не мешался, а размеры формы установите равными: Width = 4710, Height = 3780. В свойстве BorderStyle установите флажок 0-None. Свойство AutoRedraw установите равным True. Готово! Теперь приступим к созданию!
    5.Сделайте двойной клик по форме и впишите в раздел General Declarations:
    Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd _
    As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint _
    As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
    Private Type POINTAPI
         X As Long
         Y As Long
    End Type
    Dim P(10) As POINTAPI
    Теперь объясню зачем это. Первая API-функция SetWindowRgn так сказать накладывает созданный регион на окно. Те части которые остались за пределами региона исчезают. Знаете с чем это можно сравнить? Есть такие специальные жестянные формочки для выпечки печения. Они все в форме всяких цветков, звёздочек, колокольчиков и т.д. Так вот я видел пару раз как ими работают: лежит, например, на столе кусок теста и человек просто ложит эти острые формочки на него и выдавлевает формы этих самых цветков, звёздочек, колокольчиков!!! По такому же принципу и взамодействует окно с регионом. Наша же задача - это именно создание "формочки" для формы ;) Передаваемые значения это:
    hwnd - идентификатор окна, на котором нужно "выдавить" форму
    hRgn - "формочка" для окна
    bRedraw - перерисовывать ли окно после "выдавления"?
    Для того, чтобы создать регион-"формочку" нам нужна вторая вторая API-функция CreatePolygonRgn. Состоит регион из n-ого количества точек, которое Вы и должны задать! Т.е., например, что бы описать звезду, нам нужны все её точки, как внутрение, так и наружние. Как их всех найти мы рассмотрим позже, а сейчас посмотрим на параметры:
    lpPoint - первая точка региона.
    nCount - количество точек
    nPolyFillMode - описание метода заливки полигона
    Каждая точка на форме, как известно, имеет свои координаты - по иксу и по игреку. Поэтому каждая точка должна содержаться в переменной-ящичке POINTAPI. Всего точек у звезды десять (5 внутренних и пять наружних), но регион это замкнутая форма, поэтому какaя-то точка будет подсчитана дважды, как первая и как последняя. Итак нам нужны одиннадцать точек и каждая имеет свои координаты. Для этого-то мы и объявили массив P по типу POINTAPI. В скобках стоит десять, но, т.к. счёт идёт у Бэйсика с нуля, то и значений в нём одиннадцать.
    6.А теперь в событие Form_Load впишем:
    Picture = stern
    Строка выглядит немного странновато, да. Зато короче уже не придумаешь. Это значит:
    Me.Picture = stern.Picture
    Умный VB определил, что свойству формы Picture ничего не нужно, как такого же вида свойство. Это можно делать со строковыми свойствами:
    Label1 = "ABCVB"
    Но это не относится к теме.
    Теперь при загрузки формы на ней будет появляться звезда.
    7.А вот теперь нам надо найти все точки, вокруг которых будет описан регион. Снова кликаем на форме и в окне Code в раздел General Declarations временно объявляем переменную-счётчик m, которая будет подсчитывать и подставлять точки региона:
    Dim m As Integer
    Теперь выбираем событие Form_MouseDown и вписываем:
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    Debug.Print "P(" & m & ").X=" & X / Screen.TwipsPerPixelX _
    & ":" & "P(" & m & ").Y=" & Y / Screen.TwipsPerPixelY
    m = m + 1
    End Sub
    Что делает эта процедура? Нет, сначала объясню, что должны сделать Вы. Вам нужно запустить проект и клинуть на каждой из одиннадцати кнопок звёздочки, а процедура Mouse_Down будет в свою очередь генерировать код присвоения каждой точкe её координат в пикселах. Код потом можно будет прямо вставить в программу. Появляться будут строки примерно следующего содержания:
    P(0).X = 132: P(0).Y = 6
    P(1).X = 173: P(1).Y = 64
    P(2).X = 303: P(2).Y = 71
    P(3).X = 213: P(3).Y = 123
    P(4).X = 291: P(4).Y = 241
    P(5).X = 157: P(5).Y = 154
    P(6).X = 5: P(6).Y = 239
    P(7).X = 78: P(7).Y = 103
    P(8).X = 10: P(8).Y = 58
    P(9).X = 100: P(9).Y = 60
    Так было у меня. Теперь вырежте этот код в событие Form_Load и уже вручную допишите код первой-последней точки с координатами точно, как у первой точки:
    P(10).X = 132: P(10).Y = 6
    8.Теперь строку Dim m As Integer и событие Form_MouseDown удалите вообще - они нам больше не нужны - координаты точек у нас есть. Тепeрь осталось всего-то создать регион и выдавить его на форме! В событие Form_Load допишем под присвоением координaт точек:
    Dim Rgn As Long
    Эта переменная будет содержать регион.
    Теперь чуть ниже впишем строку создания региона:
    Rgn = CreatePolygonRgn(P(0), 10, 0)
    и ещё чуть ниже выдавливем форму:
    Call SetWindowRgn(hwnd, Rgn, True)
    Готово! Теперь просто запускаем. Любуемся! По этому ёе принципу можно создавать окна немысленных форм!!! Конечно, чем больше задано точек, тем красивее и точнее будет форма. Так же можно создавать точки во время передвижения мыши по форме. Точек будет конечно же много, но Вам ведь нужно просто их переставить в другое окно и всё! Сделать это надо так:
    В разделе General Declarations объявляем переменную
    Dim IfMove As Boolean
    Dim m As Integer
       
    Теперь вставьте три следующих события чуть ниже:
    Private Sub Form_MouseUp(Button As Integer, Shift As _
      Integer, X As Single, Y As Single)
          IfMove = False
    End Sub
    Private Sub Form_MouseDown(Button As Integer, Shift _
      As Integer, X As Single, Y As Single)
       IfMove = True
    End Sub
    Private Sub Form_MouseMove(Button As Integer, Shift As _
        Integer, X As Single, Y As Single)
       If IfMove Then
    Debug.Print "P(" & m & ").X=" & X / Screen.TwipsPerPixelX _
         & ":" & "P(" & m & ").Y=" & Y / Screen.TwipsPerPixelY
        m = m + 1
        End If
    End Sub
    А теперь последняя проблемка - передвижение формы по экрану!
    Объявим переменную, проверяющую двигается ли мышь и две переменные для значений положения мышки во время нажатия и добавим три процедуры:
    Dim IfMove As Boolean
    Dim X1 As Integer
    Dim Y1 As Integer
    Private Sub Form_MouseDown(Button As Integer, Shift _
      As Integer, X As Single, Y As Single)
       IfMove = True
       X1 = X
       Y1 = Y
      End Sub
    Private Sub Form_MouseUp(Button As Integer, Shift As _
      Integer, X As Single, Y As Single)
          IfMove = False
    End Sub
    Private Sub Form_MouseMove(Button As Integer, Shift As _
       Integer, X As Single, Y As Single)
       If IfMove Then
       Move Left + X - X1, Top + Y - Y1
       End If
    End Sub
    А вот второй способ осуществим при помощи API функции SendMessage. В раздел General Declarations допишем следующие API-функции:
    Private Declare Function SendMessage Lib "user32" Alias _
    "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long
    'эта функция "захватывает" мышку для выполняемого задания
    'зачем - не знаю сам! Неужели нельзя договориться? :-)))
    Private Declare Sub ReleaseCapture Lib "user32" ()
    Добавим процедуру передвижения иышки:
    Private Sub Form_MouseMove(Button As Integer, Shift As _
        Integer, X As Single, Y As Single)
    'если была нажата левая кнопка вызываем процедуры
       If Button = 1 Then
         Call ReleaseCapture
         Call SendMessage(hwnd, &HA1, 2, 0&)
        End If
    End Sub
    Окна c закругленными углами
    А вот это ещё проще! А всё-таки тоже необычно - часто Вы встречаете окна с закругленными углами???
    1.В раздел General Declarations допишем следующую API-функцию:
    Private Declare Function CreateRoundRectRgn Lib "gdi32" _
    (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
    ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
    Её параметры:
    X1,Y1 - координаты верхней левой точки прямоугольника, углы которого надо закруглить
    X2,Y2 - координаты нижней правой точки
    X3 - ширина овала, применяемого для закругления углов
    Y3 - его высота
    2.Теперь попробуем создать такой. В событии Form_Load закомментируйте строку Picture = stern, чтобы картинка больше не появлялась. А под строкой
    Dim Rgn As Long
    объявите ещё одну переменную для региона:
    Dim Rgn2 As Long
    Теперь создадим второй регион:
    Rgn2 = CreateRoundRectRgn(0, 0, Width / Screen.TwipsPerPixelX, _
    Height / Screen.TwipsPerPixelY, 50, 50)
    В качестве аргументов мы передаём координаты формы в пикселах а высоту и ширину овала задаём одинаковой, тем самым углы будут именно закруглены, а не "заовалены" :).
    Теперь чуть ниже вставьте эту строку, окраски формы в красный цвет:
    BackColor = QBColor(12)
    И строку
    Call SetWindowRgn(hwnd, Rgn, True)
    исправьте на
    Call SetWindowRgn(hwnd, Rgn2, True)
    Запускайте! Потрясающе, неправда ли !? Но вот если бы была ещё рамка, было бы просто неотразимо. Но ведь это тоже осуществимо! Правда совсем не такая, как у стандарного окна, но всё-таки!
    3.Для этого можно применить API-функцию FrameRgn. Итак, под все остальные API-функции допишем ещё одну:
    Private Declare Function FrameRgn Lib "gdi32" (ByVal hDC As Long, _
    ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, _
    ByVal nHeight As Long) As Long
    Передаваемые параметры:
    hDC - handle Device Context (я не понимаю что это, но что-то на подобии hWnd - может идентификатор какой?...)
    hRgn - регион, который надо "обрамить"
    hBrush - что это за "щётка" не понимаю тоже, но её надо прежде тоже создать (!) скорее всего это вид рисования рамки.
    nWidth, nHeight - толшина рамки по высоте и ширине
    И, как я уже сказал, нам нужна ещё одна API-функция для создания "щётки" (дописываем под первую):
    Private Declare Function CreateSolidBrush Lib "gdi32" _
    (ByVal crColor As Long) As Long
    Внимание! Для FrameRgn тоже нужен регион! Ведь рамку можно нарисовать и на квадратном окне и выглядеть она будет в зависимости от региона.
    Теперь в событие Form_Load перед строкой
    Call SetWindowRgn ...
    вставьте строку
    Call FrameRgn(hDC, Rgn, CreateSolidBrush(QBColor(0)), 3, 3)
    Запускайте!
    Комбинирование регионов
    А ещё регионы можно комбинировать! Нужно это правда не так часто но, когда вам нужна форма с одной стороны полукруглая, а с другой выперающие углы, штыри и т.д., то без комбинирования регионов Вам уже не обойтись! Прежде чем начать введите в Genral Declarations:
    Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn _
    As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal _
    nCombineMode As Long) As Long
    Параметры:
    hDestRgn - регион, которому возвращается полученный результат из двух регионов
    hSrcRgn1 - первый регион
    hSrcRgn2 - второй регион
    nCombineMode - методы комбинирования
       
    Сами методы (есть ещё несколько, но эти самые основные):
    'отображаются только те точки, которые принадлежат
    'одному И второму региону
    Const RGN_AND = 1
    'отображаются только те точки, которые принадлежат
    'к хотябы одному региону
    Const RGN_OR = 2
    'отображаются только те точки, которые принадлежат
    'ТОЛЬКО одному из двух регионов
    Const RGN_XOR = 3
    'отображается разница регионов, "остатки" одного от другого
    Const RGN_DIFF = 4
    Так, теперь можно было бы скомбинировать регионы и для эффективности они должны быть разные по размерам, т.к. звезда полностью умещается в форме с закругленными углами. Поэтому исправьте строку:
    Rgn2 = CreateRoundRectRgn(0, 0, Width / Screen.TwipsPerPixelX, _
    Height / Screen.TwipsPerPixelY, 50, 50)
    на
    Rgn2 = CreateRoundRectRgn(0, 0, (Width / Screen.TwipsPerPixelX) - 100, _
    (Height / Screen.TwipsPerPixelY) - 100, 50, 50)
    Т.е. регион был уменьшен на сто никселов.
    Всё, осталось теперь только поместить следующую строку в тоже событие Form_Load, но перед строкой Call SetWindowRgn...:
    Call CombineRgn(Rgn2, Rgn, Rgn2, RGN_OR)
    В этом случае регион, в который будет помещён результат мы взяли формы с круглыми углами и метод комбинирования выбрали RGN_OR, т.е. будут отображены все точки, которые принадлежат к хотябы одному из регионов. А создание круглых и овальных регионов я уже рассматривал в примере изменения контуров формы и это ещё проще. Теперь пробуйте, эксперементируйте наслаждайтессссь... :)
    Ну, - как говорил Алексей Булдаков в "Осебенностях национальной охоты", - всё, что знал, рассказал!"

    ---Конец цитаты---


    Вопрос:

       Как определить координаты курсора в TextBox или RichTextBox (т.е. номер текущей строки и номер текущего символа на этой строке) с последующей их передачей в StatusBar.
    Это нужно для контроля при вводе форматированных данных

    Ответ:

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

    Используй свойство SelStart в TextBox.
    'a = Text1.SelStart


    Вопрос:

       Некоторые программы, которые я создал,ну не как не хотят запускаться на "компе" моего друга. При запуске выдаётся ошибка о повреждённом файле динамической библиотеки. Кто знает, подскажите в чём дело?

    Ответ:

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

    На "компе" твоего друга нет библиотек и/или контролов, необходимых для работы твоих программ. Чтобы всё было, используй Package & Deployment Wizard из пакета Microsoft Visual Basic 6.0 Tools



    Ответ:

    Автор ответа: .::neo::.

    А ты попробуй на компе твоего друга зарегистрировать библиотеку regsvr32 MSVBVM32.DLL.



    Ответ:

    Автор ответа: Nechaev Sergey

    Раз выдается соответствующее сообщение, значит файл или вообще отсутствует, или имеет неверную версию либо поврежден. Принеси от себя рабочий файл и положи на место глючного.



    Ответ:

    Автор ответа: Vladimir [PRC]

    Скорее всего разные версии библиотек, просто скопируй DLL или OCX на которую ругается прога со своего компьютера на второй или создай дистрибутив приложения и установи прогу установщиком он сам установит все файлы.



    Ответ:

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

    Видимо у твоего друга никогда не стоял...VB. Поэтому на его компе нет нужных библиотек.
    Есть замечательная утилита VB Power Wrap, которая позволяет запаковать в EXEшник все необходимые dll-ы и ocx-ы . Если надо вышлю.




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

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

    наверх


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

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