vbrus.narod.ru

Последнее обновление: 26 июля 2007 г.

Интересуетесь современными IT-технологиями? Заходите на специализированный портал посвященный IT-технологиям: rtportal.ru

 

Чтиво - программирование на Visual Basic .net

    1. Работа со строками в Visual Basic .net

    2. Числа, даты и другие типы данных - Visual Basic .net

    3. Часто задаваемые вопросы и ответы на них - Visual Basic .net

    4. Как отправить файл в корзину? (!API!) в Visual Basic .net

    5. Работа с файлами в Visual Basic .net

    6. Работа с реестром в Visual Basic .net

    7. Обработка ошибок в Visual Basic .net

    8. Динамическое выполнение кода на VB.NET - Visual Basic .net

    9. Сеть - Visual Basic .net

    10. Графика - Visual Basic .net

 

1. Работа со строками

    1.01 Объединение строк - Visual Basic .net
    1.02 Получение части строки
    1.03 Создание строки, состоящей из повторяющегося символа - Visual Basic .net
    1.04 Изменение регистра всех букв строки - Visual Basic .net
    1.05 Сравнение строк без учета регистра букв - Visual Basic .net
    1.06 Разбиение строки на слова - Visual Basic .net
    1.07 Как перебрать все символы строки? - Visual Basic .net
    1.08 Как найти все подстроки в строке? - Visual Basic .net
    1.09 DataGridView: Как добавить новую строку? - Visual Basic .net


    1.01 Объединение строк
    =========================================================
    'Объеденять строки можно & или +:
    Dim FirstName As String = "Bill"
    Dim LastName As String = "Jones"
    Dim FullName As String

    FullName = FirstName & " " & LastName
    'Строка FullName теперь имеет значение "Bill Jones"

    'Строки также поддерживают метод Insert, позволяющий вставить строку в середину другой строки. В этот метод требуеться передать целочисленный параметр starIndex, указывающий место вставки строки:

    Dim FullName As String = "Bill Jones"
    Dim MiddleName As String = "Neuhaus"
    'Вставить строку MiddleName в строку FullName, начиная с индекса 5.
    FullName = FullName.Insert(5, MiddleName)
    'Строка FullName теперь имеет значние "Bill Jones"

    1.02 Получение части строки
    =========================================================
    'Для получения части строки используйте метод String.Substring
    Dim FullName As String = "Bill Jones"
    Dim FirstName As String
    'Получение подстроки з 4 символов, начинающейся с индекса 0
    FirstName = FullName.Substring(0, 4)
    'Строка FirstName теперь имеет значение "Bill"

    1.03 Создание строки, состоящей из повторяющегося символа
    =========================================================
    Dim Dashes As New String("-"c, 100)

    1.04 Изменение регистра всех букв строки
    =========================================================
    Dim MixedCase, UpperCase, LowerCase As String
    MixedCase = "hELLo"
    UpperCase = MixedCase.ToUpper()
    'строка UpperCase ткперь имеет значение "HELLO"

    LowerCase = MixedCase.ToLower()
    'Строка LowerCase теперь имеет значение "hello"

    1.05 Сравнение строк без учета регистра букв
    =========================================================
    If String.Compare(StringA, StringB, true) = 0 then
    ' строки равны без учета регистра букву
    End if

    'Кроме того вы можете просто сравнить строки, приведенные к канонической форме (прописной или строчной):

    If StringA, ToUper() = StringB.ToUper()then
    'строки равны без учета регистра букв
    End if

    1.06 Разбиение строки на слова
    =======================================================
    Dim Sentence As String = "Then quick brown fox jump over the lazy dong."
    Dim Separators() As Char = {" "c}
    Dim Words() As String

    'Разбиение предложения на слова.
    Words = Sentence.Split(Separators)
    'отображение отдельных слов.
    Dim Word As String
    For Each Word In Words
    Console.WriteLine("Word: " & Word)
    Next

    'Результат этого примера будет таким:
    ' Word: The
    ' Word: quick
    ' Word: brown
    ' Word: jump
    ' Word: over
    ' Word: The
    ' Word: lazy
    ' Word: dong.

    1.07 Как перебрать все символы строки?
    =======================================================
    Для доступа к отдельным символам строки можно воспользоваться коллекцией Chars класса String:

    Dim s As String = "qwert"
    Dim i As Integer = 0
    For i = 0 To s.Length - 1
    MessageBox.Show(s.Chars(i))
    Next
    или же можно просто перебрать все значения через цикл For Each:

    Dim ch As Char
    Dim s As String = "qwert"
    ' Перебираем все символы.
    For Each ch In s
    MessageBox.Show(ch)
    Next

    1.08 Как найти все подстроки в строке?
    =======================================================
    Для нахождения всех определенных подстрок в некой строке надо вызвать в цикле метод IndexOf. Этот метод возвращает позицию первого вхождения указанной подстроки. Для нахождения дальнейших подстрок надо вызывать этот же метод, указав в нем, что поиск надо делать не с начала, а с найденной позиции.

    Вот пример:

    ' Строка, в которой ищем.</em>
    Dim s As String = "qqaa qqsss"
    ' Строка, которую ищем.
    Dim find As String = "qq"
    ' Номер позиции найденного элемента.
    Dim pos As Int32 = 0
    Do
    ' Получаем позицию очередного элемента.
    pos = s.IndexOf(find, pos)
    ' Если что-то найдено...
    If pos <> -1 Then
    ' то показываем позицию найденного элемента.
    MessageBox.Show("Подстрока найдена на " + pos.ToString() + _
    " позиции")
    ' Увеличиваем позицию поиска на длину строки для поиска.
    pos += find.Length
    End If
    Loop Until pos = -1
    Указанный фрагмент выведет 0 и 5 - именно на этих позициях находится подстрока "qq" в строке "qqaa qqsss".

    1.09 DataGridView: Как добавить новую строку?
    =======================================================
    Добавить новую строку в конец списка можно методом Add. Если требуется вставить строку в определенное место списка, то нужно использовать метод Insert.

    Синтаксис:

    DataGridView.Rows.Add(Значения_полей)
    DataGridView.Rows.Insert(Индекс_строки, Значение_полей)

    , где:
    Значения_полей – массив значения полей через запятую. Если у вас, например DataGridView имеет две колонки, то DataGridView.Rows.Add("Эти данные для первой колокни", "Эти данные для второй колонки") Индекс_строки – индекс строки, перед которой будет добавлена запись, начиная с нуля. Например, если у вас DataGridView содержит 10 строк, то для того, чтобы добавить данные перед первой строкой в качестве индекса нужно указать 0: DataGridView.Rows.Insert(0, "Это данные первой колонки", "Это данные для второй колонки", "Это данные для третей колонки" …)

    Создайте новое Windows-приложение. На форме разместите один элемент DataGridView и вставьте следующий код:

    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
    'добавляем 2 колонки
    DataGridView1.Columns.Add("Column1", "Колонка 1")
    DataGridView1.Columns.Add("Column2", "Колонка 2")
    'добавляем 10 строк
    For i As Integer = 0 To 9
    DataGridView1.Rows.Add("Строка " & (i + 1), "и это тоже, но в другой колонке")
    Next
    End Sub

    Наверх

 

2. Числа, даты и другие типы данных

    2.00 Типы данных - Visual Basic .net
    2.01 Математические и тригонометрические операции - Visual Basic .net
    2.02 Преобразование числа в отформатированную строку - Visual Basic .net
    2.03 Генерирование случайных чисел - Visual Basic .net
    2.04 Работа с недесятичными системами счисления - Visual Basic .net
    2.05 Работа с комплексными числами - Visual Basic .net
    2.06 Работа с векторами - Visual Basic .net
    2.07 Работа с матрицами - Visual Basic .net
    2.08 Получение системной даты и времени - Visual Basic .net
    2.09 Определение дня недели, високосного года и не только - Visual Basic .net
    2.10 Получение названий дней и месяцев на других языках - Visual Basic .net
    2.11 Проверка даты, введенной пользователем - Visual Basic .net

    2.00 Типы данных
    =========================================================
    Какими бы сложными объектами, массива или коллекциями мы не пользовались, следует помнить, что основой их являются единичные переменные.

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

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

    Visual Basic .Net все-таки обрел достаточно хорошую типизацию.

    Рассмотрим краткий перечень возможных типов переменных Visual Basic .Net

    Boolean – логический тип. Для хранения переменной отводятся 2 байта. Переменная может принимать только 2 значения True(Истина) и False(Ложь).

    Byte – числовой тип. Для хранения переменной отводиться 1 байт. Значения переменной может находиться в промежутке от 0 до 255. Знак не используется.

    Char – символьный тип. Для хранения переменной отводиться 2 байта. В качестве значения переменной обычно применяются символы, так как используются теперь 2 байта. Разработчики могут применять символы Unicode.

    Date – предназначен для хранения дат. Переменная занимает 8 байт. Возможные значения находятся в промежутке от 1 января 100 года нашей эры до 31 декабря 9999 года.

    Decimal – самый мощный числовой тип. Для хранения переменной подобного типа отводиться 16 байт. Отрицательная и положительная границы промежутка, в котором располагаются возможные значения этой переменной, одинаковы по модулю и равны +/- 79 228 162 514 264 337 593 543 950 335, если использовать целые числа. Если же необходимо хранить дробные величины, то границы возможных значений будут смещены на несколько порядков в зависимости от того, сколько знаков после запятой использует разработчик. Подобный тип может использоваться только для хранения десятичных дробей. Разработчик может использовать до 28 знаков после запятой.

    Double – это числовой тип. Применятся для хранения чисел в экспоненциальной форме. Для хранения переменной отводится 8 байт. Отрицательные значения находятся в промежутке от – 1,79769313486231E+308 до -4,94065645841247E-324. Положительные значения входят в промежуток от 4,94065645841247E-324 до 1,79769313486231E+308.

    Integer – предназначен для обработки целочисленных значений. Переменная подобного типа занимает 4 байта. Возможные значения находятся в промежутке от – 2 147 483 648 до 2 147 483 647.

    Long – предназначен для целочисленных значений. Для хранения переменной отводится байт. Возможные значения переменной подобного типа находятся в промежутке от – 9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.

    Object – по сути, переменная подобного типа является всего лишь ссылкой на некий конкретный экземпляр какого либо объекта. Для хранения переменной отводятся 4 байта.

    Short – облегченный целочисленный тип. Для хранения переменной отводятся 2 байта. Возможные значения переменной данного типа находятся в промежутке от – 32 768 до 32 767.

    Single – предназначен для хранения чисел в экспоненциальной форме. Для хранения переменной отводятся 4 байта. Отрицательные возможные значения переменной такого типа расположены в промежутке от – 3,402823E+38 до -1,401298E-45. Положительные значения укладываются в промежуток от 1,401298E-45 до 3,402823E+38.

    String – строковый тип. Предназначен для хранения строк различной длинны. Возможная длинна строки, может, доходит до 2-х миллионов символов кодировки Unicode. Объем памяти для хранения переменной выделяется в зависимости от длинны строки.

    Мы рассмотрели все предустановленные типы Visual Basic .Net. На самом деле, разработчик может создавать собственные типы, но в работе с ASP.Net эта возможность, скорее всего, не потребуется. В крайнем случае, можно обойтись объектами. Сейчас уже нет смысла создавать собственный тип переменных просто для экономии оперативной памяти. Учитываю ее типичные объемы на машинах, предназначенных для работы www-серверов и возможности автоматического сборщика мусора, действующего в среде Microsoft .Net Framework, можно пользоваться оперативной памятью без оглядки на ее объем. И уж точно не стоит экономить на нескольких байтах, ухудшая тем самым читабельность и стройность кода.

    Если есть типы данных, то существуют и переменные. А если мы используем переменные в своих приложениях, следует уметь их объявлять. Объявление переменных производиться при помощи комбинации ключевых слов Dim и As. Типичный пример объявления целочисленных переменных выглядит следующим образом: Код:
    Dim intName As Integer


    При помощи ключевого слова Dim мы начинаем объявление переменных, за ним указываются наименования этих переменных, а после ключевого слова As записывается их тип. Программы на языке VB .Net имеют строковую структуру, т.е. в каждой строке кода может находиться только один оператор. Таким образом, разработчик избавлен от необходимости операторы друг от друга при помощи символов разделителей, таких, как символ точки с запятой. В нашем случае это означает, что мы должны использовать ключевое слово Dim перед каждой строкой объявления переменных, т.е. если необходимо объявить несколько целочисленных переменных и одну булеву, следует использовать следующий фрагмент кода:
    Код:
    Dim intName As Integer
    Dim r As Boolean


    На самом деле, объявление переменных ожжет и не таким простым. Мы можем создавать глобальные и защищенные переменные, дружественные, статические и частные. Но все эти дополнительные возможности необходимы лишь для работы с разветвленной объектной иерархией, которая явно не нужна в приложениях ASP.Net.

    Естественно, в языке Visual Basic .Net существует ряд функций, которые позволяют преобразовывать типы.

    CBool – возвращает булево значение. В качестве параметра функции может быть передано, какое либо условие или числовое значение.

    CByte – возвращает значении е типа Byte. В качестве параметра передается соответствующая строка или числовое значение.

    CChar – возвращает символ. В качестве параметра передается целое число, находящееся в промежутке от 0 до 65 535.

    CDate – возвращает значение типа Date. В качестве параметра можно использовать любое принятое в операционной системе обозначение даты.

    CDbl – преобразовывает значение параметра к типу Double.

    CDec – применяется для преобразования параметра к типу Decimal.

    CInt – преобразовывает значения параметра к целочисленному типу Integer. Если в качестве параметра передано дробное число, то дробная часть просто округляется.

    CLng – возвращает значение типа Long. Обработка параметра производиться по образцу функции CInt.

    CShort – преобразовывает переменную или значение к типу Short.

    CSng – применяется для преобразования параметра к типу Single.

    CStr – используется для преобразования данных в строковый тип String. Если в качестве параметра функции передается булево значение, то возвращается строка True или False. Если передаются данные типа Date, то функцией возвращается строка содержащая обозначение даты в принятом для системы формате. Любое числовое значение преобразовывается в символьное представление данного числа.

    2.01 Математические и тригонометрические операции
    =========================================================
    ' Вычисление синуса угла, указанного в радианах,
    х = Math.Sin(y)
    ' Округление числа до двух десятичных разрядов после точки,
    х = Math.Round(y, 2)
    ' Вычисление модуля числа,
    х = Math.Abs(y)

    2.02 Преобразование числа в отформатированную строку
    =========================================================
    Строки формата чисел бывают двух типов: стандартный и собственный. Стандартные строки формата используют заранее заданный формат, который соответствует текущим региональным стандартам, и определяются единственной буквой. При преобразовании числа в строку эта буква указывается вместе с числом, определяющим точность. Вот несколько часто встречающихся примеров:

    Dim Number As Decimal = 12345.6D
    ' "С" - спецификатор формата для символа валюты.
    Dim MoneyString As String = Number.ToString("С")
    ' Строка MoneyString теперь имеет значение "12,345.60"

    ' "Е" - спецификатор экспоненциального представления чисел.
    ' Здесь также указано, что число должно иметь 2 десятичных разряда.
    Dim ScientificString As String = Number.ToString("E2")
    ' Строка ScientificString теперь имеет значение "1.23Е+004"

    ' "N" - спецификатор обычного формата чисел.
    Dim NormalString As String = Number.ToString("N")
    ' Строка NormalString теперь имеет значение "12,345.60"

    2.03 Генерирование случайных чисел
    =========================================================
    Работать с классом Random просто: нужно создать его экземпляр и вызвать метод Next или метод NextDouble. Метод NextDouble возвращает число с плавающей точкой с двойной точностью в диапазоне от 0.0 (включая) до 1.0 (не включая). Метод Next генерирует целое число, попадающее в указанный вами диапазон:

    Dim RandomGenerator As New Random()

    ' Получение случайного дробного числа от 0.0 до 1.0.
    Dim RandomDouble As Double = RandomGenerator.NextDouble()

    ' Получение случайного целого числа от 1 до 6.
    Dim Randomlnt As Integer = RandomGenerator.Next(1, 7)

    ' Получение еще одного случайного целого числа от 1 до 6. Randomlnt s RandomGenerator.Next(1, 7)


    2.04 Работа с недесятичными системами счисления
    =========================================================
    Хотя Visual Basic .NET не позволяет работать напрямую с недесятичными числами, вы можете легко преобразовать десятичные числа в строковую форму с основанием 2 (двоичная система счисления), 8 (восьмеричная), 10 или 16 (шестнадцатеричная). Для этого'вызывается перегруженный метод Convert.ToString, принимающий два параметра: число в десятичной системе и основание системы счисления (оно должно быть равно 2, 8, 10 или 16), в которой будет представлено преобразованное число:

    Dim Number As Integer = 3023
    Console.WriteLine("Binary: " & Convert.ToString(Number, 2))
    Console.WriteLine("Octal: " & Convert.ToString(Number, 8))
    Console.WriteLine("Hexadecimal: " & Convert.ToString(Number, 16))

    В результате выполнения этого кода будет выведено:
    Binary: 101111001111
    Octal: 5717
    Hexadecimal: bcf

    Кроме того, можно использовать общие методы Convert.ToInt32, Convert.ToInt16
    и Convert.ToInt64 для преобразования недесятичного числа из строки в целочисленный тип:
    Dim Binary As String = "01"
    Dim Number As Integer = Convert.ToInt32(Binary, 2)
    ' Удвоение числа.
    Number *= 2
    ' Преобразование числа обратно в двоичную форму.
    Binary = Convert.ToString(Number, 2)
    ' Строка Binary теперь имеет значение 0".

    2.05 Работа с комплексными числами
    =========================================================
    .NET Framework не поддерживает операций с комплексными числами. Однако создать класс Комплексного числа легко. Этот класс включает методы Add, Subtract, Multiply и DivideBy и несколько вспомогательных функций, таких как GetModulus и GetConjugate (получить сопряженное число).

    Вот полный код класса ComplexNumber:

    Public Class ComplexNumber
    Implements ICloneable, IComparable

    ' Создание нового комплексного числа.
    Public Sub New(ByVal real As Double, ByVal imaginary As Double)
    Me.Real = real
    Me.Imaginary = imaginary
    End Sub

    ' Действительная и мнимая части комплексного числа.
    Public Real As Double
    Public Imaginary As Double

    ' Сложение комплексного числа с имеющимся комплексным числом.
    Public Function Add(ByVal ComplexNumber As ComplexNumber)
    As ComplexNumber
    Return New ComplexNumber(Me.Real + ComplexNumber.Real, _
    Me.Imaginary + ComplexNumber.Imaginary)
    End Function

    ' Сложение действительного числа с имеющимся комплексным числом.
    Public Function Add(ByVal real As Double) As ComplexNumber
    Return New ComplexNumber(Me.Real + real, Me.Imaginary)
    End Function

    ' Вычитание комплексного числа из имеющегося комплексного числа.
    Public Function Subtract(ByVal ComplexNumber As ComplexNumber) _,
    As.ComplexNumber
    Return New ComplexNumber(Me.Real - complexNumber.Real, _
    Me.Imaginary - complexNumber.imaginary)
    End Function


    ' Вычитание действительного числа из имеющегося комплексного.
    Public Function Subtract(ByVal real As Double) As ComplexNumber
    Return New ComplexNumber(Me.Real - real, Me.Imaginary)
    End Function

    ' Умножение комплексного числа на имеющееся комплексное число.
    Public Function Multiply(ByVal complexNumber As ComplexNumber) _
    As ComplexNumber
    Dim x, y, u, v As Double
    x = Me.Real : у = Me.Imaginary
    u = complexNumber.Real : v = complexNumber.Imaginary
    Return New ComplexNumber (x *u-y*v, x*v + y*u)
    End Function

    ' Умножение имеющегося комплексного числа на действительное.
    Public Function Multiply(ByVal real As Double) As ComplexNumber
    Return New ComplexNumber(Me.Real * real, Me.Imaginary * real)
    End Function


    ' Деление имеющегося комплексного числа на другое комплексное число.
    Public Function DivideBy(ByVal complexNumber As ComplexNumber)
    As ComplexNumber
    Dim x, y, u, v As Double
    x = Me.Real : у = Me.Imaginary
    u = complexNumber.Real : v : complexNumber.Imaginary
    Dim Sum As Double = u*u + v*v
    Return New ComplexNiimber((x * u + у * v) / Sum,
    (y * u - x * v) / Sum)
    End Function

    ' Деление имеющегося комплексного числа на действительное число.
    Public Function DivideBy(ByVal real As Double) As ComplexNumber
    Return New ComplexNumber(Me.Real / real, Me.Imaginary / real)
    End Function

    'Проверка равенства имеющегося числа и другого комплексного числа.
    Public Overloads Overrides Function Equals(ByVal obj As Object) _
    As Boolean
    If Not TypeOf obj Is ComplexNumber Then Return False
    Dim Compare As ComplexNumber * CType(obj, ComplexNumber)
    Return (Me.Real = Compare.Real And Me.Imaginary = Compare.Imaginary)
    End Function

    ' Проверка равенства значений двух комплексных чисел.
    Public Overloads Shared Function Equals(ByVal objA As Object, _
    . ByVal objB As Object) As Boolean
    If Not (TypeOf objA Is ComplexNumber) Or _
    Not (TypeOf objB Is ComplexNumber) Then Return False
    Dim ComplexA As ComplexNumber = CType(obJA, ComplexNumber)
    Dim ComplexB As ComplexNumber = CType(objB, ComplexNumber)
    Return (ComplexA.Real = ComplexB.Real _
    And ComplexA.Imaginary = ComplexB.Imaginary)
    End Function

    ' Определения некоторых вспомогательных методов.
    Public Function GetModulusO As Double
    Return Math.Sqrt(Me.Real ^ 2 + Me.Imaginary ^ 2)
    End Function
    Public Function GetHodulusSquaredO As Double
    Return Me.Real ^ 2 + Me.Imaginary ^ 2
    End Function
    Public Function GetArgument() As Double
    Return Math.Atan2(Me.Imaginary, Me.Real)
    End Function
    Public Function GetConjugateO As ComplexNumber
    Return New ComplexNumber(Me.Real, Me.Imaginary) l
    End Function

    ' Возврат строковой репрезентации комплексного числа.
    Public Overrides Function ToStringO As String
    Return Me.Real.ToStringO & ", " & Me.Imaginary.ToStringO & "i"
    End Function

    ' Копирование комплексного числа.
    Public Function CloneO As Object Implements System.ICloneable.Clone
    Return New ComplexNumber(Me.Real, Me.Imaginary)
    End Function

    ' Сравнение двух комплексных чисел (позволяет сортировать их массивы).
    Public Function CompareTo(ByVal pbj As Object) As Integer _
    Implements System.IComparable.CompareTo
    If Not (TypeOf obj Is ComplexNumber) Then Return 0
    Dim Compare As ComplexNumber = CType(obj, ComplexNumber)
    Return Me.GetModulusO.CompareTo(Compare.GetHodulusO)
    End Function
    End Class


    Visual Basic .NET не поддерживает перегрузку операторов, и для выполнения действий над комплексными числами понадобятся методы (Add, Subtract и т.д.), а не предопределенные операторы (такие как + и -). Но это не такое уж и серьезное неудобство.
    Протестировать этот класс можно так:
    Dim с1 Аз New ComplexNumber(3, 3)
    Dim c2 As New ComplexNumber(1, -4)
    Dim c3 As New ComplexNumber(3, 3)
    If d.Equals(c3)
    ' Проверка пройдет успешно, так как c1 = с3.
    Console.WriteLine("Passed value equality test.")
    End If
    c1 = c1.Multiply(c2)
    c1 = c1.Add(c3)
    ' Эта команда отобразит "18, -61".
    Console.WriteLine(d.ToString())


    2.06 Работа с векторами
    =========================================================
    Вот полный код класса Vector:

    Public Class Vector
    Implements ICloneable, IComparable
    ' Координаты вектора.
    Public x, у, z As Double

    ' Создание нового вектора.
    Public Sub New(ByVal x As Double, Byyal у As Double, ByVal z As Double)
    Me.x = x
    Me.у = у
    Me.z = z
    End Sub

    ' Сложение вектора с имеющимся вектором.
    Public Function Add(ByVal vector As Vector) As Vector
    Return New Vector(Me.x + vector.x, Me.у + vector.у, Me.z + vector.z)
    End Function

    ' Вычитание вектора из имеющегося вектора.
    Public Function Subtract(ByVal vector As Vector) As Vector
    Return New Vector(Me.x - vector.x, Me.у - vector.у, Me.z - vector.z)
    End Function

    ' Умножение имеющегося вектора на скаляр.
    Public Function Multiply(ByVal n As Double) As Vector
    Return New Vector(Me.x * n, Me.у * n, Me.z * n)
    End Function

    ' Деление имеющегося вектора на скаляр.
    Public Function DlvideBy(ByVal n As Double) As Vector
    Return New Vector(Me.x / n, Me.у / n, Me.z / n)
    End Function

    ' Определения некоторых вспомогательных методов.
    Public Function GetCrossProduct(ByVal vector As Vector) As Vector
    Return New Vector(Me.y * vector.z - Me.z * vector.y, _
    -Me.x * vector.z + Me.z * vector.x, _
    Me.x * vector.у - Me.у * vector.x)
    End Function

    Public Function GetDotProduct(ByVal vector As Vector) As Double
    Return (Me.x * vector.x + Me.у * vector.у + Me.z * vector.z)
    End Function
    Public Function Length() As Double
    Return Math.Sqrt(Me.x * Me.x + Me.у * Me.у + Me.z * Me.z)
    End Function

    Public Function Normalize() As Vector
    Dim nLength As Double
    nLength * Length()
    If nLength = 0 Then Throw New DivideByZeroException()
    Return New Vector(Me.x / nLength, Me.у / nLength, Me.z / nLength)
    End Function

    ' Проверка равенства имеющегося вектора и другого вектора.
    Public Overloads Function Equals(ByVai obj As Object) As Boolean
    If Not (TypeOf obj Is Vector) Then Return False
    Dim Compare As Vector = CType(obj, Vector)
    Return (Me.x = Compare.x And Me.у = Compare.у And Me.z = Compare.z)
    End Function

    ' Проверка равенства значений двух векторов.
    Public Overloads Shared Function Equals(ByVal objA As Object, _
    ByVal objВ As Object) As Boolean
    If Not (TypeOf objA Is Vector) Or _
    Not (TypeOf objВ Is Vector) Then Return False
    Dim VectorA As Vector = CType(objA, Vector)
    Dim VectorB As Vector = CType(objB, Vector)
    Return (VectorA.x = VectorB.x And VectorA.у = VectorB.у _
    And VectorA.z = VectorB.z)
    End Function
    Public Overrides Function ToStringO As String
    Return "(" & Me.x.ToStringO & ", " & _
    Me.y.ToStringO & ", " & Me.z.ToStringO & ")"
    End Function

    1 Копирование вектора.
    Public Function CloneO As Object Implements System.ICloneable.Clone
    Return New Vector(Me.x, Me.y, Me.z) _
    End Function

    ' Сравнение двух векторов (позволяет сортировать массивы векторов).
    Public Function CompareTo(ByVal obj As Object) As Integer _
    Implements System.ICompa rable.CompareTo
    If Not (TypeOf obj Is Vector) Then Return 0
    Dim Compare As Vector = CType(obj, Vector)
    Return Me.Length().CompareTo( Compare. Length())
    End Function
    End Class

    Visual Basic .NET не поддерживает перегрузку операторов, и для выполнения действий над векторами понадобятся методы (Add, Subt ract и т.д.), а не предопределенные операторы (такие как + и -). Но это не так уж и страшно.
    Вот простой тест класса вектора:

    Dim v1 As New VectorA(10, 2, -3)
    Dim v2 As New VectorA(1, -2, -4)
    Dim v3 As New VectorA(10, 2, -3)
    If v1.Equals(v3) Then
    ' Проверка пройдет успешно, так как с1 = сЗ.
    Console.WriteLine("Passed value equality test.")
    End If
    v1 = v1.GetCrossProduct(v2)
    ' Эта команда отобразит "(-14, 37, -22)".
    Console.WriteLine(v1.ToString())

    2.07 Работа с матрицами
    =========================================================
    ' Создание матрицы 1x2 и задание ее значений.

    Dim MatrixA As New Mapack.Matrix(1, 2)
    MatrixA(0, 0) = 5 : MatrixA(0, 1) = 2
    ' Создание матрицы 2x1 и задание ее значений.
    Dim MatrixB As New Mapack.Matrix(2, 1)
    MatrixB(0, 0) = 5 : MatrixB(1, 0) = 2

    ' Умножение матриц и отображение результата.
    Dim Result As Mapack.Matrix = _
    CType(MatrixA.Hultiply(MatrixB), Mapack.Matrix)
    Console.WriteLine(Result.ToString())
    ' Отображается 29.

    2.08 Получение системной даты и времени
    =========================================================
    Свойство DateTime. Now возвращает текущую дату и время в форме структуры DateTime.
    После этого для получения конкретной информации о дате вы можете задействовать
    свойства этой структуры, такие как Month, Day, Date, Hour, Millisecond и даже DayOfWeek
    Dim Now As DateTime = DateTime.Now
    Console.WriteLine(The current date is: " & Now.ToString())
    Console.WriteLine ("It's a " & Now.DayOfWeek.ToString())

    2.09 Определение дня недели, високосного года и не только
    =========================================================
    Dim Calendar As New System.Globalization.GregorianCalendar()
    Console.WriteLine("Days in December 2000: " & _
    Calendar.GetDaysInMonth(2000, 12, _
    Calendar.CurrentEra).ToSt ring()
    Console.WriteLine("Is 2004 a leap year? " & _
    Calendar.IsLeapYearB004))
    Console.WriteLine("Days in 2004: " & _
    Calendar.GetDaysInYearB004))
    Console.WriteLine("Today is a " & _
    Calendar.GetDayOfWeek(DateTime.Now).ToString())

    Результат выполнения этого фрагмента таков:
    Days in December 2000: 31
    Is 2004 a leap year? True
    Days in 2004: 366
    Today is a Friday

    2.10 Получение названий дней и месяцев на других языках
    =========================================================
    Создав объект Culturelnfo для соответствующих региональных стандартов, вызовите метод GetDayName или GetNonthName.

    В пространстве имен System.Globalization определен тип DateTimeFormatJnfo, содержащий специфичную для региональных стандартов информацию о дате. Получить объект DateTlmeFormatlnfo для конкретных региональных стандартов можно, используя свойство Culturelnfo.DateTimeFormat. Однако создать объект Culturelnfo вы должны сами, указав корректное название региональных стандартов, такое как "en-US" (полный список названий региональных стандартов см. в MSDN).

    ' Создание объекта Culturelnfo с параметрами "французский язык -Франция".
    Dim Culture As New System.Globalization.Culturelnfo("fr-FR")

    ' Получение соответствующего объекта DateTimeFormatlnfo.
    Dim FormatInfo As System.Globalization.DateTimeFormatlnfo
    FormatInfo = Culture.DateTimeFormat
    Console.WriteLine(FormatInfo.GetDayName(DayOfWeek.Monday))
    ' Эта команда отобразит слово "lundi".
    Console.WriteLine(Formatlnfо.GetMonthName(1))
    ' Эта команда отобразит слово "Janvier".

    2.11 Проверка даты, введенной пользователем
    =========================================================
    Dim DateString As String = "3/17/1977"
    ' Чтобы ввести спецсимвол /, его
    ' нужно заключить в апострофы.
    Dim d2 As DateTime = DateTime.ParseExact(DateString, "MM'/'dd'/'yyyy",_
    Nothing)

    Console.WriteLine("The date parsed as: " & d2.ToString())
    ' Эта команда выводит строку "The date parsed as: 197-03-17 12:00:00 AM".
    ' Заметьте: все экземпляры DateTime включают
    ' время, по умолчанию равное 12:00:00 AM.

    При получении дат от пользователей гораздо лучше предотвратить ввод неверных значений, чем обрабатывать их постфактум. Элементы управления DateTimePicker (для приложений Microsoft Windows) и Calendar (для Web-приложений Microsoft ASP.NET) могут исключать возможность ошибок, устраняя необходимость преобразования строк.

    Наверх

 

3. Часто задаваемые вопросы

    3.01 Как использовать в VB.NET API-функции? - Visual Basic .net
    3.02 Как завершить программу? - Visual Basic .net
    3.03 Как добавить обработчик для формы? - Visual Basic .net
    3.04 Как рисовать на форме? - Visual Basic .net
    3.05 Как нарисовать точку на форме? - Visual Basic .net
    3.06 Как добавить массив значений в ComboBox (ListBox)? - Visual Basic .net
    3.07 Как открыть файл в связанном с ним приложении? - Visual Basic .net
    3.08 Как создать новый GUID? - Visual Basic .net
    3.09 Как получить текушее время? - Visual Basic .net
    3.10 Как динамически создать файл с изображением? - Visual Basic .net
    3.11 Как использовать InputBox из VB6 в VB.NET? - Visual Basic .net
    3.12 Как очистить окно в консольном приложении? - Visual Basic .net
    3.13 Как вывести информацию в окно отладки? - Visual Basic .net
    3.14 Как выяснить значения отдельных битов в переменной? - Visual Basic .net
    3.15 Как сделать паузу в VB? - Visual Basic .net
    3.16 Как запретить ввод новых значений в combobox? - Visual Basic .net
    3.17 Как заблокировать в VB 2005 Ctrl+Alt+Del ? - Visual Basic .net
    3.18 Как программно узнать какая установленна ОС? - Visual Basic .net
    3.19 Как прочитать данные из реестра - Visual Basic .net
    3.20 Как Определить свой локальный IP адрес - Visual Basic .net
    3.21 Как скачать файл из интернета - Visual Basic .net
    3.22 Как узнать путь к системным папкам? - Visual Basic .net
    3.23 Нажатие клавиш в другой программе - Visual Basic .net
    3.24 Открытие файлов через OpenDialog - Visual Basic .net
    3.25 Как программно распечатать документ WORD - Visual Basic .net
    3.26 Как запретить запуск 2 (второй) копии программы - Visual Basic .net
    3.27 Как завершить процесс или как закрыть другую программу - Visual Basic .net
    3.28 Отображение стандартного диалогового окна выбора каталога - Visual Basic .net
    3.29 Использование операции "Drag-and-drop" - Visual Basic .net

    3.01 Как использовать в VB.NET API-функции?
    =======================================================
    Для использования API-функций в VB.NET необходимо только объявить нужную функцию.

    Вот приммер такого обявления и использования:

    Public Class Form1
    Inherits System.Windows.Forms.Form
    ...
    ' Объявление API-функции.
    Public Declare Function MyMsgBox Lib "user32.dll" Alias "MessageBoxA" _
    (ByVal hWnd As Integer, ByVal strMessage As String, _
    ByVal strCaption As String, ByVal uiType As Integer) _
    As Integer
    ...
    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    ' Вызов API-функции.
    MyMsgBox(0, "Hello!", "Caption", 0)
    End Sub
    End Class

    В указанном примере мы объявили API-функцию в классе формы и вызываем ее по нажатию на кнопку. Результатом будет появление стандартного MessageBox'а.

    2.02 Как завершить программу?
    =======================================================
    Вот так:

    Application.Exit()

    2.03 Как добавить обработчик для формы?
    =======================================================
    Для добавления обработчика для формы в окне кода выберите в левом combobox'е Overrides, а в правом - нужное событие:

    В появившейся заготовке пишем нужный код.

    Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
    ' Нужный код.
    End Sub

    2.04 Как рисовать на форме?
    =======================================================
    Для рисования на форме мы должны получить приписанный к форме объект Graphics и затем вызывать е го методы для рисования. Это надо делать в обработчике OnPaint:

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics
    g = e.Graphics()
    ' Рисуем эллипс.
    g.DrawEllipse(New Pen(Color.Navy), 10, 10, 40, 40)
    End Sub
    Разумеется, вместо DrawEllipse можно использовать и другие методы для рисования.

    2.05 Как нарисовать точку на форме?
    =======================================================
    Самый простой способ нарисовать точку - это нарисовать маленький кружок или квадрат (так как никакого специального метода для рисования просто нет). Например, вот так:

    Protected Overrides Sub OnPaint _
    (ByVal e As System.Windows.Forms.PaintEventArgs)
    e.Graphics().FillRectangle(Brushes.Blue, 30, 30, 1, 1)
    End Sub

    2.06 Как добавить массив значений в ComboBox (ListBox)?
    =======================================================
    Часто требуется заполнить ComboBox (ListBox) значениями из некоторого массива. Конечно, это можно делать по-элементно. Но это долго и не элегантно. Гораздо проще это делать через метод AddRange для коллекции Items нашего ComboBox (ListBox).

    Например, вот так:

    ' Заполнение массива значениями.
    Dim s As String() = {"Red", "Yellow", "Black"}
    ' Добавление массива значений в ListBox.
    ListBox1.Items.AddRange(s)
    ' Добавление массива значений в ComboBox.
    ComboBox1.Items.AddRange(s)

    2.07 Как открыть файл в связанном с ним приложении?
    =======================================================
    Для открытия файла в ассоциированном с ним приложении (например, для открытия *.doc файла в Word'е или *.txt файла в Notepad'e) мы используем статический метод Start из класса Process из пространства имен System.Diagnostics.

    Например, вот так:
    ' Открываем файл в Notepad'е.
    Process.Start("c:\1.txt")
    или так:

    ' Открываем файл в Word'е.
    Process.Start("c:\2.doc")

    2.08 Как создать новый GUID?
    =======================================================
    Для создания нового GUID (глобального уникального идентификатора) надо воспользоваться shared-методом NewGuid класса System.Guid. Вот так, например, можно показать некий GUID в label'е на форме:

    ' Объявляем GUID.
    Dim guid As System.Guid
    ' Получаем новый GUID.
    guid = System.Guid.NewGuid()
    ' Показываем GUID в label'е.
    Label1.Text = guid.ToString()

    Обратите внимание, что GUID традиционно показывается в виде группировки по 8+4+4+4+12 разрядов.

    GUID можно применять там, где надо получить гарантированно уникальное значение (например, для имени временного файла или для идентификатора сессии в ASP.NET).

    2.09 Как получить текушее время?
    =======================================================
    Для получения текущего времени можно использовать статический метод Now класса DateTime.

    Например, можно написать что-то вроде:

    Label1.Text = DateTime.Now()
    Результатом будет строка вида "05.01.2005 17.25.43". Как вы видите, в этой строке есть число, месяц, год, часы, минуты и секунды текущего времени.

    При необходимости можно вычленить отдельные части текущего времени - секунды, минуты и т. п. Для этого мы используем свойства Second, Minute, Hour, Day, Month и Year. В этом случаем мы пишем что-то вроде:

    ' Получаем текущий год.
    Label1.Text = DateTime.Now().Year.ToString()

    3.10 Как динамически создать файл с изображением?
    =======================================================
    Часто надо создать динамически файл с изображением в определенном графическом формате. Например, для графического представления некоторой информации, которая может поступать из некоторого источника (скажем, из базы данных). При этом все такие генерируемые изображения часто имеют один и тот же фон.

    Вот как это делается:

    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    ' Открытие файла с фоном.
    Dim bm As New Bitmap("C:\1.bmp")
    ' Создание объекта типа Graphics из файла с фоном.
    Dim gr As Graphics
    gr = Graphics.FromImage(bm)
    ' Рисуем красный круг.
    gr.FillEllipse(New SolidBrush(Color.Red), 10, 10, 40, 40)
    ' Сохранение нового файла на диск.
    bm.Save("C:\1.gif", Imaging.ImageFormat.Gif)
    End Sub
    Код достаточно ясен из комментариев. Разумеется, файл 1.bmp должен существовать.

    Кроме того, обратите внимание, что сохранять файл мы можем в весьма разнообразных графических файлах - это определяет второй параметр метода Save класса Bitmap.

    Для тех, кто программировал на C++, сразу должно быть понятно, что класс Graphics - это аналог контекста устройстваю

    3.11 Как использовать InputBox из VB6 в VB.NET?
    =======================================================
    Вообще говоря лучше не использовать InputBox из старых версий VB, так как он устарел. Вместо этого лучше использовать свое диалоговое окно. Причин можно указать несколько - например потому, что InputBox позволяет занести в него только одно значение, а собственное диалоговое окно - несколько (например, имя, фамилию, возраст и т. п.).

    Но уж если совсем надо, то используем следующий код:

    Dim s As String
    s = Microsoft.VisualBasic.Interaction.InputBox _
    ("text", "title", "response", 100, 200)
    Вообще говоря пространство имен Microsoft.VisualBasic.Interaction подключается к проектам на VB.NET автоматически, так что его можно и не писать.

    3.12 Как очистить окно в консольном приложении?
    =======================================================
    Для очистки окна в консольном приложении служит метод Clear класса Console.

    Например, после выполнения следующего фрагмента на консоле будет только текст Text 2:

    Console.WriteLine("Text 1")
    Console.Clear()
    Console.WriteLine("Text 2")


    3.13 Как вывести информацию в окно отладки?
    =======================================================
    Для вывода информации в окно отладки используется метод Write (или WriteLine) класса Debug из пространства имен System.Diagnostics.

    Вот пример использования этого метода:

    Sub Main()
    Dim a As Integer
    Dim b As Integer
    b = 0
    Try
    a = 1 / b
    Catch ex As Exception
    System.Diagnostics.Debug.WriteLine("====")
    System.Diagnostics.Debug.WriteLine(ex.Message)
    System.Diagnostics.Debug.WriteLine("====")
    End Try
    End Sub


    3.14 Как выяснить значения отдельных битов в переменной? - Visual Basic .net
    =======================================================
    Часто для числовой переменной необходимо выяснить значения некоторых битов. Это можно сделать, например, через класс BitArray. Класс BitArray имеет индексатор, который и позволяет получить значения отдельных битов.

    Вот пример:

    Dim a As Integer = 5
    ' Делаем массив из целого.
    Dim ba As New BitArray(New Integer() {a})
    ' Показываем все биты.
    Dim i As Integer
    For i = 0 To 31
    Console.WriteLine(ba(i).ToString())
    Next
    Приведенный пример выведет на экране true, false, true и далее все оставшиеся значения как false (так как в двоичное представление числа 5 - это 101).

    Обратите внимание, что конструктор класса BitArray принимает в нашем примере в качестве параметра массив целых, так что мы вынуждены сделать массив из нашей целочисленной переменной.

    3.15 Как сделать паузу в VB? - Visual Basic .net
    =======================================================
    Для задержки выполнения программы на некоторое время надо использовать метод Sleep класса Thread. Этот метод принимает в качестве параметра промежуток времени (в миллисекундах), на которой следует приостановить поток.

    Вот пример:

    Sub Main()
    Console.WriteLine("0 second")
    System.Threading.Thread.Sleep(2000)
    Console.WriteLine("1 second")
    End Sub
    Приведенный фрагмент выведет вторую надпись через 2 секунды после первой.

    3.16 Как запретить ввод новых значений в combobox? - Visual Basic .net
    =======================================================
    Часто нам надо ограничить вводимые пользователем значения для combobox'а только теми, что имеются в нем. Т. е. пользователь не должен иметь возможность ввести собственное значение. Для этого мы должны установить его свойство DropDownStyle в DropDownList. Чаще всего это делается в окне Properties на этапе разработки. Вот пример программной установки этого свойства:

    ...
    ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
    ...
    3.17 Как заблокировать в VB 2005 Ctrl+Alt+Del? - Visual Basic.net
    =======================================================
    Open "C:\windows\system32\taskmgr.exe" For Binary Lock Read Write As #1

    Чтобы разблокировать его, напиши Close #1

    3.18 Как программно узнать какая установленна ОС? - Visual Basic.net
    =======================================================
    System.Environment.OSVersion.VersionString

    3.19 Как прочитать данные из реестра - Visual Basic.net
    =======================================================
    Dim Reg As Microsoft.Win32.RegistryKey
    Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("software\Microsoft\Windows\CurrentVersion\run\")
    Dim name As String = CType(key.GetValue("NameReg"), String)'NameReg - Название параметра

    3.20 Как Определить свой локальный IP адрес - Visual Basic.net
    =======================================================
    Dim i As Net.IPHostEntry =Net.Dns.GetHostByName(Net.Dns.GetHostName)
    MsgBox(i.AddressList(0).ToString)

    3.21 Как скачать файл из интернета - Visual Basic.net
    =======================================================
    'Кинь на форму кнопку 'Вот к ней код: My.Computer.Network.DownloadFile("http://vbrus.narod.ru/InfoNet.htm", "c:\InfoNet.htm") 'Сохраняем файл: "http://vbrus.narod.ru/InfoNet.htm"на жёсткий диск в: "c:\InfoNet.htm"

    3.22 Как узнать путь к системным папкам? - Visual Basic.net
    =======================================================
    'Кинь на форму Кнопку и ЛистБокс, вот код:
    Dim DirSystemName(23) As System.Environment.SpecialFolder

    DirSystemName(1) = Environment.SpecialFolder.ApplicationData
    DirSystemName(2) = Environment.SpecialFolder.CommonApplicationData
    DirSystemName(3) = Environment.SpecialFolder.CommonProgramFiles
    DirSystemName(4) = Environment.SpecialFolder.Cookies
    DirSystemName(5) = Environment.SpecialFolder.Desktop
    DirSystemName(6) = Environment.SpecialFolder.DesktopDirectory
    DirSystemName(7) = Environment.SpecialFolder.Favorites
    DirSystemName(8) = Environment.SpecialFolder.History
    DirSystemName(9) = Environment.SpecialFolder.InternetCache
    DirSystemName(10) = Environment.SpecialFolder.LocalApplicationData
    DirSystemName(11) = Environment.SpecialFolder.MyComputer
    DirSystemName(12) = Environment.SpecialFolder.MyDocuments
    DirSystemName(13) = Environment.SpecialFolder.MyMusic
    DirSystemName(14) = Environment.SpecialFolder.MyPictures
    DirSystemName(15) = Environment.SpecialFolder.Personal
    DirSystemName(16) = Environment.SpecialFolder.ProgramFiles
    DirSystemName(17) = Environment.SpecialFolder.Programs
    DirSystemName(18) = Environment.SpecialFolder.Recent
    DirSystemName(19) = Environment.SpecialFolder.SendTo
    DirSystemName(20) = Environment.SpecialFolder.StartMenu
    DirSystemName(21) = Environment.SpecialFolder.Startup
    DirSystemName(22) = Environment.SpecialFolder.System
    DirSystemName(23) = Environment.SpecialFolder.Templates

    Dim i As Integer
    For i = 1 To 23
    Dim s As String = System.Environment.GetFolderPath(DirSystemName(i))
    ListBox1.Items.Add(s)
    Next i

    Если неврубился, то смотри еще:
    'Кинь на форму кнопку, вот код:
    Dim DirSystemName As System.Environment.SpecialFolder
    Dim s As String = Environment.SpecialFolder.Desktop
    MessageBox.Show(s) 'Узнаём путь к рабочему столу

    3.23 Нажатие клавиш в другой программе - Visual Basic.net
    =======================================================
    'Нажимаем на клавиши в программе Калькулятор
    Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'Делаем активным окно калькулятора (программа калькулятор должна быть запущенна)
    AppActivate("Калькулятор")
    'Заголовок окна программы в которой будем нажимать на клавиши
    'Нажимаем на 4 клавиши в калькуляторе программно: (5)+(*)+(5)+(ENTER)
    SendKeys.SendWait("5*5{ENTER}")
    End Sub
    End Class

    3.24 Открытие файлов через OpenDialog - Visual Basic.net
    =======================================================
    'Если вы хотите просто запустить файл то вот: Process.Start("c:\1.gif")

    'Запуск приложений через OpenDialog
    Public Class Form1
    Dim OpenFile As New OpenFileDialog()
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If OpenFile.ShowDialog() = DialogResult.OK Then
    Process.Start(OpenFile.FileName)
    End If
    End Sub
    End Class

    3.25 Как из VB.NET распечатать Word'овский файл - Visual Basic.net
    =======================================================
    Public Class Form1
    Dim OpenFile As New OpenFileDialog()
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If OpenFile.ShowDialog() = DialogResult.OK Then
    Dim PStart As New ProcessStartInfo(OpenFile.FileName)
    Dim Print As Boolean = False
    Dim V As String
    For Each V In PStart.Verbs
    If V.ToLower() = "print" Then
    Print = True
    PStart.Verb = V
    Exit For
    End If
    Next
    If Print Then
    Process.Start(PStart)
    End If
    End If
    End Sub
    End Class

    3.26 Как разрешить запуск только одного экземпляра программы - Visual Basic.net
    =======================================================
    Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim Proc() As Process
    'Определение полного имени текущего процесса.
    Dim ModuleName, ProcName As String
    ModuleName = Process.GetCurrentProcess.MainModule.ModuleName
    ProcName = System.IO.Path.GetFileNameWithoutExtension(ModuleName)
    'Находим все процессы с данным именем
    Proc = Process.GetProcessesByName(ProcName)
    'Если процесса такого нет то запускаем программу
    'Если процесс есть уже с таким именем то закрываем программу
    'Если вы хотите разрешить запуск 2 экзэмпляра приложения то измените Proc.Length > 1 на Proc.Length > 2
    If Proc.Length > 1 Then
    'Если есть такой процесс то закрываем прогу
    Application.Exit()
    Else
    'Если нет такого процесса то выполняем действие'
    '----------------------------------------------'
    End If
    End Sub
    End Class

    3.27 Как завершить процесс или как закрыть другую программу - Visual Basic.net
    =======================================================
    Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim Processes() As Process
    Dim Proc As Process
    Processes = Process.GetProcessesByName("qip") 'Закрываем программу QIP
    For Each Proc In Processes
    'Попытка закрыть программу по хорошему
    Proc.CloseMainWindow()
    'Если по хорошому не получилось то закрываем по плохому
    If Not Proc.HasExited Then
    Proc.Kill()
    End If
    Next
    End Sub
    End Class

    3.28 Отображение стандартного диалогового окна выбора каталога - Visual Basic.net
    =======================================================
    Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim OpenFolder As New FolderBrowserDialog
    OpenFolder.SelectedPath = "c:\" 'Первоначальный путь
    OpenFolder.Description = "Выбор каталога"
    If OpenFolder.ShowDialog = DialogResult.OK Then
    MessageBox.Show("Вы выбрали каталог:", OpenFolder.SelectedPath)
    End If
    End Sub
    End Class

    3.29 Использование операции "Drag-and-drop" - Visual Basic.net
    =======================================================
    VB.NET
    'Киньте на форму 2 TextBox'a
    'Далее код:
    Public Class Form1
    Private Sub TextBox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop, TextBox2.DragDrop
    Dim Txt As TextBox = CType(sender, TextBox)
    Txt.Text = CType(e.Data.GetData(DataFormats.Text), String)
    End Sub

    Private Sub TextBox_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter, TextBox2.DragEnter
    If (e.Data.GetDataPresent(DataFormats.Text)) Then
    e.Effect = DragDropEffects.Copy
    Else
    e.Effect = DragDropEffects.None
    End If
    End Sub

    Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown, TextBox2.MouseDown
    Dim txt As TextBox = CType(sender, TextBox)
    txt.SelectAll()
    txt.DoDragDrop(txt.Text, DragDropEffects.Copy)
    End Sub
    End Class


    Теперь запустите прогу, в TextBox2 напишите слово "Привет" или любое другое
    затем выделите его мышкой, и неотпуская кнопку мыши, наведите её на TextBox1 и отпустите.

    Наверх

 

4. Как отправить файл в корзину? (!API!)

    Option Strict Off
    Option Explicit On
    Imports System.IO
    Module Module1

    Private Structure SHFILEOPSTRUCT
    Dim hwnd As Integer
    Dim wFunc As Integer
    Dim pFrom As String
    Dim pTo As String
    Dim fFlags As Short
    Dim fAnyOperationsAborted As Boolean
    Dim hNameMappings As Integer
    Dim lpszProgressTitle As String
    End Structure

    Private Const FO_DELETE As Short = &H3s
    Private Const FOF_ALLOWUNDO As Short = &H40s
    Private Const FOF_NOCONFIRMATION As Short = &H10s

    Private Declare Function SHFileOperation Lib "shell32.dll" Alias _
    "SHFileOperationA" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer

    Public Function Recycle(ByRef sPath As String) As Integer
    Dim FileOp As SHFILEOPSTRUCT
    If Not File.Exists(sPath) Then
    MsgBox("Could not find " & sPath & "." & vbCrLf _
    & "Please verify the path.")
    Recycle = -1
    Exit Function
    End If
    With FileOp
    .wFunc = FO_DELETE
    .pFrom = sPath & vbNullChar
    .pTo = vbNullChar
    .fFlags = FOF_NOCONFIRMATION Or FOF_ALLOWUNDO
    .lpszProgressTitle = "Sending " & sPath & " to the Recycle Bin"
    End With
    Try
    SHFileOperation(FileOp)
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try
    Recycle = 0
    End Function
    End Module

    Наверх
 

5. Работа с файлами в Visual Basic .net

    Удаление, перемещение, копирование, создание, открытие файла

    Скачать Работа с файлами в Visual Basic .net (11,9КБ) | Наверх

 

6. Работа с реестром (создание, чтение, запись, удаление) - Visual Basic.net

    Код:

    Dim tempKey As Microsoft.Win32.RegistryKey


    Считывание значения из реестра: Код:

    tempKey = registryObject
    If tempKey Is Nothing Then
    MsgBox("Please select a registry hive.")
    Return
    End If
    Value.Text = CStr(tempKey.GetValue(ShowSubKey.Text))
    History.Items.Add("Read Value " & selectHive.Text & "\" & ShowSubKey.Text)


    Установка значения: Код:

    tempKey = registryObject
    If tempKey Is Nothing Then
    MsgBox("Please select a registry hive.")
    Return
    End If
    If Value.Text Is Nothing Then
    MsgBox("Please enter a value.")
    Return
    End If
    tempKey.SetValue(showSubKey.Text, Value.Text)
    tempKey.Close()
    History.Items.Add("Set Value " & selectHive.Text & "\" & showSubKey.Text)


    Создание ключа: Код:

    registryObject.CreateSubKey(showSubKey.Text)
    History.Items.Add("Create Key " & selectHive.Text & "\" & showSubKey.Text)


    Удаление ключа: Код:

    tempKey = registryObject
    If tempKey Is Nothing Then
    MsgBox("Please select a registry hive.")
    Return
    End If
    If showSubKey.Text Is Nothing Then
    MsgBox("Please enter a subkey.")
    Return
    End If
    registryObject.DeleteSubKey(showSubKey.Text)
    History.Items.Add("Delete Key " & selectHive.Text & "\" & showSubKey.Text)

    Наверх
 

7. Обработка ошибок в Visual Basic.net

    Автор: Evangelos Petroutsos
    Mastering™ Visual Basic® .NET
    San Francisco London
    Copyright ©2002 SYBEX, Inc., Alameda, CA www.sybex.com
    Перевод: Игорь Шувалов aka Ronin

    Типы ошибок
    Исключения
    Обработка исключений
    Блок Finally
    Вызов исключений


    Написание программного обеспечения, даже самого маленького, может быть очень трудной задачей. Разработчики обычно тщательно обдумывают и планируют задачи, и методики, используемые для решения этих задач. Комплексная разработка ПО постоянно ведет к ошибкам в программировании. Эта статья создана для того, чтобы познакомить вас с описанием различных типов ошибок, которые вы можете случайно встретить в процессе программирования на Visual Basic .NET, некоторыми инструментами, которые вы можете использовать для обнаружения ошибок, и о специальных структурах программирования, применяемых для предупреждения ошибок в работающей программе. Вдобавок к ошибкам, ваше приложение должно быть готово гибко обработать все неправильные условия, от тех, которые могут произойти по вине пользователей (когда, например, вводят строку вместо числового значения или даты) до неисправных устройств, или простейших ситуаций, связанных с невозможностью записать данные в файл из-за использования этого файла другим пользователем. Все эти условия могут не коснуться вашей программы, но для этого ваше приложение должно специальным образом их обработать. Ваше приложение может показывать предупреждения и сообщения об ошибках, но ни в коем случае не должно завершиться крахом.

    Типы ошибок

    Ошибки, вызываемые компьютерной программой (не важно на каком языке она написана), могут быть разделены на три основных типа: Design-time (во время проектирования), Runtime (во время выполнения) и Logic (логические). Design-time ошибки легче всего обнаружить и исправить. Такого рода ошибки возникают при написании кусков кода, которые не удовлетворяют правилам того языка, на котором они пишутся. Их легко найти, потому что Visual Studio .NET не только указывает на область их возникновения, но и на конкретное выражение. Runtime ошибки обнаружить сложнее, потому что VS не дает никакой помощи в их обнаружении до непосредственного возникновения их в программе. Они возникают при попытке выполнить недопустимое действие, например, получить доступ к данным, которые не существуют, или к ресурсам, к которым приложение не имеет прав доступа. При возникновении такого рода ошибок, если они не будут обработаны должным образом, приложение может либо закончиться крахом, либо зависнуть. Третий тип ошибки, логические, являются самыми коварными и сложными в обнаружении, т.к. они не оказывают никакого влияния на работоспособность приложения. Наличие в программе логических ошибок означает лишь то, что вы будете получать неверные результаты от работы программы. Это могут быть простейшие ошибки при неверной калькуляции, или пункт меню, который вы забыли установить в положение disabled и т.д.

    Исключения

    Runtime ошибки в Visual Basic .NET вызывают исключения. Исключение – это реакция на ошибку, сгенерированную приложением. При возникновении исключения появляется диалог, сообщающий об ошибке с дополнительной информацией. Этот диалог дает возможность пользователю продолжить выполнение программы. В редких случаях это может быть полезным, но чаще всего это не желательно. Продолжение выполнения программы может повлечь за собой неисправимые ошибки, например записи в базу данных неверных (ошибочных) данных.
    Если мы не хотим, чтобы пользователь мог обрабатывали исключения, то мы можем сами легко обрабатывать их программно. Модель обработки ошибок в Visual Basic .NET позволяет сделать это очень легко. Обработчик ошибок в VB.NET – это блок кода, который может обнаружить исключения и выполнить необходимые действия для исправления этой ошибки. Вот примеры ошибок.

    Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click
    Dim s As String
    s = "answer"
    Button2.Text = s.Substring(10, 1)
    End Sub

    Этот код пытается отобразить одиннадцатый символ строки s. Как вы видете, строка s содержит только 6 символов, что и приведет к ошибке. Давайте посмотрим точное определение исключения:
    An unhandled exception of type ‘System.ArgumentOutOfRangeException’ occurred in
    mscorlib.dll
    Additional information: Index and length must refer to a location within the string.

    Первое, что помогает нам убедиться в том, что это runtime ошибка – это слово unhandled. Это значит, что ошибка была в строке, не входящей в блок обработчика исключений. Еще один интересный момент, это тип вызванного исключения System.ArgumentOutOfRangeException. Очень важно знать то, что разные типы ошибок разделяются в группы. Это важно, когда вы реализуете механизм обработки ошибок. Исключения создают объект, наследуемый от класса Exception. Блок “Additional information” («дополнительная информация»), дает нам некоторую специфическую информацию о природе возникновения ошибки.

    Обработка исключений

    Давайте приведем пример обработки ошибок на примере предыдущего кода:
    Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click
    Dim s As String
    s = "answer"
    Try
    Button2.Text = s.Substring(10, 1)
    Catch
    Button2.Text = "error"
    End Try
    End Sub

    Это тот-же код, но теперь выражение, вызывающее ошбку помещено в блок обработки исключений Try…Catch…End Try. Этот блок представляет собой простейший обработчик исключения. Если в блоке Try генерируется исключение, то программа автоматически переходит в блок Catch. Если никаких исключений не генерируется, то программа пропускает блок Catch. При выполнении этого кода, происходит исключение System.ArgumentOutOfRangeException, но программа продолжает выполняться и не показывает никаких сообщений. После выполнения свойство Text кнопки Button2 будет иметь значение "error".

    В следующем примере, исключение генерирует обьект ex класса Exception.
    Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click
    Dim s As String
    s = "answer"
    Try
    Button2.Text = s.Substring(10, 1)
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try
    End Sub

    Очень полезно иметь этот объект. Он позволяет нам получить всю информацию об исключении. Вместо MsgBox в реальной программе можно, например, вести лог ошибок в специальный журнал ошибок. Заметьте, что в предыдущем коде исключения не разделяются на типы. То есть при любом исключении будет обрабатываться один и тот же кода обработчика. Вы также можете написать специфические обработчики ошибок для разнообразных типов исключений, как в следующем далее.
    Private Sub Button3_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button3.Click
    Try
    Button3.Text = lbStates.SelectedItem.ToString
    Catch ex As System.NullReferenceException
    MsgBox("Please select an item first")
    Catch ex As Exception
    MsgBox("Some other error: " & ex.Message)
    End Try
    End Sub

    Этот код пытается получить выбранный элемент из ListBox’a lbStates. Если в lbStates не выбрано ни одного элемента, то генерируется исключение System.NullReferenceException. Это исключение обрабатывается специальным обработчиком, который вызовет MsgBox с соответствующим сообщением ("Please select an item first"). Если же произойдет исключение какого-либо другого типа, то оно будет обработано другим обработчиком.
    Заметьте, что в предыдущем коде обработчик специфичного типа исключений стоит ранее обработчика общего типа. Это определяет порядок обработки исключений.
    Также заметьте, что объект ex присутствует в каждом обработчике. Это становится возможным, потому, что это объявление несет локальный характер, и область видимости этого объекта ограничивается соответствующим блоком Catch.

    Блок Finally

    При использовании структуры обработки исключений Try…Catch…End Try исключение обрабатывается первым релевантным обработчиком. После этого программа уходит за рамки этой структуры. Иногда требуется выполнить какой-либо код, перед тема как выйти из структуры Try…Catch…End Try. Как, например, в следующем коде.
    Protected Sub ReadFromATextFile(ByVal cFilename As String)
    Dim s As StreamReader
    Dim cLine As String
    Dim bDone As Boolean = False
    lbresults.Items.Clear()
    s = New Streamreader(cFilename)
    Try
    While Not bDone
    cLine = s.ReadLine()
    If cLine Is Nothing Then
    bDone = True
    Else
    lbresults.Items.Add(cLine)
    End If
    End While
    s.Close()
    Catch ex As Exception
    MsgBox("some error occurred")
    End Try
    End Sub

    В этом коде читается файл и построчно загружается в ListBox. Если возникнет исключение в цикле, то мы не сможем закрыть Streamreader (вызвать s.Close()), что может повлеч к ненужной трате ресурсов.
    К счастью, для этого существует специальный блок, код которого будет выполнен в любом случае. Этот блок называется Finally. Вот измененный код из предыдущего примера.
    Protected Sub ReadFromATextFile(ByVal cFilename As String)
    Dim s As StreamReader
    Dim cLine As String
    Dim bDone As Boolean = False
    lbresults.Items.Clear()
    s = New Streamreader(cFilename)
    Try
    While Not bDone
    cLine = s.ReadLine()
    If cLine Is Nothing Then
    bDone = True
    Else
    lbresults.Items.Add(cLine)
    End If
    End While
    s.Close()
    Catch ex As Exception
    MsgBox("some error occurred")
    Finally
    s.Close()
    End Try
    End Sub

    Теперь в любом случае Streamreader будет закрыт и ресурсы будут высвобождены.

    Вызов исключений

    При создании собственных классов, вы, вероятно, встретитесь с необходимостью вызова исключений. Это сделать очень просто – для этого существует ключевое слово Throw. Разработчик, использующий ваш класс, сможет обработать это исключение. Вот пример вызова (срабатывания) исключения.
    Private FValue As Integer = 0

    Property Value() As Integer
    Get
    Return FValue
    End Get
    Set(ByVal iValue As Integer)
    If iValue <= FMax Then
    FValue = iValue
    Else
    FValue = FMax
    Throw New OverflowException(_
    “Cannot set ProgressBar value to greater than maximum.”)
    End If
    Invalidate()
    End Set

    Здесь вызывается исключение OverflowException с вашими комментариями.
    Наверх
 

8. Динамическое выполнение кода на VB.NET

    Автор: Николай Белоусов

    Введение
    Создание приложение
    Написание исполняемого кода
    Заключение
    Исходный код к статье

    Введение


    Я думаю всем программистам, которые занимаются одновременно и поддержкой пользователей, знакома ситуация когда юзеры подходят и просят добавить к программе такую фичу, чтобы они могли сами дописывать куски к исходной программе. Не хватает иногда им, видите ли, встроенной функциональности. Не знаю как вам, но меня уже достали! Только придешь на работу, сразу стайками подбегают и просят, чтобы что-нибудь такое приделал к программе…

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

    Создание приложения

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

    Textbox – там собственно и будет располагаться текст программы (не забудьте поставить lang=en-us>Multiline и lang=en-us>Scrollbars) Button – а это собственно для выполнения кода
    Теперь осталось добавить обработчик на нажатие кнопки, чем мы собственно и займемся:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click
    Dim objCodeCompiler As System.CodeDom.Compiler.ICodeCompiler = New _
    VBCodeProvider().CreateCompiler ' создали объект нашего компилятора

    Dim objCompilerParameters As New System.CodeDom.Compiler.CompilerParameters()
    ' а это параметры к нему (что-то типа imports, можно конечно и без этого,
    ' но тогда это все придется дописывать к программе самому пользователю)
    objCompilerParameters.ReferencedAssemblies.Add("System.dll")
    objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll")
    objCompilerParameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
    ' добавили нужные нам ссылки
    objCompilerParameters.GenerateInMemory = True
    ' а также укажем что это все надо генерировать в памяти

    Dim strCode As String = TextBox1.Text
    ' а это собственно наш код из текст бокса

    Dim objCompileResults As System.CodeDom.Compiler.CompilerResults = _
    objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, strCode)
    ' попытаемся скомпилировать все это дело
    If objCompileResults.Errors.HasErrors Then
    ' если присутствуют какие-либо ошибки выведем пользователю первую
    ' можно бы было и все загнать в какой-нибудь listbox но было лень...
    MsgBox("Error: Line>" & objCompileResults.Errors(0).Line.ToString & ", " & _
    objCompileResults.Errors(0).ErrorText)
    Exit Sub
    End If

    Dim objAssembly As System.Reflection.Assembly = objCompileResults.CompiledAssembly
    ' создаем сборку
    ' выполнение программы начнется с класса MainClass
    Dim objTheClass As Object = objAssembly.CreateInstance("MainClass") If objTheClass _
    Is Nothing Then
    ' если такового класса нет, то увы...
    MsgBox("Can't load class...")
    Exit Sub
    End If
    ' а вот если он есть то вызываем его метод ExecuteCode и вперед...
    Try
    objTheClass.GetType.InvokeMember("ExecuteCode", System.Reflection.BindingFlags.InvokeMethod, _
    Nothing, objTheClass, Nothing)
    Catch ex As Exception
    MsgBox("Error:" & ex.Message)
    End Try
    End Sub

    Вот собственно и вся наша программа. Функциональность конечно минимальная, но дальше и сами разберетесь…

    Написание исполняемого кода И последняя часть нашей работы, соответственно создание приложения, которое мы потом поместим в Textbox. Сделаем все по минимуму… Imports System.Windows.Forms

    Public Class MainClass
    Public Function ExecuteCode()
    Dim objTest As New TestClass()
    MessageBox.Show(objTest.Test)
    End Function
    End Class

    Public Class TestClass
    Public Function Test()
    Return "Работает!!!"
    End Function
    End Class
    Тут, как говорится, комментарии излишни… Источник: vbstreets.ru
    Наверх

 

9. Сеть - Visual Basic.net

    9.01 Узнаем Хост имя и ИП адрес - Visual Basic .net
    9.02 Получение IP адреса по имени хоста - Visual Basic .net
    9.03 Как скачать файл из интернета - Visual Basic .net


    9.01 Получение IP адреса по имени хоста - Visual Basic .net
    =========================================================
    Public Class Form1
    Dim HostName As String
    Dim IPAdress As String
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    HostName = System.Net.Dns.GetHostName()
    IPAdress = System.Net.Dns.GetHostByName(HostName).AddressList(0).ToString()
    MsgBox(HostName)
    MsgBox(IPAdress)
    End Sub
    End Class

    9.02 Узнаем Хост имя и ИП адрес - Visual Basic .net
    =========================================================
    Public Class Form1
    Dim IPAdress As System.Net.IPAddress
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    For Each IPAdress In System.Net.Dns.GetHostByName("vbrus.narod.ru").AddressList
    MsgBox(IPAdress.AddressFamily.ToString())
    MsgBox(IPAdress.ToString())
    Next
    End Sub
    End Class


    9.03 Как скачать файл из интернета - Visual Basic.net
    =========================================================
    'Кинь на форму кнопку
    'Вот к ней код:
    My.Computer.Network.DownloadFile("http://vbrus.narod.ru/InfoNet.htm", "c:\InfoNet.htm")
    'Сохраняем файл: "http://vbrus.narod.ru/InfoNet.htm"на жёсткий диск в: "c:\InfoNet.htm"

    Наверх

 

10. Графика - Visual Basic.net

    10.01 Вывести тест под углом - Visual Basic .net
    10.02 Эффект раздвоенного текста - Visual Basic .net
    10.03 Как рисовать на форме? - Visual Basic .net
    10.04 Как нарисовать точку на форме? - Visual Basic .net


    10.01 Вывести тест под углом - Visual Basic .net
    =========================================================
    киньте на форму кнопку вот к ней код:

    Dim gr As Graphics
    Dim font As New Font("Arial", 18, FontStyle.Italic) 'Задаем шрифт, и стиль
    gr = CreateGraphics()
    gr.TranslateTransform(45, 45) 'Переместить в заданную точку
    gr.RotateTransform(45) 'Повернуть на 45 градусов
    gr.DrawString("Визуал Бейсик .НЕТ", font, Brushes.Yellow, 0, 0)
    gr.ResetTransform()
    gr.Dispose()


    10.02 Эффект раздвоенного текста - Visual Basic .net
    =========================================================
    Dim gr As Graphics = CreateGraphics()
    Dim gb As New SolidBrush(Color.Red)
    Dim font As New Font("Arial", 18, FontStyle.Italic) 'Задаем шрифт, и стиль
    gr.DrawString("Визуал Бейсик .НЕТ", font, gb, 10, 10)
    gb.Color = Color.Blue
    gr.DrawString("Визуал Бейсик .НЕТ", font, gb, 8, 8)


    10.03 Как рисовать на форме? - Visual Basic .net
    =========================================================
    Для рисования на форме мы должны получить приписанный к форме объект Graphics и затем вызывать е го методы для рисования. Это надо делать в обработчике OnPaint:

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics
    g = e.Graphics()
    ' Рисуем эллипс.
    g.DrawEllipse(New Pen(Color.Navy), 10, 10, 40, 40)
    End Sub
    Разумеется, вместо DrawEllipse можно использовать и другие методы для рисования.


    10.04 Как нарисовать точку на форме? - Visual Basic .net
    =========================================================
    Самый простой способ нарисовать точку - это нарисовать маленький кружок или квадрат (так как никакого специального метода для рисования просто нет). Например, вот так:

    Protected Overrides Sub OnPaint _
    (ByVal e As System.Windows.Forms.PaintEventArgs)
    e.Graphics().FillRectangle(Brushes.Blue, 30, 30, 1, 1)
    End Sub


    Наверх
Hosted by uCoz