Войти

Показать полную графическую версию : Visual Basic 2008


Страниц : 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Uzvern
10-05-2008, 18:59
Вообщем, ещё одна трабла : Необходимо написать прогу, которая бы удаляла файлы по маске (*а.txt) , либо в имени которых есть только цифры (*цифры*.txt) или только буквы (*любые буквы*.txt)

Просто решил немного поэсперементировать с создниями файла, создал прогу

Public Class Form1

Dim i = 1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Do Until i = 0
i = i + 1
FileOpen(1, i & ".txt", OpenMode.Append)
PrintLine(1, "123")
FileClose(1)
Loop
End Sub
End Class


после того, как она работала 30 секунд, я её остановил, создалось несколько тысяч файлов. Вот теперь хочу сделать чтобы вторая программа удаляла все эти файлы :)


Можно как-то выдирать значения из переменной?
Например у меня перемнная

Dim i("Привет", "Hello"), z

если z =0, тогда выдирается первое значение, если z=1, выдирается второе значение. Это малый пример. мне необходимо сделать чтобы все это происходило автоматически, а не прописывать каждое значение в ручную, как например If z = 0 Then i = "Привет"


Можно ли как-то в GoTo сделать не одно действие, а несколько?

Uzvern
11-05-2008, 18:00
Dim readValue As Object
readValue = My.Computer.Registry.GetValue _
("HKEY_CURRENT_USER\Software\MyApp", "Name", Nothing)
MsgBox("The value is " & CStr(readValue)) »

Таким образом мы вытягиваем значение из реестра. А как-то можно их добавлять или удалять? Срочно необходимо.




Вот ещё. Вообщем выклаюываю пример, помогите разобраться и дописать.

Что необходимо :
1. Когда ничего не делаешь с главным окном, то иконка в трее и контекстное меню работают нормально. Если чуть потеребить окно, то после нажатия на иконку в трее правой кнопкой, появляются какие-то дополнительные штуки в пуске. Дак вот и и необходимо как-то убрать.

2. Когда вызываем контекстное меню, то его невозможно закрыть, только если выбрать какой-то компонент, или выбрать другое окно. Любое нажатие вне контекстного меню игнорируются. Это тоже надо как-то исправить.

Admiral
11-05-2008, 18:47
Можно указав GoTo на первый нужный оператор, а заним без условий написав второй нужный оператор.

Там же чуть выше указано
всё организовано через объект
My.Computer.Registry
... сохранимся в ...
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\VB and VBA Program Settings\MyApp", "Version", "1")

По удалению My.Computer.Registry.LocalMachine. предлагает на выбор три способа по соответствующему назначению DeleteSubKey, DeleteSubKeyTree, DeleteValue »
К сожалению или к счастью работать с тре не приходилось как я уже говорил выше по теме, по этому практически (кодом) подсказать не смогу.

Uzvern
11-05-2008, 21:07
DeleteSubKey, DeleteSubKeyTree, »
Какая между ними разница?

Admiral
11-05-2008, 21:41
DeleteSubKey - удаляет параметра, DeleteSubKeyTree - удаляет раздел.

Uzvern
17-05-2008, 17:13
Хм...как я понял, можно каким-то способом получить хэш. Как это можно организовать?

+ ещё : как можно сделать, чтобы когда открыта программа и реестр, то выбраная ветка/значение записывалось в программу?!

Как отменить закрытие формы?

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

Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Dim i
i = MsgBox("Выйти из программы?", MsgBoxStyle.YesNo Or MsgBoxStyle.Question, "Выйти?")
Select Case i
Case MsgBoxResult.No

End Select
End Sub

Как я понял, нужно копать где-то здесь : CancelButton, но это не точно

Admiral
17-05-2008, 21:20
Да можно, плюс от .NET

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
MsgBox(Me.GetHashCode)
End Sub


выдаст хеш запускаемого файла согласно MD5 алгоритма в виде массива 16 байтов.

