Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/1480: Рейтинг темы: голосов - 1480, средняя оценка - 4.95
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
#1

Visual Basic .NET FAQ. Готовые решения, полезные коды

18.08.2011, 22:44. Просмотров 268603. Ответов 195
Метки faq (Все метки)

Предлагаю в этой теме размещать ответы на часто задаваемые вопросы и просто делиться полезными кодами.
Обращаю внимание на некоторые моменты, которые являются дополнением к основным правилам
  1. Запрещается копировать материалы с других сайтов или форумов
  2. Решения должны быть написаны с использованием языка Visual Basic .NET
  3. Запрещено создавать посты с уточнениями и замечаниями. Такие вопросы задавайте на форуме
  4. Код, в котором присутствуют комментарии, читается и понимается намного легче и быстрее
  5. Длинные коды и объемные вопросы одного содержания заключайте в теги [SPОILER]Большой код[/SPОILER]
  6. При создании поста убедитесь, что этот вопрос не был освещен ранее
  7. Код должен быть написан грамотно, большие и неэффективные коды будут удаляться
  8. Список вопросов по конкретной теме нельзя "разрывать" на 2 и более поста

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

 Комментарий модератора 
Данные правила обязательны к исполнению в рамках темы


Примечание: некоторые коды приведены без учета строгой типизации (Параметр Strict), поэтому для их использования необходимо выполнить приведение типов
48
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2011, 22:44
Ответы с готовыми решениями:

Visual Basic .Net и Visual Basic 6.0 - В чём разница
В общем возник вопрос: Visual Bisic.Net и Visual Basic - это два разных языка,...

Visual Basic.Net и Visual Studio 2013 - в чем разница?
Visual Basic.Net и Visual Studio 2013 - в чем разница? Или это одно и тоже,...

Visual Basic .NET vs Visual FoxPro 9.0 в рамках задач реляционной модели данных
Очень хочется обсудить следующую тему. Поставлена задача - написать...

Исходники на Visual Basic .NET
Кто-то читает книжки. Кто-то ищет информацию в Google... А кто-то набирается...

Литература и ресурсы по Visual Basic .NET
Литература по Visual Basic.NET 1. Виктор Зиборов "Visual Basic 2010 на...

195
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
18.08.2011, 22:45  [ТС] #2
Как получить размер папки?
Как получить размер папки?
Если узнать размер файла можно штатными средствами, то с папкой все обстоит немного иначе.
Даже сама операционная система "не знает" этого.
Но как же так? Если мы наводим мышь на какую-либо папку, то во всплывающей подсказке видим ее размер, бывает что точный, а бывает, что система сообщает "Размер папки более..."
И это неудивительно, потому что, когда мы наводим мышь на какую-либо большую папку, система "задумывается" на какое-то время. Что она делает?
Она перебирает все файлы в папке и ее вложенных подпапках и суммирует их общий "вес".
Нам ничего другого не остается, как следовать ее "примеру". Для получения размера нашей папки мы будем рекурсивно "пробегаться" по ее файлам и подкаталогам и складывать размер каждого нового файла с предыдущим:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Public Function РазмерПапки(ByVal ПутьКПапке As String) As Integer
        Dim ИтоговыйРазмер As Integer
        Dim ИнфоПапки As IO.DirectoryInfo = New IO.DirectoryInfo(ПутьКПапке)
        Try
            For Each Файл In ИнфоПапки.GetFiles()
                ИтоговыйРазмер += Файл.Length
            Next
            For Each Папка In ИнфоПапки.GetDirectories()
                ИтоговыйРазмер += РазмерПапки(Папка.FullName)
            Next
        Catch Ex As Exception
        End Try
        Return (ИтоговыйРазмер)
    End Function
Эта функция содержит один параметр ПутьКПапке - имя папки, размер которой необходимо получить.
Немаловажно здесь использование конструкции Try Catch End Try, поскольку в системе есть папки, доступ к которым закрыт, такие, как System Volume Information.
Функция возвращает значение типа Integer, не что иное, как размер папки в байтах. Советую в теле функции не манипулировать преобразованием байтов в килобайты или мегабайты (делением размера файла на 1024, например), поскольку это может привести к огромной погрешности в вычислениях, и чем больше файлов в папке, тем больше погрешность.
Если нужен размер в мегабайтах, то деление производим тогда, когда функция полностью отработала:

vb.net
1
MsgBox(РазмерПапки("C:\1") / 1024 / 1024)


Отправка почты с вложением с компьютера с русскоязычным именем
Отправка почты с вложением с компьютера с русскоязычным именем
Часто попадаются коды для отправки почты и очень часто пользователи сообщают об ошибке "Сбой при отправке почты"
Выяснения причин показывают, что большинство проблем возникало из-за содержания русских букв в имени компьютера. А что, если пользователь не хочет ничего менять?
Следующий код позволяет этого избежать:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        Dim o_Mess As Object, v_Conf As String
        o_Mess = CreateObject("CDO.Message")
        v_Conf = "http://schemas.microsoft.com/cdo/configuration/"
        o_Mess.BodyPart.CharSet = "Windows-1251"
        With o_Mess
            .To = "Кому отправляем, например, vasya@mail.ru"
            .From = "Отправитель, например, myaccount@mail.ru"
            .Subject = "Тема письма, например, Привет"
            .TextBody = "Текст письма, например, За последнее время участились случаи..."
            .AddAttachment("Вложение1, например, C:\Attachment.zip")
            .AddAttachment("Вложение2")
            .AddAttachment("Вложение3")
            With .Configuration.Fields
                .Item(v_Conf & "sendusing") = 2
                .Item(v_Conf & "smtpserver") = "Сервер SMTP, например, smtp.mail.ru"
                .Item(v_Conf & "smtpauthenticate") = 1
                .Item(v_Conf & "sendusername") = "например, myaccount@mail.ru"
                .Item(v_Conf & "sendpassword") = "например, 0123456789"
                .Item(v_Conf & "smtpserverport") = 465 
                .Item(v_Conf & "smtpusessl") = True
                .Item(v_Conf & "smtpconnectiontimeout") = 60
                .Update()
            End With
            .send()
        End With
Код нужно вставлять в событие кнопки или тело любой процедуры/функции.


Создать папку на FTP-сервере
Создать папку на FTP-сервере
В следующем коде на ftp-сервере TestFtp будет создана папка MyPhotos
Обращаю внимание, что имя создаваемой папки должно содержать только буквы латинского алфавита, цифры и символы подчеркивания "_"
Иначе будет сгенерировано исключение "Bad directory name"
vb.net
1
2
3
4
        Dim request As Net.FtpWebRequest = CType(Net.WebRequest.Create("ftp://testftp/MyPhoto"), Net.FtpWebRequest)
        request.Credentials = New Net.NetworkCredential("Логин", "Пароль")
        request.Method = Net.WebRequestMethods.Ftp.MakeDirectory
        Dim responce As Net.FtpWebResponse = CType(request.GetResponse(), Net.FtpWebResponse)


Определить размер файла на FTP-сервере
Следующий код позволяет узнать размер файла, лежащего на FTP-сервере:
vb.net
1
2
3
4
5
        Dim request As Net.FtpWebRequest = CType(Net.WebRequest.Create("ftp://ftp-сервер/файл.doc"), Net.FtpWebRequest)
        request.Credentials = New Net.NetworkCredential("Логин", "Пароль")
        request.Method = Net.WebRequestMethods.Ftp.GetFileSize
        Dim responce As Net.FtpWebResponse = CType(request.GetResponse(), Net.FtpWebResponse)
        MsgBox(responce.ContentLength / 1024 & " Kb")


Работа с ярлыками
Работа с ярлыками
Следующий пример демонстрирует получение свойств ярлыка. Для того, чтобы запустить код, необходимо сделать следующее:
В меню Visual Studio: Проект -> Добавить ссылку, перейти на вкладку COM, найти и выбрать из списка Windows Script Host Object Model
vb.net
1
2
3
4
5
6
7
8
9
10
        Dim ShortCut As IWshRuntimeLibrary.WshShortcut 'Объект для ярлыка
        Dim WshShell As New IWshRuntimeLibrary.WshShell 'Объект для оболочки
        ShortCut = CType(WshShell.CreateShortcut("Путь к ярлыку.lnk"), IWshRuntimeLibrary.WshShortcut)
        With ShortCut
            MsgBox("Ярлык ссылается на файл или папку: " & .TargetPath())
            MsgBox("Состояние окна: " & .WindowStyle)
            MsgBox("Описание: " & .Description)
            MsgBox("Рабочая папка: " & .WorkingDirectory)
            MsgBox("Иконка: " & .IconLocation)
        End With
Примечания:
Состояния окна возвращаются следующие:
1 - обычный размер окна
3 - развернутое на весь экран
7 - свернутое в значок
Если это ярлык на папку, то свойство "Рабочая папка" не возвращается.

В следующем примере мы программно создадим ярлык и зададим его свойства:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        Dim ShortCut As IWshRuntimeLibrary.WshShortcut 'Объект для ярлыка
        Dim WshShell As New IWshRuntimeLibrary.WshShell 'Объект для оболочки
        Dim DT As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) 'Путь к рабочему столу
 
        'Создаем ярлык
        ShortCut = CType(WshShell.CreateShortcut(DT & "\Пасьянс Паук.lnk"), IWshRuntimeLibrary.WshShortcut)
 
        'Изменяем свойства ярлыка и сохраняем его
        With ShortCut
            .TargetPath = "C:\Windows\System32\Spider.exe"  'Путь к исполняемому файлу
            .WindowStyle = 1 'Состояние окна
            .Description = "Этот ярлык создан программно" 'Описание ярлыка, которое появится во всплывающей подсказке
            .WorkingDirectory = "C:\Windows\System32"  'Рабочая папка"
            .IconLocation = "C:\Windows\System32\Spider.exe" & ", 0"   'Иконка для ярлыка. 0 - Первая в том файле, на который ссылаемся
            .Save()   'Сохраняем ярлык на рабочий стол
        End With
Примечания:
Иконку установить можно, например, из системной библиотеки shell32.dll, указав индекс иконки:
vb.net
1
.IconLocation = "F:\WINDOWS\system32\SHELL32.dll,178"


Перевод строки в массив байт и обратно
Перевод строки в массив байт
vb.net
1
2
        Dim Str As String = "Hello"
        Dim B() As Byte = System.Text.Encoding.Default.GetBytes(Str)
