Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/2938: Рейтинг темы: голосов - 2938, средняя оценка - 4.99
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014

Готовые решения и полезные коды на Visual Basic .NET (Часть-1)

18.08.2011, 22:44. Показов 559855. Ответов 250
Метки faq (Все метки)

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

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

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


Примечание: некоторые коды приведены без учета строгой типизации (Параметр Strict), поэтому для их использования необходимо выполнить приведение типов
55
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2011, 22:44
Ответы с готовыми решениями:

Готовые решения и полезные коды на Visual Basic .NET (Часть-2)
Данная тема является продолжение одноимённой темы https://www.cyberforum.ru/vb-net/thread343195.html Предлагаю в этой теме размещать...

Готовые решения и полезные коды на Visual Basic 6.0
Запрещаются любые обсуждения выложенных здесь работ (читаем спойлер). Собственно тут буду публиковать разные коды (как собственные или...

Продам готовые коды и решения на Visual Basic за 400 рублей
душу продаю:cry: Продам коды исходные на VB !!10 лет копил за 400р !!размер тока кодов 312метров там есть все ! мыло контакты удалены....

250
 Аватар для PAnT0P
1491 / 586 / 106
Регистрация: 26.03.2012
Сообщений: 1,039
18.08.2011, 22:44
Содержание темы
1
 Аватар для PAnT0P
1491 / 586 / 106
Регистрация: 26.03.2012
Сообщений: 1,039
18.08.2011, 22:44
Продолжение
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2011, 22:44
Помогаю со студенческими работами здесь

Basic4Android. Готовые решения полезные коды
Предлагаю в этой теме делиться полезными кодами. Ну как Visual Basic.NET. Там есть такая тема. Думаю многим будет интересно. ...

Полезные коды для PascalABC.NET
В этой теме размещаются полезные исходники программ, различные процедуры и функции, а так же готовые решения на часто задаваемые вопросы,...

Готовые коды для решения лабораторных работ
Доброго времени суток всем! Очень срочно нужны готовые коды для решения лабораторных работ в С# по учебнику Павловской!!! Вариант 16, нужны...

Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ?
Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net

Visual Basic 6 и Visual Basic .NET - в чем различия?
Visual Basic и Visual studio это не одно и тоже? если нет то в чём разница, по мимо оформления?


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

Или воспользуйтесь поиском по форуму:
3
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
18.08.2011, 22:45  [ТС]
Как получить размер папки?
Как получить размер папки?
Если узнать размер файла можно штатными средствами, то с папкой все обстоит немного иначе.
Даже сама операционная система "не знает" этого.
Но как же так? Если мы наводим мышь на какую-либо папку, то во всплывающей подсказке видим ее размер, бывает что точный, а бывает, что система сообщает "Размер папки более..."
И это неудивительно, потому что, когда мы наводим мышь на какую-либо большую папку, система "задумывается" на какое-то время. Что она делает?
Она перебирает все файлы в папке и ее вложенных подпапках и суммирует их общий "вес".
Нам ничего другого не остается, как следовать ее "примеру". Для получения размера нашей папки мы будем рекурсивно "пробегаться" по ее файлам и подкаталогам и складывать размер каждого нового файла с предыдущим:
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
51
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
18.08.2011, 23:14
Из 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)
24
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
23.08.2011, 01:17  [ТС]
Работа с датами, временем

Как прибавить к текущей дате определенное количество часов, дней, месяцев и т.д.
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"
Если возникает ошибка в неверном формате передаваемой даты, то воспользуйтесь таким вариантом:
VB.NET Скопировано
1
2
        Dim NewDate As Date = CDate("12.05.2020")
        DateString = NewDate.ToString(If(Runtime.InteropServices.Marshal.SystemMaxDBCSCharSize = 1, "M-d-yyyy", "yyyy-M-d"))
PS: для смены системного времени или даты могут потребоваться права администратора.


Подробнее о форматировании дат.
Мы можем использовать даты и время еще гибче, благодаря функции 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, то формат не будет распознан
46
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
24.08.2011, 14:09
Работа с базами данных на примере 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
66
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
27.08.2011, 09:10  [ТС]
Работа с файлами

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

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
63
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
29.08.2011, 22:15
Как получить все ключи реестра и занести их в 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)



Внимание!!! Если Вы не знаете, что такое реестр или не знаете для чего он, то код предоставленный выше запрещается использоваться Вам по кодексу Сис.админов. Если Вы все же имеете представление о реестре и работали с ним, то будьте аккуратны, любое неверное движение может привести к неработоспособности компьютера или не правильной работе ЭВМ или ПО.
16
290 / 271 / 107
Регистрация: 10.06.2011
Сообщений: 696
30.08.2011, 17:14
Как разрешить запуск только одного экземпляра программы
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 (Часть-1)


23
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
31.08.2011, 13:22
В 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)