Если нужен полноценный, 128 битный вывод согласно MD5 тогда его нужно написать, вот пример Calculating an MD5 Hash in VB.net (http://www.scottwarren.info/2007/12/26/calculating-an-md5-hash-in-vbnet/)
Что бы пример работал необходимо
либо включить в диапазон имён System.Security.Cryptography (про саму службу Cryptographic Services (http://msdn.microsoft.com/en-us/library/93bskf9z(VS.80).aspx)) Project - > Properties -> References -> Imported namespaces и указать собственно System.Security.Cryptography
http://savepic.ru/166469m.png (http://savepic.ru/166469.png)
либо добавить к проекту новый модуль Solution Explorer ->правой кнопкой мыши Add -> Module...
http://balanagaraj.files.wordpress.com/2007/04/windowslivewriterwindowsformsapplications-af6bmodule-thumb5.jpg (http://balanagaraj.files.wordpress.com/2007/04/windowslivewriterwindowsformsapplications-af6bmodule9.jpg)
туда скопировать пример, добавив в начале следующую строчку кода
Imports System.Security.Cryptography
Использование в этом случаи будет таким

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
MsgBox(getFileMd5(System.Windows.Forms.Application.ExecutablePath))
End Sub


Про другие алгоритмы из этого пространства имён можно прочитать здесь
.NET Framework Class Library System.Security.Cryptography Namespace (http://msdn.microsoft.com/en-us/library/system.security.cryptography(VS.80).aspx)
Ещё по теме MD5 Class (http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5(VS.80).aspx), MD5CryptoServiceProvider Class (http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5cryptoserviceprovider.aspx), HashAlgorithm.ComputeHash Method (http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.computehash(VS.80).aspx).

Не проще ли считать нужные строки из реестра самостоятельно? А то в предложенном варианте получается некий перехватчик с другого приложения, в данном случаи с Regedit.exe
Если идея перехватчика вдохновляет то тут .NET языки не лучший выбор, С++/Delphi лучше с этим справятся, так как нужно будет писать ещё драйвер хука.

Блокировка, такого никогда не писал, не было необходимости. По сути не уважения к пользователю, так как не всем такое понравится в виду того что оно ведёт себя как повисшие, если нет диалога. Самое простое что приходит на ум это повторный запуск приложения

Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Shell(System.Windows.Forms.Application.ExecutablePath)
End Sub

Это по сути защита от дурака, не в обиду ни кому, так как перед Task Managerом, она всё же закроется. Но можно сразу же запускать чем-то другим, например через батник.
Боюсь такое не подойдёт, ведь результат роботы будет потерян. Об этом стоит подумать.
Не совсем, CancelButton (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.cancelbutton.aspx) лишь определяет что было не нажато в случаи если пользователь нажимал ESC, чаше всего в этом случаи на него вешают закрытия того диалога, на который предполагалось нажать Enter.

Uzvern
17-05-2008, 21:59
Не проще ли считать нужные строки из реестра самостоятельно? »
А можно как-то считать все ветки и ключи реестра в программу? Например в TreeView?

Admiral
18-05-2008, 00:27
Составив цикл и комбинировав операторы чтения из реестра. Но если ветки массивные приложение будет подтормаживать.

Uzvern
18-05-2008, 20:11
Как отпределить : файл или папка, т.е. например Dir("C:\Program Files\") - выводит "Это папка", если Dir("C:\boot.ini") - выводит "Это файл".
Примечание : Пути могут быть любыми.

Admiral
18-05-2008, 23:44
По предыдущему вопросу есть готовый компонент Registry Toolkit .NET (http://www.componentspace.com/registrytoolkitcodesamples.aspx) если не охота с циклами заморачиватся. Там уверяют что он может сохранить всё содержимое реестра в один XML файл. Так что осталось парсить сей файл на нужные ключи.

Я проверяю само их наличие (файла или папки), а уже потом указываю соответствующие манипуляции.
Можно анализируя ошибки возвращаемые от этих функций

Public Function FileExists(ByVal FileFullPath As String) _
As Boolean

Dim f As New IO.FileInfo(FileFullPath)
Return f.Exists

End Function

Public Function FolderExists(ByVal FolderPath As String) _
As Boolean

Dim f As New IO.DirectoryInfo(FolderPath)
Return f.Exists

End Function
Determine if a File or a Folder Exists (ASP.NET/VB.NET) (http://www.freevbcode.com/ShowCode.asp?ID=4835)

Uzvern
19-05-2008, 01:05
Кстати, нашел более качественный код для перетаскивания формы без "прыжков форы по экрану"

Private b_Down As Boolean
Private oldPoint As Point
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
b_Down = True
oldPoint = e.Location
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If b_Down Then
Me.Location = New Point(Me.Left + e.X - oldPoint.X, Me.Top + e.Y - oldPoint.Y)
End If
End Sub
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
If b_Down Then
Me.Location = New Point(Me.Left + e.X - oldPoint.X, Me.Top + e.Y - oldPoint.Y)
b_Down = False
End If
End Sub

bbs.vbstreets.ru (http://bbs.vbstreets.ru/viewtopic.php?p=6688938&sid=36de93342ae1f5e3cd1ed10ef0f785e9)

Uzvern
21-05-2008, 17:29
Как сделать поиск определенного файла? Например мне нужно узнать где лежит файл cmd.exe или какой-нибудь другой. Необходимый путь должен выглядеть так : "C:\WINDOWS\System32\" , а не "C:\WINDOWS\System32\cmd.exe"

Admiral
21-05-2008, 17:40
C VB6 поставлялась даже готовая формочка SEEK.FRM.
В VB.NET 2008 я подобного не нашёл. Возможно плохо искал или она присутствует в не Експресс редакциях.
VB.Net: Recursive File Searching... (http://www.vbforums.com/showthread.php?t=341919) организовано по принципу рекурсивного поиска.
Плюс там же организована возможность поиска по маске.
Так что можно доделать до необходимого ранее по маске (*а.txt) ... только цифры (*цифры*.txt) или только буквы (*любые буквы*.txt) »

Uzvern
23-05-2008, 16:06
Можно ли как-то подгружать картинку из интернета в PictureBox ?

Admiral
23-05-2008, 16:55
Да.
PictureBox1.Load("http://forum.oszone.net/image.php?u=91692&dateline=1209059773")

Uzvern
23-05-2008, 18:21
О...круто. я так понял можно подгружать почти в любой объект, но не об этом сейчас речь.
У меня вопрос по теме : как-то можно счиать размеры картинки и по результату создать PictureBox ?

Уже ненадо. Сам разобрался...
PictureBox1.Load("http://forum.oszone.net/image.php?u=91692&dateline=1209059773")
Me.Size = PictureBox1.Image.Size

Только возникает следующий вопрос : как сделать чтобы изображение было по середине экрана?

Admiral
23-05-2008, 18:56
Uzvern, считать ничего не надо.
Создаём PictureBox
Dim PictureBox1 As New PictureBox()
Добавляем его к форме, по умолчанию в верхнем левом углу.
Controls.Add(PictureBox1)
и грузим картинку,
PictureBox1.Load("C:\Windows\Blue Lace 16.bmp")
он примет её размер.

Есть обратная задача, что б картинка приняла размер компонента.
Тогда несомненно указываем его размер
PictureBox1.Size = New System.Drawing.Size(10, 20)
выбираем режим Streetch, что б картинка приняла пропорции компонента
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

Подробнее здесь (http://msdn.microsoft.com/en-us/library/system.windows.forms.picturebox.sizemode.aspx).

Me.Size = PictureBox1.Image.Size »
Этот код приводит размеры формы к размерам компонента PictureBox1, и как следствия к размерам загруженной картинки, а не процесс который требует счиать размеры картинки и по результату создать PictureBox »

как сделать чтобы изображение было по середине экрана? »
Для предложенного варианта трактования изображения (форма изменяющая свой размер под размер картинки) это реализируэться следующим кодом
Me.Size = PictureBox1.Image.Size
Me.Left = Screen.PrimaryScreen.Bounds.Width / 2 - Me.Left / 2
Me.Top = Screen.PrimaryScreen.Bounds.Height / 2 - Me.Top / 2
См. также Get the Current Screen Resolution (VB.NET) (http://www.freevbcode.com/ShowCode.asp?ID=5915)

Uzvern
24-05-2008, 20:59
Можно ли как-то сделать эмуляцию нажатия клавишь?
Например запустил прогу, надал на пару кнопок, она автоматом сворачивается, открываешь например окно аси и она автоматом начинет печатать и отправлять. Возможно такое замутить?

Admiral
24-05-2008, 22:48
Можно. Отличают два вида нажатий: в свою прогу, через свойство нужной кнопки (или элемента) Button1.Value
и для чужой проги через упомянутый SendKey.
Только что б отправить необходимо нужное окно найти и активировать, прийдётся использовать Win32 Api
Сразу после Public Class Form1 пишем
Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean
для использования необходимых Win32 Api
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim HWND As IntPtr = FindWindow(vbNullString, "ICQ")
If HWND <> IntPtr.Zero Then
Dim theForegroundWindow As Boolean = SetForegroundWindow(HWND)
If theForegroundWindow = True Then
For I As Integer = 0 To 10
SendKeys.SendWait(I)
Next I
End If
End If
End Sub




© OSzone.net 2001-2012