Из массива байтов в строку:
vb.net
1
2
3
        Dim A() As Byte = {72, 101, 108, 108, 111}
        Dim V As New System.Text.UTF8Encoding()
        MsgBox (V.GetString(A))


Перемещать форму не за заголовок
Перемещать форму не за заголовок
vb.net
1
2
3
4
5
6
7
8
9
10
11
    Dim pt As Point 'Переменная типа "точка"
 
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        pt = New Point(e.X, e.Y) 'запоминает положение курсора относительно формы
    End Sub
 
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then 'Проверяем, нажата ли левая кнопка мыши 
            Location = New Point(Location.X + e.X - pt.X, Location.Y + e.Y - pt.Y) 'Меняем координаты формы в зависимости от положения курсора с учетом переменной pt
        End If
    End Sub


Показывать индикатор скачивания файла из Интернета
Показывать индикатор скачивания файла из Интернета
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
    Dim WithEvents wc As New System.Net.WebClient 'Создаем событие, вызываемое WebClient
   
    Private Sub ButtonDownload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonDownload.Click
        wc.DownloadFileAsync(New Uri("откуда качаем"), "куда сохраняем")
    End Sub
   
    Private Sub wc_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.DownloadFileCompleted
        ProgressBar1.Value = 0 'Загрузки завершены
    End Sub
   
    Private Sub wc_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles wc.DownloadProgressChanged
        ProgressBar1.Value = e.ProgressPercentage 'Показываем прогресс скачивания
    End Sub


Как скачать файл из Интернета
Как скачать файл из Интернета
vb.net
1
        My.Computer.Network.DownloadFile("Откуда качаем", "Куда сохраняем", "Логин", "Пароль", False, 10000, True)
Если авторизация на сайте не нужна, логин, пароль и другие параметры можно опустить.
10000 - это тайм-аут отклика от сервера, по истечении которого, если файл не был скачан, процедура прерывается.
Последний параметр отвечает за то, будет ли уже имеющийся файл переписан одноименным новым.
Для обычного скачивания достаточно первых двух параметров (Ссылка, путь)

К сожалению, некоторые сайты не дают возможности воспользоваться таким методом, поэтому есть альтернативный вариант (API!)
vb.net
1
2
3
4
    Public Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Integer, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Integer, ByVal lpfnCB As Integer) As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call URLDownloadToFile(0, "http://www.сайт/INFO.txt", "c:\4dd56456.txt", 0, 0)
    End Sub
47
Ciberst
507 / 420 / 19
Регистрация: 16.12.2010
Сообщений: 939
18.08.2011, 23:14 #3
Из 10ричной системы счисления в 2,8,16 c.c.
из 10ричной системы счисления в 8ричную систему счисления
vb.net
1
Dim a As String = Convert.ToString(16, 8)
из 10ричной системы счисления в 2ичную систему счисления
vb.net
1
Dim b As String = Convert.ToString(16, 2)
из 10ричной системы счисления в 16ричную систему счисления
vb.net
1
Dim c As String = Convert.ToString(16, 16)
22
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
23.08.2011, 01:17  [ТС] #4
Работа с датами, временем

Как прибавить к текущей дате определенное количество часов, дней, месяцев и т.д.
vb.net
1
2
3
        Dim D As Date
        D = D.AddDays(50)
        MsgBox(D.ToLongDateString)
Либо так:

vb.net
1
2
        Dim D As Date = Now
        MsgBox(DateAdd(DateInterval.Day, 45, D))
Вычитание делается по той же схеме, но с отрицательными значениями.


Разница между двумя датами в днях, месяцах и т.д.
vb.net
1
2
3
        Dim D As Date = #7/23/2011#
        Dim N As Date = Now
        MsgBox(DateDiff(DateInterval.Day, D, N)) 'Разница в днях


Получить текущую дату и время
vb.net
1
        MsgBox(Now.ToLongDateString & ", " & Now.ToLongTimeString)


Узнать день недели
vb.net
1
        MsgBox(Format(D, "dddd"))


День недели в численном представлении
vb.net
1
        MsgBox(D.DayOfWeek)


Узнать, високосный год или нет
vb.net
1
        MsgBox(Date.IsLeapYear(Now.Year))


Установить в компьютере системное время и дату
vb.net
1
2
        TimeString = "23:04:10"
        DateString = "8/24/2011"


Подробнее о форматировании дат.
Мы можем использовать даты и время еще гибче, благодаря функции Format.
Например:

vb.net
1
2
3
        Dim D As Date = Now
        Dim FormatString As String
        MsgBox(Format(D, FormatString))
Основные значения FormatString:

%sСекунды, если спереди ноль - он не пишется
fffМилисекунды
ssСекунды, всегда двузначное число
%mМинуты, если спереди ноль - он не пишется
mmМинуты, всегда двузначное число
%hАналогично
hhс часами (представление от 0 до 12)
HHс часами (Представление от0 до 24)
%MАналогично
MMс месяцами
dddДень недели, в сокращенном виде, например, Пн
ddddТо же, но слово целиком, например, понедельник
MMMМесяц, в сокращенном виде, например, янв
MMMMТо же, но в полном
%yГод, в сокращенном виде, 2 последние цифры, если предпоследняя не 0 и одна в противном случае
yyГод, 2 цифры в любом случае, например, 1996 год - 96
yyyyГод целиком

Исходя из этого, легко составлять свои строки для вывода информации:
dd-MM-yyyy
Или
vb.net
1
2
        Dim D As Date = Now
        MsgBox(Format(D, "Сегодня dd -е число, год yyyy, а день недели - dddd, а месяц -  MMMM"))
Обращаю внимание на регистр букв, т.е. если написать не dd, а DD или Dd, то формат не будет распознан
44
gitarillo
728 / 528 / 45
Регистрация: 17.06.2010
Сообщений: 1,027
Записей в блоге: 1
24.08.2011, 14:09 #5
Работа с базами данных на примере Access.

Пусть есть база данных БД.mdb которая лежит в папке Debug или Release. В ней создана таблица с именем Таблица1. Первоначально структура такая:

КодФамилияИмяВозрастНациональность
1ИвановСергей35Русский
2ПетровАлександр53Русский
3ЛиЧонг40Китаец

Загрузка таблицы в DataGridView

На форме DataGridView и кнопка.
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim Con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & My.Application.Info.DirectoryPath & "\БД.mdb") ' Переменная для подключения базы
    Dim SqlCom As OleDb.OleDbCommand ' Переменная для Sql запросов
    Dim DT As New Data.DataTable ' Таблица для хранения результатов запроса
    Dim DA As OleDb.OleDbDataAdapter ' Адаптер для заполнения таблицы после запроса
 
Sub LoadAll() 'Процедура чтения всей таблицы из базы 
        DT.Clear() 'Очищаем таблицу
        SqlCom = New OleDb.OleDbCommand("SELECT * FROM [Таблица1]", Con) ' Указываем строку запроса и привязываем к соединению
        Con.Open() ' Открываем соединение
        SqlCom.ExecuteNonQuery() 'Выполняем запрос
        DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса
        DA.Fill(DT) ' Заполняем таблицу результатми
        Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных
        Con.Close() ' Закрываем соединение
    End Sub


Добавление в таблицу новой записи

vb.net
1
2
3
4
5
6
Sub AddStr()
        SqlCom = New OleDb.OleDbCommand("INSERT INTO [Таблица1] ([Фамилия], [Имя], [Возраст], [Национальность]) VALUES ('Сидоров', 'Алексей', 46, 'Русский')", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        Con.Close()
    End Sub
В результате в таблицу базы добавится новая строка. Проверить можно новой загрузкой в грид


Обновление существующей записи

vb.net
1
2
3
4
5
6
Sub UpdateStr(ByVal KeyValue As Integer)
        SqlCom = New OleDb.OleDbCommand("UPDATE [Таблица1] SET [Фамилия]='Воронцов' WHERE (Код=" & KeyValue & ")", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        Con.Close()
    End Sub
Прошу обратить внимание на переменную KeyValue . В качестве нее можно взять любое поле, но убедитесь что его значение нигде в таблице не повторяется, иначе обновление применится ко всем строкам, имеющих это значение. в моем случае это Код, которое является ключевым.


Удаление записи из базы

vb.net
1
2
3
4
5
6
Sub DeleteStr(ByVal KeyValue As Integer)
        SqlCom = New OleDb.OleDbCommand("DELETE FROM [Таблица1]  WHERE (Код=" & KeyValue & ")", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        Con.Close()
    End Sub
56
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
27.08.2011, 09:10  [ТС] #6
Работа с файлами

Как записать в файл все содержимое многострочного текстового поля
Как записать в файл все содержимое многострочного текстового поля

vb.net
1
        My.Computer.FileSystem.WriteAllText("Path", TextBox1.Text, True)
Третий параметр указывает на то, разрешается ли дописывать в файл. При значении False файл будет переписан заново.
Четвертый параметр (здесь не указан) - кодировка (например, System.Text.Encoding.Default)
При такой записи этот параметр необязателен, если пишется информация в обычной кодировке.

Еще вариант:

vb.net
1
        IO.File.WriteAllText("Path", TextBox1.Text)
Здесь третий параметр (не указан) - кодировка, как и в первом случае.
Если нужна дозапись во втором способе:

vb.net
1
        IO.File.AppendAllText("Path.txt", TextBox1.Text, System.Text.Encoding.Default)
Кодировку указывать очень даже желательно.

Еще один из способов:

vb.net
1
2
3
        FileOpen(1, "Path", OpenMode.Output)
        Print(1, TextBox1.Text)
        FileClose(1)
Здорово похож на запись файлов из VB 6.0
Это вовсе не означает, что он хуже остальных.


Как прочитать из файла все строки
Как прочитать из файла все строки

vb.net
1
        TextBox1.Text = My.Computer.FileSystem.ReadAllText("Path", System.Text.Encoding.Default)
Всего 2 параметра - путь к файлу и кодировка. Хоть кодировка в данном случае и не обязательный параметр, боюсь, что без ее указания для
чтения кирилицы в большинстве случаев возникнут проблемы.

Другой способ:

vb.net
1
        TextBox1.Text = IO.File.ReadAllText("Path", System.Text.Encoding.Default)
Здесь так же все по аналогии

Способ "из шестого" рассматривать не буду, потому, что в нем чтение "разом" не предусмотрено.


Как записать в файл все элементы массива.
Как записать в файл все элементы массива.

Пусть у нас имеется одномерный массив Massiv

vb.net
1
        IO.File.WriteAllLines("Path", Massiv)
Если необходимо записать все элементы списка (ListBox) в файл, то предварительно скопируем их в массив, а потом запишем в файл:

vb.net
1
2
3
        Dim Massiv(ListBox1.Items.Count - 1) As String 'Создаем массив, соразмерный списку
        ListBox1.Items.CopyTo(Massiv, 0) 'Копируем в него элементы
        IO.File.WriteAllLines("Path", Massiv) 'Записываем


Прочитать все строки из файла в массив
Прочитать все строки из файла в массив

vb.net
1
        Dim Massiv() As String = IO.File.ReadAllLines("Path.txt", System.Text.Encoding.Default)
В список:

vb.net
1
        ListBox1.Items.AddRange(IO.File.ReadAllLines("Path.txt", System.Text.Encoding.Default))
Построчное считывание и запись с My.Computer.FileSystem и FileOpen рассматривать не будем.
Пожалуй, единственное преимущество этих способов перед описанными выше - это бОльшая гибкость в том плане, что строки можно изменять уже при считывании или считывать не все, а соответствующие, например, каким-то определенным условиям. Я бы даже сказал, что способ с My.Computer.FileSystem здесь и вовсе не годится.


Как записать в файл массив байт
Как записать в файл массив байт

vb.net
1
2
        Dim B() As Byte = {123, 4, 11}
        My.Computer.FileSystem.WriteAllBytes("Path", B, False)
Третий параметр - дозапись - является обязательным.

vb.net
1
        IO.File.WriteAllBytes("Path", B)
Здесь всего два параметра

Старый способ:

vb.net
1
2
3
        FileOpen(1, "Path", OpenMode.Binary)
        FilePut(1, B)
        FileClose(1)


Прочитать в переменную все байты из файла
Прочитать в переменную все байты из файла

Раз:
vb.net
1
        B = My.Computer.FileSystem.ReadAllBytes("Path")
Два:
vb.net
1
        B = IO.File.ReadAllBytes("Path")
Способ "из шестого" уступает в удобстве, поэтому здесь не рассматривается.


Как сохранить файл из ресурсов на диск
Как сохранить файл из ресурсов на диск

Предыдущие способы это предусматривают, однако есть небольшие нюансы.
От Visual Studio ничего не скроешь, и поэтому, если у нас в ресурсах, например, Wav-файл, картинка, Html-страница, текстовый документ и
прочие "известные" форматы, то как есть сохранить их не получится.
Лечится путем изменения расширения этих файлов или вовсе путем его удаления. Исполняемые файлы, архивы, mp3-файлы и все остальные
сохраняются без проблем:

vb.net
1
        My.Computer.FileSystem.WriteAllBytes("Path", My.Resources.Blade, False)


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

vb.net
1
        IO.File.Copy("Path", "Path2")


Как удалить файл
Как удалить файл

vb.net
1
        Kill("Path")
или
vb.net
1
        IO.File.Delete("Path")
Отличие второго способа в том, что при отсутствии файла исключение не генерируется.


Узнать, существует ли файл
Узнать, существует ли файл

vb.net
1
        MsgBox(IO.File.Exists("Path"))


Переместить файл из одного места в другое
Переместить файл из одного места в другое

vb.net
1
        IO.File.Move("Path", "Path2")
Отмечу, что сие действие расценивается так же как и переименование.


Переименование файла
Переименование файла

vb.net
1
        My.Computer.FileSystem.RenameFile("Path", "Path2")


Заменить файл другим и сделать его резервную копию
Заменить файл другим и сделать его резервную копию

vb.net
1
        IO.File.Replace("Этим будем заменять", "Этот будем заменять", "Это бэкап замененного файла")


Применить атрибуты к файлу
Применить атрибуты к файлу

vb.net
1
        IO.File.SetAttributes("Path", IO.FileAttributes.Hidden + IO.FileAttributes.System)
В данном случае мы делаем файл скрытым + системным

Получить атрибуты файла можно так:

vb.net
1
        MsgBox(IO.File.GetAttributes("Path"))
Но этот способ возвращает численные значения и их суммы, поэтому разбор этого вопроса - вообще отдельный вопрос и тут мы его
рассматривать не будем.


Как получить расширение файла
Как получить расширение файла

vb.net
1
        MsgBox(IO.Path.GetExtension(Application.ExecutablePath))


Как получить имя файла без полного пути
Как получить имя файла без полного пути

vb.net
1
        MsgBox(IO.Path.GetFileName(Application.ExecutablePath))


Как получить имя файла без расширения
Как получить имя файла без расширения

vb.net
1
        MsgBox(IO.Path.GetFileNameWithoutExtension(Application.ExecutablePath))


Как получить полное имя файла
Как получить полное имя файла

vb.net
1
        MsgBox(IO.Path.GetFullPath(Application.ExecutablePath))


Как узнать имя корневого каталога для файла
Как узнать имя корневого каталога для файла

vb.net
1
        MsgBox(IO.Path.GetPathRoot(Application.ExecutablePath))


Как узнать, есть ли у файла расширение
Как узнать, есть ли у файла расширение

vb.net
1
        MsgBox(IO.Path.HasExtension(Application.ExecutablePath))


Получить дату создания файла
Получить дату создания файла

vb.net
1
        MsgBox(IO.File.GetCreationTime("Path"))
Возвращаемое значение имеет формат типа Date. Как с ними работать, здесь уже рассматривалось.
Так же можно получить и другие сведения подобного характера о файле:

GetCreationTime
GetCreationTimeUtc
GetLastAccessTime
GetLastAccessTimeUtc
GetLastWriteTime
GetLastWriteTimeUtc
62
Ciberst
507 / 420 / 19
Регистрация: 16.12.2010
Сообщений: 939
29.08.2011, 22:15 #7
Как получить все ключи реестра и занести их в listview ?

разместим на форме Listview1
изменим свойства таким образом:
.view=Details
добавим три колонки

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 Public Sub allKeys(ByVal key As Microsoft.Win32.RegistryKey, ByVal path As String, ByVal listview As ListView, ByVal inAll As Boolean)
        Dim MySK As Microsoft.Win32.RegistryKey
        Try
            MySK = key.OpenSubKey(path, True)
            If inAll = True Then
                For Each a In MySK.GetSubKeyNames
                    Application.DoEvents()
                    allKeys(key, path & "\" & a, listview, True)
                Next
            End If
            For I As Integer = 0 To MySK.ValueCount - 1
                Try
                    Dim a(2) As String
                    a(0) = MySK.GetValueNames(I)
                    a(1) = MySK.GetValue(MySK.GetValueNames(I))
                    a(2) = MySK.Name
                    Dim b As New ListViewItem(a)
                    listview.Items.Add(b)
                Catch ex As Exception
                End Try
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
Как использовать ?

вызвать код ниже в кнопке
vb.net
1
allKeys(Microsoft.Win32.Registry.LocalMachine, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", ListView1, False)
или так, если хотим искать в подкаталогах, в данном случае, Winlogon
vb.net
1
allKeys(Microsoft.Win32.Registry.LocalMachine, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", ListView1, true)



Внимание!!! Если Вы не знаете, что такое реестр или не знаете для чего он, то код предоставленный выше запрещается использоваться Вам по кодексу Сис.админов. Если Вы все же имеете представление о реестре и работали с ним, то будьте аккуратны, любое неверное движение может привести к неработоспособности компьютера или не правильной работе ЭВМ или ПО.
15
Darth Coder
281 / 262 / 107
Регистрация: 10.06.2011
Сообщений: 696
30.08.2011, 17:14 #8
Как разрешить запуск только одного экземпляра программы
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
'Если есть такой процесс то закрываем прогу
End
End If
Либо в свойствах проекта:
Visual Basic .NET FAQ. Готовые решения, полезные коды


23
gitarillo
728 / 528 / 45
Регистрация: 17.06.2010
Сообщений: 1,027
Записей в блоге: 1
31.08.2011, 13:22 #9
В VB.NET доступ к основным математическим функциям осуществляется с помощью класса Math
Поставив после имени класса точку, вы сможете увидеть перечисление всех функций, констант, методов и вполне ими пользоваться.
Рассмотрим несколько примеров использования:

Тригонометрические функции

Рассмотри на примере одной функции. Sin
Удобно искать значение по значению углу в градусах, по умолчанию в функцию нужно передавать значение в радианах, а перегрузок у функции нет. Мы это и будем делать, но вводить значение будем в градусах, и с помощью простенькой самописной функции переводить в радианы.
vb.net
1
2
3
4
5
6
7
8
9
Public Class Form1
    Const Pi As Double = Math.PI
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(Math.Sin(GetRadian(30))) ' Ищем синус 30 градусов, но переведя его в радианы.
    End Sub
    Function GetRadian(ByVal Gradus As Double) As Double ' Функция перевода градусов в радианы
        Return (Gradus * Pi) / 180
    End Function
End Class


Поиск максимума и минимума из двух значений

Если нужно найти максисмум или минимум из двух чисел, то есть функции Max и Min. Эти функции имеют перегрузку под разный тип сравниваемых переменных.
vb.net
1
2
MsgBox(Math.Max(110, -50))
MsgBox(Math.Min(110, -50))


Основные математические функции
ФУНКЦИЯРЕЗУЛЬТАТСМЫСЛ
Math.Abs(-8)8Абсолютная величина (модуль) числа
Math.Sqrt (25)5Корень квадратный
Math.Round (17.952)18Округление до целых
Math.Round(17.48)17 
Math.Round(51.23708, 2)51,24Округление до 2 знаков после запятой
Math.Ceiling (45.23)46«Потолок» - ближайшее целое число, большее или равное аргументу
Math.Ceiling(-45.23)-45 
Math.Floor (8.92)8«Пол» - ближайшее целое число, меньшее или равное аргументу
Math.Floor(-8.92)-9 
Fix (9.47)9Целая часть числа (дробная часть отбрасывается)
Fix(-9.47)-9 
Math.Sign (300)1Sign для всех положительных чисел равен 1
Math.Sign(0)0Sign для нуля равен 0
Math.Sign(-480)-1Sign для всех отрицательных чисел равен -1
Math.Max (29, 44)44Максимальное из двух чисел
Math.Min (29, 44)29Минимальное из двух чисел
Math.PI3,14159265358979Число ?
Math.E2,71828182845905Число e - основание натурального логарифма
Math.Exp (2)7,38905609893065e2 - число e в заданной степени
Math.Log (35)3,55534806148941Натуральный логарифм ln 35
Math.Log10 (1000)3Десятичный логарифм log101000
Rnd0,7055475Случайное число из диапазона (0 - 1)


Перечислять все функции и константы не вижу смысла. Думаю их использование не вызовет затруднений.
21
Миниатюры
Visual Basic .NET FAQ. Готовые решения, полезные коды  
Ciberst
507 / 420 / 19
Регистрация: 16.12.2010
Сообщений: 939
31.08.2011, 19:54 #10
Как организовать поиск файлов без рекурсии?
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
               Dim x As List(Of String) = Search("G:\Itunes", "*.jpg")
    End Sub
 Private Function Search(ByVal path As String, ByVal mask As String) As List(Of String)
        Dim b As New List(Of String)
        Dim a As New List(Of String)
        Dim log As Integer = 0
        b.AddRange(IO.Directory.GetFiles(path, mask))
        a.AddRange(IO.Directory.GetDirectories(path))
        Do While a.Count <> 0
            'Application.DoEvents()
            'Me.Text = a.Count
            Try
                b.AddRange(IO.Directory.GetFiles(a(0), mask))
            Catch
                log += 1
            End Try
            Try
                a.AddRange(IO.Directory.GetDirectories(a(0)))
            Catch
                log += 1
            End Try
 
            a.RemoveAt(0)
        Loop
        Return b
    End Function
19
gitarillo
728 / 528 / 45
Регистрация: 17.06.2010
Сообщений: 1,027
Записей в блоге: 1
01.09.2011, 12:22 #11
Использование класса StringBuilder
Для конкатенации строк в .Net присутсвует очень полезный класс StringBuilder из пространнстваимен System.Text. Операции объединения, замены, вставки и т.д. с помощью этого класса выполняются намного быстрее ранее используемых методов. Особенно рентабельно его использовать при формировании большой строки из множества маленьких в цикле.
Рассмотрим пример пользования классом.

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

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim MyText As New System.Text.StringBuilder ' Создаем экземпляр класса
        ' Простое формирование текста из других строк
        MyText.Append("Я").Append(" использую").Append(" класс").Append(" StringBuilder.").AppendLine.Append("Потому что он намного быстрее &") ' создаем строку из подстрок
       ' Метод AppendLine аналог константы vbNewLine 
 MsgBox(MyText.ToString) ' Выводим полученную строку
        ' Удаление части строки (в данном члучае с конца)
        Dim Esize As Integer = "Потому что он намного быстрее &".Length
        MyText.Remove(MyText.Length - Esize, Esize)
        MsgBox(MyText.ToString)
        ' Вставка текста в указанное место строки
        MyText.Insert(1, " давно")
        MsgBox(MyText.ToString)
        ' Замена указанной строки
        MyText.Replace("давно", "давненько")
        MsgBox(MyText.ToString)
    End Sub


Особенно класс пригодится для построения строки SQL-запросов большой длины по условию, а также объемного текста.

Печать
Вопрос слабо освещен в книжках и на форумах по поводу вывода теста и рисунка на принтер через предварительный просмотр. Рассмотрим простой вариант вывода текста и изображение в окно предпросмотра печати и печати оттуда.
Вывод в окно предпросмотра печати и печать

На форме только кнопа.
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Class Form1
    Private WithEvents DOC As Printing.PrintDocument ' Создаем объект для печати документа с событием
    Dim print_text As String ' Текст для вывода на печать
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim prew As New PrintPreviewDialog ' Создаем окно диалога предпросмотра печати
        DOC = New Printing.PrintDocument
        print_text = "Текст" ' Присваиваем текстовой перемнной значение
        prew.Document = DOC ' Инициализируем документ, который попадет в окно просмотра
        If prew.ShowDialog = System.Windows.Forms.DialogResult.Cancel Then Exit Sub
    End Sub
    Private Sub DOC_print(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs) Handles DOC.PrintPage
        ' Само сабытие вывода информации на страницу предпросмотра
        e.Graphics.DrawString(print_text, New System.Drawing.Font("ARIAL", 20, FontStyle.Bold), Brushes.Black, 300, 100) ' Выводим на страницу текст
        e.Graphics.FillPie(Brushes.Red, New Rectangle(200, 200, 500, 500), 0, 270) ' Выводим рисунок
        e.HasMorePages = False ' Дополнительную станицу не показываем
    End Sub
End Class

Разумеется, это самый простой вариант.
15
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
01.09.2011, 15:39  [ТС] #12
Работа с каталогами

Как создать папку в указанном месте
Как создать папку в указанном месте

vb.net
1
        IO.Directory.CreateDirectory("C:\Dir")
Либо
vb.net
1
        MkDir("C:\Dir")
Второй способ отличается более низкой скоростью работы, к тому же, при наличии создаваемой папки, генерируется исключение.


Как удалить папку, даже если она не пуста
Как удалить папку, даже если она не пуста

vb.net
1
        IO.Directory.Delete("C:\Dir", True)
Второй параметр указывает на разрешение удалить все файлы и каталоги
С параметром False в случае наличия в каталоге по крайней мере одного файла или папки будет сгенерировано исключение


Узнать, существует ли папка
Узнать, существует ли папка

vb.net
1
2
3
        If IO.Directory.Exists("C:\Dir") Then
            MsgBox("Directory Exists")
        End If


Получить из папки все директории
Получить из папки все директории

vb.net
1
        Dim Folders() As String = IO.Directory.GetDirectories("C:\Dir", "*", IO.SearchOption.TopDirectoryOnly)
2 последних параметра в функции являются необязательными, первый из них задает маску поиска.

Пример маски Что будет найдено
*Ищет папки, в имени которых могут содержаться любые допустимые символы
Новая папка*Ищет папки, имя которых начинается с "Новая папка", это может быть "Новая папка", "Новая папка 2", "Новая папка, созданная 27.03.2011 г."
*2*Ищет папки, в имени которых содержится цифра "2", и неважно, вначале, в конце или середине
*пкаИщет папки, имя которых заканчивается на "пка", с такой маской мы найдем "Новая папка", но не "Новая папка 2"
?????Ищет папки, в имени которых содержится 5 любых допустимых символов
???к?Ищет папки, в имени которых содержится 5 символов при обязательном условии, что четвертый из них - "к"

По умолчанию возвращаются все папки (любое имя).

Второй параметр - глубина поиска, с IO.SearchOption.TopDirectoryOnly мы ищем папки только в текущей директории
тогда как с IO.SearchOption.AllDirectories поиск будет осуществлен и во всех вложенных подкаталогах.

По умолчанию поиск производится только в текущей папке.


Как получить все файлы, а также папки в директории
Как получить все файлы, а также папки в директории

vb.net
1
        ListBox1.Items.AddRange(IO.Directory.GetFileSystemEntries("C:\Windows\System32"))
Возвращаются папки и файлы из папки System32, но не ее подкаталогов.


Получить все файлы из директории
Получить все файлы из директории

vb.net
1
        Dim Files() As String = IO.Directory.GetFiles("C:\Dir", "*.txt", IO.SearchOption.TopDirectoryOnly)
Здесь все по аналогии с предыдущим примером, в том числе и работа с масками, с тем лишь различием, что у файлов имя включает также еще и расширение, поэтому можно легко и удобно осуществлять поиск по типу файлов.


Как узнать корневой раздел папки
Как узнать корневой раздел папки

vb.net
1
        MsgBox(IO.Directory.GetDirectoryRoot("C:\Windows\System32"))


Узнать время последнего обращения к папке
Узнать время последнего обращения к папке

vb.net
1
        MsgBox(IO.Directory.GetLastAccessTime("C:\Windows\System32"))


Время последней записи в каталог
Время последней записи в каталог

vb.net
1
        MsgBox(IO.Directory.GetLastWriteTime("C:\Windows\System32"))


Узнать имя родительского каталога
Узнать имя родительского каталога

vb.net
1
        MsgBox(IO.Directory.GetParent("C:\Windows\System32").FullName)
Обращаю внимание, что в этом случае необходимо указывать определенное свойство, нас интересует FullName.
Если нужен не полный путь, а лишь имя родительского каталога, то выбираем свойство Name
На других свойствах заострять внимание не будем.


Как переместить каталог из одного места в другое
Как переместить каталог из одного места в другое

vb.net
1
        IO.Directory.Move("C:\Dir", "C:\Dir2")
Этот метод является ничем иным, как и переименованием


Установить дату создания для каталога
Установить дату создания для каталога

vb.net
1
2
        Dim D As Date = #12/31/2000#
        IO.Directory.SetCreationTime("C:\Dir", D)
Можно указать и время


Установить дату последнего доступа к каталогу
Установить дату последнего доступа к каталогу

vb.net
1
2
        Dim D As Date = #5/20/2050#
        IO.Directory.SetLastAccessTime("C:\Dir", D)


Установить текущий каталог для приложения

Установить текущий каталог для приложения

vb.net
1
        IO.Directory.SetCurrentDirectory("C:\Dir")
Теперь наша программа без указания явного пути будет работать с файлами и папками именно в этом каталоге. Например, записываем какой-то текст в файл:
vb.net
1
        IO.File.WriteAllText("TestFile.txt", "Content")
Мы привыкли, что такие файлы пишутся в одной папке с нашей программой. Однако в этот раз все наши файлы без точного указания пути будут расположены в папке "C:\Dir"
Поэтому следует соблюдать осторожность.


Установить для каталога определенные атрибуты

Установить для каталога определенные атрибуты

vb.net
1
2
        Dim DirInfo As New IO.DirectoryInfo("C:\Dir")
        DirInfo.Attributes = IO.FileAttributes.Hidden
Как и в примере с файлами, узнать атрибут можно так:

vb.net
1
2
        Dim DirInfo As New IO.DirectoryInfo("C:\Dir")
        MsgBox(DirInfo.Attributes)
Атрибуты возвращаются в численном выражении, поэтому как и в примере с файлами нужна функция преобразования чисел в
удобочитаемый для пользователя формат. Обсуждать здесь это не будем.

Имеется неплохая возможность комбинировать атрибуты, например, делаем папку скрытой и системной:

vb.net
1
        DirInfo.Attributes = IO.FileAttributes.Hidden + IO.FileAttributes.System


Создать в директории несколько вложенных друг в друга поддиректорий
Создать в директории несколько вложенных друг в друга поддиректорий

vb.net
1
2
        Dim DirInfo As New IO.DirectoryInfo("C:\Dir")
        DirInfo.CreateSubdirectory("Dir1\Dir2\Dir3")


Узнать имя папки без полного пути
Узнать имя папки без полного пути

vb.net
1
2
        Dim DirInfo As New IO.DirectoryInfo("C:\Dir")
        MsgBox(DirInfo.Name)
Заметки:
Класс DirectoryInfo тоже позволяет создавать каталоги, удалять, осуществлять поиск файлов и папок и все то, что уже было рассмотрено.


Скопировать каталог
Скопировать каталог

vb.net
1
        My.Computer.FileSystem.CopyDirectory("C:\Setup", "F:\Setup", True)
Булевый параметр означает перезапись
26
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
03.09.2011, 22:10  [ТС] #13
Работа с дисками

Получить имена всех дисков в системе
Получить имена всех дисков в системе

vb.net
1
2
3
4
        Dim D() As IO.DriveInfo = IO.DriveInfo.GetDrives
        For Each DI As IO.DriveInfo In D
            MsgBox(DI.Name)
        Next
Если нужно получить не все диски, а лишь определенного типа, то нужно добавить условие.
Например, в следующем примере мы получаем имена только жестких дисков:

vb.net
1
2
3
4
5
6
        Dim D() As IO.DriveInfo = IO.DriveInfo.GetDrives
        For Each DI As IO.DriveInfo In D
            If DI.DriveType = IO.DriveType.Fixed Then
                MsgBox(DI.Name)
            End If
        Next


Узнать объем свободного места на диске в мегабайтах
Узнать объем свободного места на диске в мегабайтах

vb.net
1
2
        Dim DI As New IO.DriveInfo("C:\")
        MsgBox(DI.TotalFreeSpace / 1024 \ 1024)


Узнать имя файловой системы на диске
Узнать имя файловой системы на диске

vb.net
1
2
        Dim DI As New IO.DriveInfo("C:\")
        MsgBox(DI.DriveFormat)


Узнать тип диска
Узнать тип диска

vb.net
1
2
        Dim DI As New IO.DriveInfo("C:\")
        MsgBox(DI.DriveType)
Значение возвращается в численном виде согласно таблицы:

0Неизвестный тип диска
1Диск, не содержащий корневого каталога
2Съемный диск, куда входит и диск 3,5А
3Жесткий диск
4Сетевой диск
5Cd/DVD - оптичнский диск
6Диск ОЗУ


Узнать, доступен ли диск
vb.net
1
2
        Dim DI As New IO.DriveInfo("C:\")
        MsgBox(DI.IsReady)


Получить имя диска
Получить имя диска

vb.net
1
2
        Dim DI As New IO.DriveInfo("C:\")
        MsgBox(DI.Name)
Естественно, в данном случае это не имеет смысла, но это необходимо когда работа идет не с одним диском, а с несколькими, например, перебор в цикле, как в первом примере


Узнать полный объем диска
Узнать полный объем диска

vb.net
1
2
        Dim DI As New IO.DriveInfo("C:\")
        MsgBox(DI.TotalSize / 1024 \ 1024)
Объем занятого пространства диска подобным образом узнать нельзя, поэтому получаем его, вычитая свободное место из общего пространства:

vb.net
1
2
        Dim DI As New IO.DriveInfo("C:\")
        MsgBox((DI.TotalSize - DI.AvailableFreeSpace) / 1024 \ 1024)


Узнать или назначить метку тома
Узнать или назначить метку тома

vb.net
1
2
        Dim DI As New IO.DriveInfo("D:\")
        MsgBox((DI.VolumeLabel))
Назначение:

vb.net
1
        DI.VolumeLabel = "Проекты"
20
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
10.09.2011, 01:17  [ТС] #14
Динамическое создание контроллов

Как программно создать объект
Как программно создать объект

vb.net
1
2
        Dim Tb As New TextBox
        Me.Controls.Add(Tb)


Как задать свойства этому объекту
Как задать свойства этому объекту
Например, создаем новую кнопку с текстом "Кнопка"
Способ 1:

vb.net
1
2
3
4
5
6
7
        Dim Btn As New Button
        With Btn
            .Top = 10
            .Left = 20
            .Text = "Кнопка"
        End With
        Me.Controls.Add(Btn)
Способ 2:

vb.net
1
2
        Dim Btn As New Button With {.Top = 10, .Left = 20, .Text = "Кнопка"}
        Me.Controls.Add(Btn)
Замечу, что все свойства, что мы не указали явно, будут по умолчанию, например, цвет шрифта, ширина, высота кнопки и т.д.


Как заставить объект "что-то уметь делать"
Как заставить объект "что-то уметь делать"
Мы должны задать соответствие нашего контролла какому-либо событию.
Для этого создадим простую процедуру:

vb.net
1
2
3
    Sub Btn_Click()
        MsgBox("Вы щелкнули по созданной Вами кнопке")
    End Sub
Она может называться не Btn_Click, а как угодно, но рекомендуется давать процедурам внятные имена, это является хорошим тоном в
программировании. Теперь в процедуре создания кнопки мы добавляем код:

vb.net
1
        AddHandler Btn.Click, AddressOf Btn_Click
Получится следующее:

vb.net
1
2
3
        Dim Btn As New Button With {.Top = 10, .Left = 20, .Text = "Кнопка"}
        AddHandler Btn.Click, AddressOf Btn_Click
        Me.Controls.Add(Btn)
2 последние строчки могут быть в любом порядке
После Btn. нам будут предложены все уже известные нам события, характерные для кнопки. Почему для кнопки? Потому что мы сами
так объявили эти 3 произвольные буквы. Объяви мы их как TextBox, получили бы события, характерные лишь для текстового поля.


Как узнать, в каком объекте было вызвано событие
Как узнать, в каком объекте было вызвано событие
Если мы создаем не один, а несколько объектов, например, кнопок, то невозможно описать всевозможные процедуры. Да это и не
нужно. Нам просто достаточно добавить нужные параметры в процедуру:

vb.net
1
Sub Btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
vb.net
1
2
3
4
5
6
7
8
9
10
11
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Static Ind As Integer 'Статическая переменная-счетчик
        Dim Btn As New Button With {.Top = Ind * 25, .Text = "Кнопка " & Ind}
        AddHandler Btn.Click, AddressOf Btn_Click 'Привязываем кнопку к событию
        Me.Controls.Add(Btn) 'Показываем кнопку
        Ind += 1 'Увеличиваем счетчик на единицу
    End Sub
 
    Sub Btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        MsgBox("Вы щелкнули по кнопке " & sender.Text & "; Top = " & sender.Top & "; Left = " & sender.Left)
    End Sub
sender - это и есть наша кнопка. Разные кнопки - разный sender. После точки Студия не предложит нам вариантов, так что пишем
сами.
Второй параметр e дает информацию о том, ЧТО вызвало событие. В таком примере толку от него мало.


Как удалить обработчик события с объекта
Как удалить обработчик события с объекта

Немного усложним наш пример. Объявим глобально коллекцию кнопок:

vb.net
1
    Dim Btn As New List(Of Button)
Теперь процедура создания несколько изменилась:

vb.net
1
2
3
4
5
6
        Static Ind As Integer 'Статическая переменная-счетчик
        Dim _Btn As New Button With {.Top = Ind * 25, .Text = "Кнопка " & Ind}
        AddHandler _Btn.Click, AddressOf Btn_Click 'Привязываем кнопку к событию
        Me.Controls.Add(_Btn) 'Показываем кнопку
        Ind += 1 'Увеличиваем счетчик на единицу
        Btn.Add(_Btn) 'Добавляем кнопку в коллекцию
Допустим, нам необходимо, чтобы событие в третьей кнопке более не обрабатывалось. Это сделает код:

vb.net
1
        RemoveHandler Btn(2).Click, AddressOf Btn_Click
С таким же успехом мы можем переопределить событие на другое

vb.net
1
2
        RemoveHandler Btn(2).Click, AddressOf Btn_Click
        AddHandler Btn(2).Click, AddressOf Other_Click
Если не удалить первый обработчик, то будут выполняться ОБЕ процедуры.


Как создать форму, аналогичную текущей со всеми свойствами.
Как создать форму, аналогичную текущей со всеми свойствами.

Задача решается аналогично

vb.net
1
2
        Dim NewForm As New Form1
        NewForm.ShowDialog()
Аналогично задаются / меняются свойства, события и т.д,. Создание подобных форм можно реализовать, например, в ICQ-клиенте,
когда у каждого написавшего сообщение пользователя открывается свое окно, с его сообщениями и другой его персональной
информацией.

Я хотел бы подчеркнуть, что хоть мы и пишем

vb.net
1
        Dim NewForm As New Form1
Это вовсе не означает, что у новой формы будет имя "NewForm"
У ней, как и у всех последующих будут все свойства первой формы, в том числе и имя. Поэтому имя всех таких форм - "Form1", и
идентификация формы по ее имени невозможна.

Другое дело, когда мы создаем экземпляр Кнопки "С нуля". У такой кнопки нет ни имени, ни текста на ней. Поэтому все такие
экземпляры - безымянны. Если бы мы аналогично создавали и форму, у ней бы так же не было имени.
Создать "одним махом" экземпляр (копию) уже имеющейся кнопки нельзя (а формы - можно)


Итак, мы для идентификации объектов можем использовать их имена (Вспоминаем sender)
Я бы хотел заострить внимание еще на одном свойстве контроллов, оно называется Tag.
Его незаслуженно редко используют. Поэтому это еще один козырь, который мы можем использовать не только для идентификации
контроллов, но и для хранения практически любой строковой информации.

Создавать новые контроллы мы можем, разумеется, не только на форме, а и на других объектах.
Обращаю внимание, что координаты нового контролла будут рассчитываться не относительно формы, а относительно родительского
объекта, например, если мы разместим свежеиспеченную кнопку с координатами {0, 0} на PictureBox, расположенного в центре формы,
то контролл будет находиться в верхнем левом углу PictureBox, но не формы.

И еще один пример создания кнопки с событием
И еще один пример создания кнопки с событием
Используем WihtEvents вместо AddHandler:

vb.net
1
2
3
4
5
6
7
8
9
10
11
    Dim WithEvents MyEvents As New Button
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Btn As New Button With {.Text = "Button"}
        MyEvents = Btn
        Me.Controls.Add(Btn)
    End Sub
 
    Sub MyNewButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyEvents.Click
        MsgBox("Hello, World!")
    End Sub
27
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
24.09.2011, 01:34  [ТС] #15
Работа с процессами

Как открыть файл программой по умолчанию
Как открыть файл программой по умолчанию

vb.net
1
        Process.Start("Test.txt")
Запустить исполняемый файл

vb.net
1
        Process.Start("calc.exe")
Разумеется, так можно открыть все файлы, у которых есть ассоциации с программами.
Таким образом, этот код откроет Html-страницы и ссылки браузером по умолчанию.


Как запустить файл с параметрами
Как запустить файл с параметрами
Допустим, потребовалось открыть Яндекс именно в Internet Explorer. Передаем ему в качестве параметра ссылку:

vb.net
1
        Process.Start("iexplore.exe", "www.ya.ru")
Как отправить письмо при помощи установленной по умолчанию в системе почтовой программы (если она, конечно, есть)

vb.net
1
        Process.Start("mailto:dyadyavanya@mail.ru?Subject=Приглашение &Body=Дядя Ваня, приезжай на шашлыки!")
При выполнении этого кода откроется почтовая программа с готовым к отправке письмом.


Как запустить приложение свернутым, развернутым, скрытым и с обычным размером окна
Как запустить приложение свернутым, развернутым, скрытым и с обычным размером окна

vb.net
1
2
3
4
        Dim pr As New Process()
        pr.StartInfo.FileName = "calc.exe"
        pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal 'Hidden, Maximized, Minimized
        pr.Start()


Приостановить работу своего приложения, пока работает запущенная программа
Приостановить работу своего приложения, пока работает запущенная программа
В следующем примере мы запускаем калькулятор, и пока он открыт, наша программа недоступна:

vb.net
1
2
        Dim Pr As Process = Process.Start("calc.exe")
        Pr.WaitForExit()


Как завершить процесс
Как завершить процесс

vb.net
1
        Process.GetProcessesByName("WindowsApplication2")(0).Kill()


Как закрыть программу "мягко"
Как закрыть программу "мягко"
Под "мягко" я имею ввиду выполнение в программе кода, что находится в ее закрытии, ведь при завершении процесса программа "умирает" внезапно

vb.net
1
        Process.GetProcessesByName("WindowsApplication2")(0).CloseMainWindow()
Хотелось бы провести аналогию с диспетчером задач.
Убиваем процесс на вкладке "процессы"
"Мягко" закрываем на вкладке "Приложения"


Как отловить завершение стороннего процесса
Как отловить завершение стороннего процесса

vb.net
1
2
3
4
5
6
7
8
9
    Dim WithEvents Pr As Process
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Pr = Process.GetProcessesByName("Calc")(0)
        Pr.EnableRaisingEvents = True
    End Sub
 
    Private Sub ProcEx() Handles Pr.Exited
        MsgBox("Процесс завершен")
    End Sub


Узнать имя модуля процесса и путь к нему
Узнать имя модуля процесса и путь к нему

vb.net
1
2
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        MsgBox(Pr.MainModule.FileName)
Имя модуля без полного пути:

vb.net
1
2
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        MsgBox(Pr.MainModule.ModuleName)
Имя процесса:

vb.net
1
2
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        MsgBox(Pr.ProcessName)


Получить имя продукта, компанию, версию, описание и т.д. программы по процессу
Получить имя продукта, компанию, версию, описание и т.д. программы по процессу

vb.net
1
2
3
4
5
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        MsgBox(Pr.MainModule.FileVersionInfo.ProductName)
        MsgBox(Pr.MainModule.FileVersionInfo.CompanyName)
        MsgBox(Pr.MainModule.FileVersionInfo.ProductVersion)
        MsgBox(Pr.MainModule.FileVersionInfo.FileDescription)


Получить заголовок главного окна
Получить заголовок главного окна

vb.net
1
2
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        MsgBox(Pr.MainWindowTitle)


Получить все модули процесса
Получить все модули процесса

vb.net
1
2
3
4
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        For I As Integer = 0 To Pr.Modules.Count - 1
            MsgBox(Pr.Modules(I).FileName)
        Next


Получить время старта процесса
Получить время старта процесса

vb.net
1
2
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        MsgBox(Pr.StartTime)


Узнать занимаемую память процесса
Узнать занимаемую память процесса

vb.net
1
2
        Dim Pr As Process = Process.GetProcessesByName("Calc")(0)
        MsgBox(Pr.WorkingSet64 \ 1024)


Использование класса Process для работы с библиотеками
Использование класса Process для работы с библиотеками
Чтобы получить доступ к компонентам библиотек, воспользуемся rundll32.exe и методом Start

Некоторые диалоги:

Свойства мыши:

vb.net
1
        Process.Start("rundll32", "shell32,Control_RunDLL main.cpl @0")
Клавиатуры:

vb.net
1
        Process.Start("rundll32", "shell32,Control_RunDLL main.cpl @1")
Панель управления:

vb.net
1
        Process.Start("rundll32", "shell32,Control_RunDLL")
Принтеры:

vb.net
1
        Process.Start("rundll32", "shell32,Control_RunDLL main.cpl @2")
Свойства модема:

vb.net
1
        Process.Start("rundll32", "SHELL32,Control_RunDLL modem.cpl, add")
Дата и время

vb.net
1
        Process.Start("rundll32", "shell32,Control_RunDLL timedate.cpl")
Открыть с помощью...

vb.net
1
        Process.Start("rundll32", "shell32,OpenAs_RunDLL")
Информация о системе:

vb.net
1
        Process.Start("rundll32", "shell32,ShellAboutA HACKZONE.RU")
Распечатать тестовую страницу:

vb.net
1
        Process.Start("rundll32", "SHELL32,SHHelpShortcuts_RunDLL PrintTestPage")


По поводу запуска библиотек через RunDll32.exe:
Команды
rundll32 rnaui.dll,RnaWizard - вызов мастера "Удаленный доступ к сети".

rundll32 rnaui.dll,RnaWizard /1 - вызов мастера "Удаленный доступ к сети" без отображения начального окна.

rundll32 shell,ShellExecute - открыть Проводник (папка "Рабочий стол").

rundll32 shell32,Control_RunDLL - открыть в Проводнике папку "Панель управления".

rundll32 shell32,Control_RunDLL main.cpl @0 - открыть диалог "Свойства мыши".

rundll32 shell32,Control_RunDLL main.cpl @1 - открыть диалог "Свойства клавиатуры".

rundll32 shell32,Control_RunDLL main.cpl @2 - открыть папку "Принтеры".

rundll32 shell32,Control_RunDLL main.cpl @3 - открыть папку "Шрифты".

rundll32 SHELL32,Control_RunDLL modem.cpl, add - открыть диалог "Свойства модема".

rundll32 shell32,Control_RunDLL timedate.cpl - открыть диалог "Дата и время". *

rundll32 shell32,OpenAs_RunDLL - вызвать диалог "Открыть с помощью...".

rundll32 shell32,ShellAboutA - информация о версии Windows.

rundll32 shell32,SHExitWindowsEx 0 - закрыть все программы, перегрузить оболочку.

rundll32 shell32, SHExitWindowsEx 1 - выключить ПК.

rundll32 shell32, SHExitWindowsEx 2 - перегрузить ПК.

rundll32 shell32,SHExitWindowsEx 4 - принудительно закрыть все программы.

rundll32 shell32,SHExitWindowsEx 8 - выход из Windows и выключение ATX-совместимого ПК.

rundll32 shell32,SHFormatDrive - вызов диалога форматирования диска А:.

rundll32 SHELL32,SHHelpShortcuts_RunDLL AddPrinter - запуск "Мастера установки принтера".

rundll32 shell32,SHHelpShortcuts_RunDLL Connect - запуск мастера подключения сетевого диска.

rundll32 SHELL32,SHHelpShortcuts_RunDLL PrintTestPage - распечатать тестовую страницу.

rundll32 sysdm.cpl,InstallDevice_Rundll - вызов мастера установки оборудования.

rundll32 url.dll,FileProtocolHandler %1 - открыть веб-страницу, где %1 - URL сайта (включая http://).

rundll32 url.dll,MailToProtocolHandler %1 - создать новое письмо, где %1 - e-mail адресата.

rundll32 user,CASCADECHILDWINDOWS - расположить все окна каскадом.

rundll32 user,TILECHILDWINDOWS - расположить все окна по экрану.

rundll32 user,disableoemlayer - сбой системы (!) - выключить все функции ввода-вывода (клавиатура, дисплей, мышь). В результате будет черный экран с курсором и ни на что не реагирующая система, однако Windows продолжает работать.

rundll32 user,ExitWindowsExec - быстрая перезагрузка Windows.

rundll32 user,WNetDisconnectDialog - вызов диалога "Отключение сетевого диска".

rundll32 AppWiz.Cpl,NewLinkHere %1 - запуск мастера создания нового ярлыка, где %1 - путь к исходному файлу.

rundll32 shell32.dll,Control_RunDLL hotplug.dll - диалоговое окно Отключение или извлечение аппаратного устройства

rundll32 мсprint2.dll,RUNDLL_PrintTestPage - распечатать тестовую страницу на принтере.

rundll32 netplwiz.dll,AddNetPlaceRunDll - вызов мастера подключения нового сетевого ресурса "Добавление в сетевое окружение".

rundll32 user,RepaintScreen - выполнить команду "Обновить".

rundll32 user,SetCaretBlinkTime n - задать частоту мигания курсора, соответствующую значению параметра n.

rundll32 user,SetCursorPos - переместить курсор мыши в верхний левый угол экрана.

rundll32 user,SetDoubleClickTime n - задать скорость двойного нажатия левой кнопки мыши (Double Click), соответствующую параметру n.

rundll32 user,SwapMouseButton - поменять местами клавиши мыши (обратная смена невозможна).

rundll32 user,WNetConnectDialog - вызов диалога "Подключение сетевого диска".

rundll32.exe", "shimgvw.dll, ImageView_Fullscreen C:\1.jpg - открыть картинку в программе просмотра изображений и факсов
38
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
06.12.2011, 22:20  [ТС] #16
Как написать простейший сервис (Службу Windows)
Наша служба будет предельно простой. В ее задачу будет входить лишь ведение бесполезного лога в файл.

Вся задача сводится к двум моментам:
  1. Непосредственно написание программы
  2. Установка и удаление службы

Чтобы приступить к написанию программного кода, необходимо выбрать соответствующий шаблон в составе Visual Studio (рис. 1)
Visual Basic .NET FAQ. Готовые решения, полезные коды


Предполагается, что у нашего сервиса не будет визуального интерфейса.
Нам понадобится таймер, но не тот, что мы привыкли использовать в WinForms
На рис. 2 показан этот таймер в момент его выбора и размещения на панели инструментов.
Visual Basic .NET FAQ. Готовые решения, полезные коды


Добавляем его в проект привычным двойным щелчком (рис. 3)
Visual Basic .NET FAQ. Готовые решения, полезные коды

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

В редакторе кода код будет выглядеть следующим образом:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class Service1
 
    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Добавьте здесь код запуска службы. Этот метод должен настроить все необходимое
        ' для успешной работы службы.
        Timer1.Start() 'Запускаем таймер
    End Sub
 
    Protected Overrides Sub OnStop()
        ' Добавьте здесь код для завершающих операций перед остановкой службы.
    End Sub
 
    Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
        My.Computer.FileSystem.WriteAllText("C:\LOG.txt", "Сообщение сервиса в " & Now.ToLongTimeString & ": Успешно" & vbCrLf, True)
    End Sub
End Class
Вот, пожалуй, и все, что необходимо.
По желанию можно зайти в свойства проекта и настроить его.

Компилируем сервис как обычно - Меню - Построение - Построить <Имя Вашего сервиса>
После этого в папке Release появится исполняемый файл. Здесь же отмечу, что такие файлы двойным щелчком не запускаются и так же по F5;
В этом случае VS пояснит, что служба не может быть запущена непосредственно из-под отладчика.

Как бы там ни было, файл готов. И мы хотим видеть его работу.
Чтобы это сделать, нам придется установить сервис в систему. Для этого воспользуемся одним из методов.
Создадим Bat-файл в той же директории, что и сам файл сервиса.
Содержание файла:
Код
set current_dir=%~dp0
sc create MyTestService binPath= "%current_dir%WindowsService1.exe" start= "auto"
sc start MyTestService
pause
Второй строкой мы устанавливаем службу с параметром автозапуска "Автоматический"
Третьей строкой запускаем службу.
Результат показан на рис. 4
Visual Basic .NET FAQ. Готовые решения, полезные коды

Достаточно простой установки, а настройку можно произвести в:
Панель управления - Администрирование - Службы


Сразу же замечу, что в такой службе не будет визуализации, даже MsgBox

Написанное ниже применимо к ОС Windows XP.
Чтобы сообщения были видны пользователю, нужно, чтобы служба работала в интерактивном режиме.
Для этого в настройках службы (Панель управления - Администрирование - Службы) нужно поставить флаг "Разрешить взаимодействие с рабочим столом"

Либо установить службу немного иначе:
Код
set current_dir=%~dp0
sc create MyTestService binPath= "%current_dir%WindowsService1.exe" type= interact type= own
sc start MyTestService
pause
После всех экспериментов не забывайте удалить службу:
Код
sc delete MyTestService
20
prog13
Ефрейтор
176 / 147 / 6
Регистрация: 20.07.2009
Сообщений: 226
09.12.2011, 11:59 #17
как очень легко изменить цвет заголовка столбцов (ColumnHeaders) в DataGridView, без использование описания стилей
vb.net
1
DataGridView2.ColumnHeadersDefaultCellStyle.SelectionBackColor = Color.Blue
очень важно
к этому коду нужно установить свойство грида
EnableHeadersVisualStyles = False


програмно изменить шрифт в DataGridView
vb.net
1
2
3
4
5
6
Dim Font1 As New Font_(GridView.DefaultCellStyle.Font.FontFamily, 8)
Try
 GridView.DefaultCellStyle.Font = Font1
Finally
 Font1.Dispose()
End Try


програмно изменить шрифт в DataGridView конкретного столбца
vb.net
1
2
3
4
5
6
Dim Font2 As New Font(GridView.DefaultCellStyle.Font.FontFamily, 10, FontStyle.Underline)
Try
 GridView.Columns("Наименование").DefaultCellStyle.Font = Font2
Finally
 Font2.Dispose()
End Try
5
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
11.12.2011, 02:34  [ТС] #18
Сохранение в файл классов, коллекций и структур

Разберем это на примере коллекции классов, т.к. принцип применим и к классам в отдельности, и структурам.

Для демонстрации напишем простой класс с двумя свойствами, тип Integer и тип String. Разумеется, в классе могут быть и методы, и события, и коллекции и другие классы, и все, что угодно.
Листинг класса:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<System.Serializable()> Public Class Test 'Класс должен быть сериализуемым
    Dim Str As String
    Dim Int As Integer
 
    Property MyStr() As String
        Get
            Return Str
        End Get
        Set(ByVal value As String)
            Str = value
        End Set
    End Property
 
    Property MyInt() As Integer
        Get
            Return Int
        End Get
        Set(ByVal value As Integer)
            Int = value
        End Set
    End Property
 
    Public Overrides Function ToString() As String
        Return String.Format("Str = {0}; Int = {1}", Str, Int)
    End Function
End Class
На форме у нас 3 кнопки
  1. Добавление класса в коллекцию
  2. Сохранение коллекции в файл
  3. Чтение коллекции из файла

В классе формы мы объявляем коллекцию наших классов
vb.net
1
    Dim ListTest As New List(Of Test)
Предпочтительно, чтобы это были именно коллекции, поскольку это существенно облегчает операции с добавлением, заменой и удалением элементов.

Класс формы:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Public Class Form1
    Dim ListTest As New List(Of Test) ' Создаем коллекцию наших классов
    Dim Rand As New Random
 
    Private Sub ДобавитьКлассВКоллекцию(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim TmpTest As New Test 'Создаем экземпляр нашего класса
        With TmpTest 'Задаем свойства
            .MyInt = Rand.NextDouble * 10
            .MyStr = "Tostring " & .MyInt
        End With
        ListTest.Add(TmpTest) 'Добавляем новый экземпляр в коллекцию
        MsgBox("Последнее добавленное значение: " & ListTest(ListTest.Count - 1).ToString & vbCrLf & "Количество классов в коллекции: " & ListTest.Count)
    End Sub
 
    Private Sub СохранитьКоллекциюНаДиск(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Create("C:\ListTest.bin")
            formatter.Serialize(stream, ListTest) 'Пишем в файл
        End Using
        MsgBox("Коллекция классов сохранена в файл. Количество элементов: " & ListTest.Count)
    End Sub
 
    Private Sub ЗагрузитьКоллекциюИзФайла(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Open("C:\ListTest.bin", IO.FileMode.Open)
            ListTest = formatter.Deserialize(stream) 'Читаем из файла
        End Using
        MsgBox("Коллекция классов загружена из файла. Количество элементов: " & ListTest.Count)
        Dim Show As Integer = 5
        If ListTest.Count < 5 Then Show = ListTest.Count
        MsgBox("Просмотр первых " & Show & " элементов коллекции...")
        For I As Integer = 0 To Show - 1 'Просматриваем
            MsgBox(ListTest(I).ToString)
        Next
    End Sub
End Class
Вся соль в этих кусках кода:
vb.net
1
2
3
4
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Create("C:\ListTest.bin")
            formatter.Serialize(stream, <Объект>)
        End Using
vb.net
1
2
3
4
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Open("C:\ListTest.bin", IO.FileMode.Open)
            <Объект> = formatter.Deserialize(stream) 'Читаем из файла
        End Using
Объектом может выступать все то, о чем говорилось в самом начале.

Любой из них, я еще раз подчеркиваю, дожен быть сериализуемым
16
Памирыч
Почетный модератор
20867 / 8751 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
14.12.2011, 21:54  [ТС] #19
Динамическая компиляция

Рассмотрим 2 основных, и я полагаю, не единственных, способа, как можно откомпилировать исходный код.

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

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Imports Microsoft.VisualBasic
Imports System.CodeDom.Compiler
 
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Compiler As VBCodeProvider = CodeDomProvider.CreateProvider("VB")
        Dim Param As New CompilerParameters()
        Param.GenerateExecutable = True
        Param.OutputAssembly = "1.exe"
        Param.IncludeDebugInformation = False
        Dim Asm As System.Reflection.Assembly
        For Each Asm In AppDomain.CurrentDomain.GetAssemblies()
            Param.ReferencedAssemblies.Add(Asm.Location)
        Next
        Dim Results As CompilerResults
        Results = Compiler.CompileAssemblyFromSource(Param, TextBox1.Text)
        If Results.Errors.Count > 0 Then
            Dim Err As CompilerError
            Dim ErrorString As String
            For Each Err In Results.Errors
                ErrorString &= Err.ToString()
            Next
            MessageBox.Show(ErrorString)
        Else
            Dim ProcessInfo As New ProcessStartInfo("1.exe")
            Shell("1.exe", AppWinStyle.Hide)
        End If
    End Sub
End Class
То, что должно быть в TextBox:

vb.net
1
2
3
4
5
6
7
8
9
10
Imports System
Imports Microsoft.VisualBasic
'==============================
Public Module CompileTest
    Sub Main()
        '|||||||||
        MsgBox("Привет")
        '|||||||||
    End Sub
End Module

Второй способ – компиляция из командной строки. Предполагает наличие файла с исходным кодом программы
Синтаксис:

Код
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\vbc /target:winexe 2.vb
Pause
Компилировать проще всего через Bat-файл, именно в вышеизложенном виде для того, чтобы посмотреть предупреждения и ошибки компиляции, если таковые, конечно, имеются.

В данном случае приложение будет работать, используя версию 2.0 .NET Framework, В команде можно указать другую.
target:winexe
Это указывает на то, что при работе приложения не будет показано консольное окно.
2.vb – непосредственно сам файл с исходным кодом, который должен находиться в одном каталоге с Бат-файлом.
Содержание файла прежнее:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
Imports System
Imports System.Drawing
Imports System.Diagnostics
Imports Microsoft.VisualBasic
'==============================
Public Module CompileTest
    Sub Main()
        '|||||||||
        MsgBox("Привет")
        '|||||||||
    End Sub
End Module
Обращаю внимание на импортирование пространств имен. В этом случае все они, конечно, не нужны. Их список зависит от задач, которые мы возлагаем на приложение.
Например, если программа делает скриншот экрана, сохраняет в файл и запускает, то, по крайней мере, нужно будет точно использовать

vb.net
1
2
Imports System.Drawing
Imports System.Diagnostics
Ниже приведены дополнительные параметры компиляции

Чтобы получить следующий результатИспользование
Компиляция файла File.vb и создание файла File.exevbc /reference:Microsoft.VisualBasic.dll File.vb
Компиляция файла File.vb и создание файла File.dllvbc /target:library File.vb
Компиляция файла File.vb и создание файла My.exevbc /out:My.exe File.vb
Компиляция всех файлов Visual Basic в текущем каталоге с включенной оптимизацией и определенным символом DEBUG для получения файла File2.exevbc /define:DEBUG=1 /optimize /out:File2.exe *.vb
Компиляция всех файлов Visual Basic в текущем каталоге, создание отладочной версии File2.dll без отображения эмблемы или предупрежденийvbc /target:library /out:File2.dll /nowarn /nologo /debug *.vb
Компиляция всех файлов Visual Basic в текущем каталоге для получения файла Something.dllvbc /target:library /out:Something.dll *.vb

Компиляцию оконных приложений здесь мы рассматривать не будем
11
Юпатов Дмитрий
1613 / 1125 / 224
Регистрация: 23.12.2010
Сообщений: 1,495
15.12.2011, 15:55 #20
Обмен данными в локальной сети по UDP-протоколу
Базовые процедуры, переменные и константы (объявляются на уровне модуля):
vb.net
1
2
3
4
5
Friend Const LocalPort As Integer = 22259 'через этот порт происходит обмен сообщениями между членами чата
    Dim Client_UDP_output As New System.Net.Sockets.UdpClient ' этот клиент будет отправлять сообщения на удаленный порт
    Dim Client_UDP_input As New System.Net.Sockets.UdpClient(LocalPort) ' этот клиент будет слушать локальный порт
    Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)
    Dim ListenerThread As Threading.Thread
Эта процедура выполняется в отдельном потоке и отвечает за постоянное прослушивание локального порта на предмет входящих сообщений:
vb.net
1
2
3
4
5
6
7
8
9
10
11
Private Sub DoListen()
        Do While Not ListenerThread Is Nothing
            Try
                Dim receiveBytes As Byte() = Client_UDP_input.Receive(RemoteIpEndPoint)
                Dim returnData As String = System.Text.Encoding.Default.GetString(receiveBytes)
                Me.ReturnData_toMainThread(returnData)
            Catch ex As Exception
                ListenerThread.Abort()
            End Try
        Loop
    End Sub
Собственно, ее запуск в отдельном потоке:
vb.net
1
2
3
4
5
6
7
Private Sub start_thread()
        Try
            ListenerThread = New Threading.Thread(AddressOf DoListen)
            ListenerThread.Start()
        Catch ex As Exception
        End Try
    End Sub
Эту процедуру надо запустить (например, при загрузке формы):
vb.net
1
2
3
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.start_thread()
    End Sub
Теперь перед нами задача вернуть полученные данные в основной поток, когда они будут приняты в дополнительном:
vb.net
1
2
3
4
5
6
7
8
9
10
Private Delegate Sub MSG_Delegate(ByVal Text As String)
 
    Private Sub ReturnData_toMainThread(ByVal Text As String)
        If Not Me.InvokeRequired Then
            Me.UDP_DataArrival(Text)
        Else
            Dim d As System.Delegate = New MSG_Delegate(AddressOf ReturnData_toMainThread)
            Me.BeginInvoke(d, New String() {Text})
        End If
    End Sub
Как видим, финишная обработка полученных данных будет выполняться в процедуре Me.UDP_DataArrival(Text) Text - это то что мы приняли в дополнительном потоке и направили в основной. Вод код финишной процедуры:
vb.net
1
2
3
4
5
6
Private Sub UDP_DataArrival(ByVal DataSTR As String)
        Me.txtSendedMSG.SelectionLength = 0
        Me.txtSendedMSG.SelectionStart = Me.txtSendedMSG.Text.Length
        Me.txtSendedMSG.SelectedRtf = DataSTR
        Me.txtSendedMSG.ScrollToCaret()
    End Sub
Тут я полученные данные (они содержат текст и другую инфу в формате RichText) просто вывожу в RichTextBox под именем txtSendedMSG

Ну все, принимать мы научились, возьмемся за передачу данных на нужный адрес
vb.net
1
2
3
4
5
6
7
8
Friend Sub SendData_to_LocalNet(ByVal strData As String, ByVal RemoteAddress As IPAddress)
        Try
            Dim sendBytes As [Byte]() = System.Text.Encoding.Default.GetBytes(strData)
            Client_UDP_output.Send(sendBytes, sendBytes.Length, New IPEndPoint(RemoteAddress, LocalPort))
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
Входные параметры: строка данных (она затем конвертится перед передачей в массив байт), адрес удаленного компа (можно также отправлять широковещательно на IPAddress.Broadcast).

Все, база есть. Осталось получить список компов в сети (чтобы ручками не вбивать адреса). Можно просто получить все компы (я не буду приводить код, можно найти по ключам: "список компьютеров всети" или аналогично).
Но это не совсем то... было бы неплохо получать список только тех компов, где запущена аналогичная программа, способная принять и отобразить сообщение.
Для этого я усложнил процедуру UDP_DataArrival
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub UDP_DataArrival(ByVal DataSTR As String)
        If DataSTR.StartsWith("INC_CMP") = True Then 'извещение о подключении члена чата
            Me.Inc_out_cmp(DataSTR, True)
            Exit Sub
        End If
        If DataSTR.StartsWith("OUT_CMP") = True Then 'извещение об отключении члена чата
            Me.Inc_out_cmp(DataSTR, False)
            Exit Sub
        End If
        'If DataSTR.Contains("DSTR_ME") = True Then 'закрываем приложение
        '    Me.Close()
        '    Exit Sub
        'End If
        Me.txtSendedMSG.SelectionLength = 0
        Me.txtSendedMSG.SelectionStart = Me.txtSendedMSG.Text.Length
        Me.txtSendedMSG.SelectedRtf = DataSTR
        Me.txtSendedMSG.ScrollToCaret()
        ' если свернуто основное окно
        If Me.WindowState = FormWindowState.Minimized Then
            Me.ShowNotifyWin(DataSTR)
        Else
            Me.niMain.BalloonTipText = "Новое сообщение!"
            Me.niMain.ShowBalloonTip(60000)
            Me.ShowNotifyWin(DataSTR)
        End If
    End Sub
Теперь она проверяет наличие в принятом сообщении определенных сочетаний символов и по их наличию добавляет комп в список или удаляет из него).
Естественно, наша прога должна в определенный момент (у меня при старте) тоже отправить кодовое сообщение (мол, я вот она) причем широковещательно:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Me_inc_out(ByVal inc As Boolean)
        Dim cmd As String = ""
        Dim endip = IPAddress.Broadcast
        Dim MyIP As IPAddress = System.Net.Dns.GetHostAddresses(My.Computer.Name.ToString).GetValue(1)
        Select Case inc
            Case Is = True
                cmd = "INC_CMP"
            Case Is = False
                cmd = "OUT_CMP"
        End Select
        Me.SendData_to_LocalNet(cmd & ":" & My.Computer.Name & ":" & MyIP.ToString, endip)
    End Sub
Ну и процедура, которая обрабатывает сервисные сообщения (собственно, корректирует список компов, она вызывается в процедуре UDP_DataArrival:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Inc_out_cmp(ByVal data As String, ByVal add As Boolean)
        Dim sep = ":"
        Dim hname As String = data.Split(sep).GetValue(1)
        Dim hip As String = data.Split(sep).GetValue(2)
        If hname.ToUpper.Equals(My.Computer.Name.ToUpper) Then Exit Sub ' себя в список не добавляем :)
        Select Case add
            Case Is = True
                Me.ChlbComps.Items.Add(hname & ":" & hip, False)
                Me.ChlbComps.Refresh()
            Case Is = False
                Me.ChlbComps.Items.Remove(hname & ":" & hip)
                Me.ChlbComps.Refresh()
        End Select
    End Sub
Итого, для того, чтобы нас увидели другие, нам надо вызвать при старте Me_inc_out с параметром True (входим в чат и появляемся в чужих списках). И при закрытии программы вызвать ее же с параметром False (удаляемся из списков).
Ну и конечно, при закрытии программы нам надо прервать поток, в котором ведется прослушивание порта входящих сообщений:
vb.net
1
2
3
4
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.Me_inc_out(False) ' выходим из чата
        Me.Client_UDP_input.Close() ' прекращаем поток прослушивания
    End Sub
Это скелет. Во вложении проект готового чата, выполненного на его основе. Там есть: всплывающее окошко со входящим сообщением (если окно свернуто), редактор RTF (простенький) в котором формируется исходящее сообщение, опять же, входящие в RTF отображаются. Сохранение истории сообщений в файлы RTF (1 файл на каждые сутки), просмотровщик истории (тоже RTF).
Ну и, естественно, комплект изображений, которые я использовал в интерфейсе.
Проект выполнен в студии версии 2008. Если у кого более старая версия - открывайте сорцы блокнотом и собирайте проект с нуля.
Проект скомпилен под .Net Framework 2.0, готовый экзешник не требует установки и весит немного (примерно 0,5МБ), история сохраняется в папке с экзешником.
Проверено и эксплуатируется на работе в локальной сетке на 20 компов.
22
Вложения
Тип файла: rar UDPchat.rar (1.57 Мб, 867 просмотров)
15.12.2011, 15:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2011, 15:55

Аналог TStringList в Visual Basic.NET
Здравствуйте все! Помогите разобраться мне надо строки в текстовом файле...

Хорошие учебники по Visual Basic Net
Подскажите пожалуйста хорошие учебники по visual basic net,спасибо

Как в Visual Basic .NET использовать CentimetersToPoints
В Visual Basic 6 можно было перевести сантиметры в пункты подобным образом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru