Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual Basic .NET

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
#1

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

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

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

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


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

Visual Basic .Net и Visual Basic 6.0 - В чём разница - Visual Basic .NET
В общем возник вопрос: Visual Bisic.Net и Visual Basic - это два разных языка, или же .NET версия это лишь его улучшение. Я так понимаю что...

Visual Basic.Net и Visual Studio 2013 - в чем разница? - Visual Basic .NET
Visual Basic.Net и Visual Studio 2013 - в чем разница? Или это одно и тоже, просто называются по другому. Планирую перейти с VB6.0...

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

Исходники на Visual Basic .NET - Visual Basic .NET
Кто-то читает книжки. Кто-то ищет информацию в Google... А кто-то набирается знаний, разбирая чужие исходники. В этой теме предлагается...

Литература и ресурсы по Visual Basic .NET - Visual Basic .NET
Литература по Visual Basic.NET 1. Виктор Зиборов "Visual Basic 2010 на примерах" Издательство: БХВ-Петербург Год издания: 2010...

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

195
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
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
46
Ciberst
507 / 420 / 18
Регистрация: 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
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
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
722 / 522 / 24
Регистрация: 17.06.2010
Сообщений: 1,014
Записей в блоге: 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
55
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
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
60
Ciberst
507 / 420 / 18
Регистрация: 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
279 / 260 / 69
Регистрация: 10.06.2011
Сообщений: 695
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
722 / 522 / 24
Регистрация: 17.06.2010
Сообщений: 1,014
Записей в блоге: 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 / 18
Регистрация: 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
722 / 522 / 24
Регистрация: 17.06.2010
Сообщений: 1,014
Записей в блоге: 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
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
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)
Булевый параметр означает перезапись
25
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
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
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
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
Памирыч
Почетный модератор
20640 / 8681 / 1031
Регистрация: 11.04.2010
Сообщений: 11,009
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
24.09.2011, 01:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2011, 01:34
Привет! Вот еще темы с ответами:

Вопросы к экзамену по курсу Visual Basic .NET - Visual Basic .NET
Помогите ответить на вопросы по Visual Basic. Завтра зачет. Пропускал лекции т.к все время уезжал. Помогите. Желательно развернутый ответ....

Перевести код с VBA на Visual Basic.NET - Visual Basic .NET
Здравствуйте! Прошу помощи. Переведите, пожалуйста, код ниже с VBA (Эксель) на Visual Basic.NET. Обращаюсь вынужденно, поскольку не...

Популярные программы, написанные на Visual basic.NET - Visual Basic .NET
Сейчас есть множество популярных программ, написанных на разных языках программирования. А есть ли популярные или известные программы,...

Для чего нужен Visual Basic.Net? - Visual Basic .NET
Здравствуйте. Объясните пожалуйста для какой деятельности нужен Visual Basic и Visual Basic.Net? То есть для чего там делают программы? И...


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

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

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