1. Работа со строками
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.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.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 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
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.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.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 Наверх | ||