Перечислять все функции и константы не вижу смысла. Думаю их использование не вызовет затруднений.
Миниатюры
Готовые решения и полезные коды на Visual Basic .NET (Часть-1)  
21
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
31.08.2011, 19:54
Как организовать поиск файлов без рекурсии?
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
20
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
01.09.2011, 12:22
Использование класса 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

Разумеется, это самый простой вариант.
17
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
01.09.2011, 15:39  [ТС]
Работа с каталогами

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

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)
Булевый параметр означает перезапись
29
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
03.09.2011, 22:10  [ТС]
Работа с дисками

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

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 = "Проекты"
23
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
10.09.2011, 01:17  [ТС]
Динамическое создание контроллов

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

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
29
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
24.09.2011, 01:34  [ТС]
Работа с процессами

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

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 - открыть картинку в программе просмотра изображений и факсов
39
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
06.12.2011, 22:20  [ТС]
Как написать простейший сервис (Службу Windows)
Наша служба будет предельно простой. В ее задачу будет входить лишь ведение бесполезного лога в файл.

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

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


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


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

Настраиваем его свойства, в частности, интервал, пусть это будет 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-файл в той же директории, что и сам файл сервиса.
Содержание файла:
Code Скопировано
1
2
3
4
set current_dir=%~dp0
sc create MyTestService binPath= "%current_dir%WindowsService1.exe" start= "auto"
sc start MyTestService
pause
Второй строкой мы устанавливаем службу с параметром автозапуска "Автоматический"
Третьей строкой запускаем службу.
Результат показан на рис. 4
Готовые решения и полезные коды на Visual Basic .NET (Часть-1)

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


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

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

Либо установить службу немного иначе:
Code Скопировано
1
2
3
4
set current_dir=%~dp0
sc create MyTestService binPath= "%current_dir%WindowsService1.exe" type= interact type= own
sc start MyTestService
pause
После всех экспериментов не забывайте удалить службу:
Code Скопировано
1
sc delete MyTestService
20
Ефрейтор
 Аватар для prog13
186 / 157 / 6
Регистрация: 20.07.2009
Сообщений: 226
09.12.2011, 11:59
как очень легко изменить цвет заголовка столбцов (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
6
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
11.12.2011, 02:34  [ТС]
Сохранение в файл классов, коллекций и структур

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

Для демонстрации напишем простой класс с двумя свойствами, тип 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.12.2011, 02:34
Помогаю со студенческими работами здесь

Basic4Android. Готовые решения полезные коды
Предлагаю в этой теме делиться полезными кодами. Ну как Visual Basic.NET. Там есть такая тема. Думаю многим будет интересно. ...

Полезные коды для PascalABC.NET
В этой теме размещаются полезные исходники программ, различные процедуры и функции, а так же готовые решения на часто задаваемые вопросы,...

Готовые коды для решения лабораторных работ
Доброго времени суток всем! Очень срочно нужны готовые коды для решения лабораторных работ в С# по учебнику Павловской!!! Вариант 16, нужны...

Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ?
Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net

Visual Basic 6 и Visual Basic .NET - в чем различия?
Visual Basic и Visual studio это не одно и тоже? если нет то в чём разница, по мимо оформления?


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Списки и кортежи в Python: различия, особенности, применение
py-thonny 13.04.2025
Python славится своей гибкостью при работе с данными. В арсенале языка есть две основные последовательные структуры данных, которые программисты используют ежедневно — списки и кортежи. Эти структуры. . .
Middleware в ASP.NET Core
UnmanagedCoder 13.04.2025
В ASP. NET Core термин "middleware" занимает особое место. Что же это такое? Middleware представляет собой программные компоненты, которые формируют конвейер обработки HTTP-запросов в приложении. . . .
Таблицы лута в Unity с MinMaxCurve и AnimationCurve
GameUnited 12.04.2025
Создание сбалансированного лута в играх — задача не из простых. Разработчики постоянно ищут способы настройки систем выпадения предметов, которые будут одновременно справедливыми для игроков и. . .
std::expected в C++: Управление ошибками
bytestream 12.04.2025
Обработка ошибок всегда была важной и одновременно сложной задачей в программировании на C++. На протяжении долгого времени разработчики использовали различные подходы: возвращаемые коды ошибок,. . .
Nullable типы и операторы объединения null в C#
UnmanagedCoder 12.04.2025
Многие шутят, что null — это миллиардная ошибка в программировании. И в этой шутке только доля шутки. Тони Хоар, создатель null-ссылки, сам назвал её своей "ошибкой на миллиард долларов". Почему?. . .
Аутентификация и авторизация JWT в микросервисах с API Gateway
stackOverflow 12.04.2025
В традиционных монолитных приложениях безопасность часто реализуется как единый защитный периметр - пользователь проходит аутентификацию один раз, после чего получает доступ ко всем функциям системы. . . .
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер