Visual Basic: новости сайтов, советы, примеры кодов. Выпуск 263.
Информационный Канал Subscribe.Ru |
Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 263.
VBNet
VBMania
Ссылки: |
Господа!!! читайте MSDN!!! Несколько слов от автора:
Здравствуйте...
Читайте! Содержание выпуска
Как превратить изображение в массив? Вопрос: Можно ли получить рисунок из ListImage как Dim Img() As Byte ? Ответ:
dim Bitmapinfo as BITMAPINFO,br>
dim outBuff as byte*65535
Функция копирует с указанного контекста в байтовый массив, есть и
обратная функция.
Ivan R наверх Как испольозовать меню, созданное динамически? Вопрос: Я нашёл код динамического создания PopupMenu - он работает, но как потом использовать это меню (где писать функции, которые будут происходить при нажатии на определённый пункт этого меню). Ответ: Сообщение WM_COMMAND говорит о том, что свершилось нажатие на меню. А ловить сообщение нужно субклассингом. Можно и по-другому. Если установить uFlag=TPM_RETURNCMD, то функция вернет индентификатор меню, которое было выбрано. Артем Кривокрисенко наверх Что такое субклассинг? Вопрос: Собираюсь использовать динамическое меню. Для этого нужен субклассинг. Что это такое? Ответ: Собственно, раскажу все с самого начала. Каждое окно (а PictureBox, CommandButton - тоже окна) имеет такое свойство, как адрес оконной процедуры. Эта процедура получает все сообщения этого окна. Эти сообщения сообщают об создании сообщения (WM_CREATE), получении и потере фокуса (WM_SETFOCUS и WM_KILLFOCUS соответственно). Вобщем, этих сообщений немерено. Если пишешь на VB, сообщения получает процедура VB, которая делает, что нужно, иногда вызывает события. Но ничто тебе не мешает сделать так, чтоб окно посылало сообщения любой твоей процедуре. На www.vbnet.ru есть статья (по-моему, Ивана Шатрыкина). Там этот процес рассмотрен более детально. Как "засубклассить" окно? Используй функцию SetWindowLong:
lngOldProc = SetWindowLong (hwnd, GWL_WNDPROC, AddressOf YourProc)
где hwnd - hwnd твоего окна.YourProc - процедура, которая с этого момента будет получать все сообщения. Эта процедура может находится ТОЛЬКО в Стандартном модуле (функция AddressOf работает только с процедурами стандартного модуля). В переменную lngOldProc помещается адрес процедуру, которая получала до этого сообщения окна. Субклассинг - очень опасное занятие. Если в коде процедуры произойдет ошибка, без вариантов - вылетит веся Среда. Если ты нажмешь на кнопку Стоп на панели инструментов - вылетит вся Среда. Я вообще убрал эту кнопку с панели инструментов. Есть одно средство - писать без ошибок. Если так писать не получается, для запуска используй Ctrl+F5 (Run-- Start with full compile). Во всяком случае ошибки компиляции (Напр, неправильно написал имя переменной) будут исключены. Об отладке таких проектов. Делать это трудно. А вообще лучше использовать 2(два) монитора (начиная с 98-й это можно делать): на одном - Среда, на другом - окно. Артем Кривокрисенко наверх Где можно достать полный список сообщений с их описанием? Вопрос: Субклассинг - Отличная штука! Нет ли у кого-нить полного списка сообщений с их описанием? Ответ: MSDN - только здесь (во всяк. случае, я так думаю) можно найти ПОЛНЫЙ списко всех сообщений, причем с особенностями для каждого контрола. Артем Кривокрисенко наверх Как создать меню последних открытых файлов в программе? Вопрос: Нужно создать меню последних открытых файлов в программе. Как это сделать? Ответ: Создаёшь, например, 5 пунктов меню. Скрытые, кэпшна нет, тег пустой. При загрузке читаешь последние открытые файлы из реестра/INI, если таковые есть - заполняешь меню: тег - полный путь к файлу, кэпшн - только имя файла, визибл = тру. При открытии очередного файла сдвигаешь всё на один пункт вниз (самый "давнооткрытый" файл при этом "забывается). В первое меню добавляешь новый файл по той же схеме. Пишешь его в реестр/INI. При щелчке на меню (лучше делать массив с одним именем) делаешь что-то вроде:
Sub mnuMRU_Click (Index as Integer)
.::Savenger::. В режиме дизайна создай элемент меню, имеющий Caption равный "-". Этот элемент будет представлять собой разделитель имен файлов (обычно список файлов отделяют таким разделителем). Если разделитель не нужен, поставь Visible=false. ОЧЕНЬ ВАЖНО!!!___ поставь Index=0. Далее нет ничего сложного. Но много писанины. lngCount - здесь хранишь количество элементов, сохраненных в реестре mnuFileRecent - имя менюшки, которое ты создал в предыдущем шаге.
For i = 1 To lngCount
При клике на этом меню загружаешь файл mnuFileRecent(index).tag Добавлять элемент можно простым циклом. Есди mnuFileRecent.ubound меньше макс. кол-ва файлов, сначала загрузи еще один элемент: lngMaxCount - макс. кол-во файлов
if mnuFileRecent.ubound < lngMaxCount then
Артем Кривокрисенко Вопрос/Ответ Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы. Вопросы:Автор вопроса: Lexx Ответ ожидается по этому адресу Подскажите, как написать контрол таймера для VBA. Автор вопроса: psinetron Ответ ожидается по этому адресу Как(ой)ие *.ocx нужны чтобы звонить на другой модем через телефонную линию? Автор вопроса: psinetron Ответ ожидается по этому адресу Я создал вяломщик ZIP паролей, принцип его действия таков: ВБ открывает через командную строку файл (создаю *.bat и запускаю через shell(c:\*.bat)) Затем программа передает фокус приложению (командой AppActivate) и пускает горячие клавиши разархивации. После идет примерно следующее: for i=1 to 100 select case i case 1: b="a" case 2: b="b" ... case 100 b="Я" for i1=1 to 100 select case i1 case 1: c="a" case 2: c="b" ... case 100 b="Я" for i2=1 to 100 ... for i3=1 to 100 ... Отправка a & b & c & ... & t next i25 next i24 ... next i1 next i Так вот: а) как можно открывать файлы (кроме *.txt *.exe и *.bat), не используя командной строки? б) как можно, не открывая ZIP - файл, перебирать пароли? в) программа AZRP (тоже ломает пароли) взламывает пароль ия 5 символов за 2 мин., моя за 5-6 и более... г) вставляя kol=kol+1: Label= "Проверено паролей: " & kol сам label становится пустым, т.е цикл его постоянно обновляет и он не успевает отображать, так как сделать прерывание, чтобы label не пустовал? Автор вопроса: YOJ Ответ ожидается по этому адресу Как сделать форму полупрозрачной или прозрачной? Автор вопроса: BaKs Ответ ожидается по этому адресу Как сделать так, чтобы множество image загружалось по очереди (типа как дом строить из кирпичиков), желательно без использования таймера? Хотя можно и с ним. Автор вопроса: Женя Ответ ожидается по этому адресу Как узнать метку (label) сменного диска? Стандартный DriveListBox дает метки HDD, и все. Автор вопроса: Кошевой Дмитрий Ответ ожидается по этому адресу Нужно делать WAP-браузер, но никак не могу понять формат WAP-графики. КТо может помочь? Автор вопроса: Реутов Дмитрий Ответ ожидается по этому адресу Есть 2 одностраничных PDF-файла, полученных печатью на дистиллер. Один представляет собой верхнюю часть страницы, другой - нижнюю. Можно ли их программно "совместить" на одну страницу? Ответы: Вопрос: В Recordset есть данные из SQL - сервера (запрос): Номер Дата Сумма Клиент Код Надо эти данные сконвертировать в текстовый файл заданной структуры. Я пробовал прочитать эти данные в текстовое поле (с помощью Fields.Pole()). Но это дает текущщее значение (одну запись). А мне надо все записи из запроса. Подскажите, пожалуйста, как это сделать. Ответ: Автор ответа: VLADIMIR Берешь свой Recordset (обзовем его R) и, переберая его в цикле, закидываешь его в свое текстовое поле (обзовем его F) Do Until R.EOF F = R![ЗакидываемыеДанные] & vbCrLf & vbCrLf R.MoveNext Ответ: Автор ответа: Andrew Stephanoff Мне кажется, что надо организовать цикл dim rs as adodb.recordset dim strTemp as string set rs = new adodb.recorset rs open strSQL {здесь необходимо открыть файл} do until rs.EOF strTemp = rs.Fields.Pole() {здесь необходимо дописать в конец файла строку strTemp} rs.MoveNext loop {здесь необходимо закрыть файл} На практике не проверял, но вроде должно работать. Вопрос: Делаю расшифровщик ZIp-паролей, но вот в чем проблема: нужно, чтобы открывался ZIP-файл, оператор shell этого не делает, пришлось вводить строку: shell ("c:\xxx.bat", vbHide) в xxx.bat записана функция открытия файла, далее следует такой код: AppActivate "WinZip -yyy.zip", False SendKeys "+e", true т.е после того, как открывается zip-файл, ему дожно посылаться сочетание клавишь Shift+E, чтобы, начиная разархивацию файлов, Zip потребовал пароль. Но эффект нулевой, после того как зип открывается - ничего не происходит :( Может знает кто, как провести эту (или хотя бы похожую) операцию. Или кто-то знает более простой подход? Ответ: Автор ответа: C...R...a...S...H AppActivate "WinZip -yyy.zip", False DoEvents DoEvents SendKeys "+e", true Найди в инете контролы позволяющие работать с зип архивами, с ними скорость подбора паролей заметно возрастет. Ответ: Автор ответа: Andrew Stephanoff Есть библиотека unrar.dll на сайте Евгения Рошала, не помню адрес, но поиском можно найти. Она позволяет работать с архивом .rar без shell'а, но насчет zip не уверен. Думаю и для zip есть похожая библиотека. Вопрос: Как засунуть в VB графический файл с расширением GIF так, чтобы он был с анимацией? Ответ: Автор ответа: nafan Скачай контрол Gif89.dll и подключи к проекту. Найти его можно в любом поисковике. Вопрос: Где скачать самоучебник по VB? Грешен - ленив, никак до поисковика руки не дойдут. Ответ: Автор ответа: nafan Поищи на сайте http://vb.hut.ru . Там есть неплохой учебник и справочник в одном (~400kb). Вопрос: Есть два одномерных массива, содержащие текстовые значения. Размерность обоих периодически изменяется. Приведу пример: Dim oldMas(3) As String Dim newMas(5) As String oldMas(0) = "abc" oldMas(1) = "def" oldMas(2) = "xyz" newMas(0) = "abc" newMas(1) = "def" newMas(2) = "zyx" newMas(3) = "klm" newMas(4) = "abc" Нужно найти: 1. различия между oldMas() и newMas() с указанием на значения которые присутствуют в newMas() и отсутствуют в oldMas(), и наоборот присутствуют в oldMas() и отсутствуют в newMas() 2. найти повторения значения которые могут содержаться в oldMas() два раза под разными индексами, а в newMas() три, другими словами найти это третье значение в newMas(). Но при этом некоторые значения могут находиться в newMas() под другими индексами по сравнению с oldMas(). Ответ: Автор ответа: C...R...a...S...H Если я правильно понял последнее задание Private Sub Command1_Click() Dim oldMas(3) As String Dim newMas(5) As String oldMas(0) = "abc" oldMas(1) = "def" 'oldMas(2) = "def" oldMas(2) = "xyz" newMas(0) = "abc" newMas(1) = "def" 'newMas(2) = "zyx" newMas(2) = "klm" newMas(3) = "klm" newMas(4) = "klm" 'newMas(4) = "abc" 'присутствуют в oldMas() и отсутствуют в newMas() Dim i As Byte Dim j As Byte Dim str As String Dim bFlag As Boolean For i = 0 To 2 For j = 0 To 4 If newMas(j) = oldMas(i) Then bFlag = True Next j If bFlag = False Then str = str + oldMas(i) + vbCrLf bFlag = False Next i MsgBox str 'которые присутствуют в newMas() и отсутствуют в oldMas() str = vbNullString For i = 0 To 4 For j = 0 To 2 If newMas(i) = oldMas(j) Then bFlag = True Next j If bFlag = False Then str = str + newMas(i) + vbCrLf bFlag = False Next i MsgBox str str = vbNullString 'которые могут содержаться в oldMas() два раза под разными индексами For i = 0 To 2 For j = i + 1 To 2 If oldMas(i) = oldMas(j) Then str = str + oldMas(i) + vbCrLf Next j Next i MsgBox str str = vbNullString 'newMas() три, другими словами найти это третье значение в newMas() Dim k As Byte For i = 0 To 4 For j = i + 1 To 4 For k = j + 1 To 4 If newMas(i) = newMas(j) And newMas(i) = newMas(k) Then str = str + newMas(i) + vbCrLf Next k Next j Next i MsgBox str End Sub Вопрос: Можно ли в функциях, в качестве передаваемых и возвращаемых значений использовать массивы? Ответ: Автор ответа: C...R...a...S...H Private Sub Command1_Click() Dim bb(2) As String bb(0) = "ads" aa bb Debug.Print bb(0) 'Здесь будет ХХХ End Sub Sub aa(bb() As String) Debug.Print bb(0) bb(0) = "XXX" End Sub Вопрос: Напишите пример по использованию тэгов (ID3) в mp3 файлах. Мне нужна только запись, чтение у меня есть. Ответ: Автор ответа: Роман Засунуть все это в cls-файл: VERSION 1.0 CLASS BEGIN MultiUse = -1 'True Persistable = 0 'NotPersistable DataBindingBehavior = 0 'vbNone DataSourceBehavior = 0 'vbNone MTSTransactionMode = 0 'NotAnMTSObject END Attribute VB_Name = "ID3tag11" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False ' Author: Alvaro Redondo ' http://www.sevillaonline.com/ActiveX ' Version: 1.0 ' Last modification date: 30.09.2000 ' Description: ID3 tags are used to store information in multimedia files, commonly MP3 files. ' This class manages version 1.0 and 1.1 ID3 tags. Option Explicit Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Const OPEN_EXISTING = 3 Private Const INVALID_HANDLE_VALUE = -1 Private Const FILE_BEGIN = 0 Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _ (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _ ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long) As Long Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, _ ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, _ ByVal dwMoveMethod As Long) As Long Private Declare Function SetEndOfFile Lib "kernel32" _ (ByVal hFile As Long) As Long Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Enum enGenres [Blues] = 0 [Classic Rock] = 1 [Country] = 2 [Dance] = 3 [Disco] = 4 [Funk] = 5 [Grunge] = 6 [Hip-Hop] = 7 [Jazz] = 8 [Metal] = 9 [New Age] = 10 [Oldies] = 11 [Other] = 12 [Pop] = 13 [R&B] = 14 [Rap] = 15 [Reggae] = 16 [Rock] = 17 [Techno] = 18 [Industrial] = 19 [Alternative] = 20 [Ska] = 21 [Death Metal] = 22 [Pranks] = 23 [Soundtrack] = 24 [Euro-Techno] = 25 [Ambient] = 26 [Trip-Hop] = 27 [Vocal] = 28 [Jazz+Funk] = 29 [Fusion] = 30 [Trance] = 31 [Classical] = 32 [Instrumental] = 33 [Acid] = 34 [House] = 35 [Game] = 36 [Sound Clip] = 37 [Gospel] = 38 [Noise] = 39 [AlternRock] = 40 [Bass] = 41 [Soul] = 42 [Punk] = 43 [Space] = 44 [Meditative] = 45 [Instrumental Pop] = 46 [Instrumental Rock] = 47 [Ethnic] = 48 [Gothic] = 49 [Darkwave] = 50 [Techno-Industrial] = 51 [Electronic] = 52 [Pop-Folk] = 53 [Eurodance] = 54 [Dream] = 55 [Southern Rock] = 56 [Comedy] = 57 [Cult] = 58 [Gangsta] = 59 [Top 40] = 60 [Christian Rap] = 61 [Pop/Funk] = 62 [Jungle] = 63 [Native American] = 64 [Cabaret] = 65 [New Wave] = 66 [Psychadelic] = 67 [Rave] = 68 [Showtunes] = 69 [Trailer] = 70 [Lo-Fi] = 71 [Tribal] = 72 [Acid Punk] = 73 [Acid Jazz] = 74 [Polka] = 75 [Retro] = 76 [Musical] = 77 [Rock & Roll] = 78 [Hard Rock] = 79 [Folk] = 80 [Folk-Rock] = 81 [National Folk] = 82 [Swing] = 83 [Fast Fusion] = 84 [Bebob] = 85 [Latin] = 86 [Revival] = 87 [Celtic] = 88 [Bluegrass] = 89 [Avantgarde] = 90 [Gothic Rock] = 91 [Progressive Rock] = 92 [Psychedelic Rock] = 93 [Symphonic Rock] = 94 [Slow Rock] = 95 [Big Band] = 96 [Chorus] = 97 [Easy Listening] = 98 [Acoustic] = 99 [Humour] = 100 [Speech] = 101 [Chanson] = 102 [Opera] = 103 [Chamber Music] = 104 [Sonata] = 105 [Symphony] = 106 [Booty Bass] = 107 [Primus] = 108 [Porn Groove] = 109 [Satire] = 110 [Slow Jam] = 111 [Club] = 112 [Tango] = 113 [Samba] = 114 [Folklore] = 115 [Ballad] = 116 [Power Ballad] = 117 [Rhythmic Soul] = 118 [Freestyle] = 119 [Duet] = 120 [Punk Rock] = 121 [Drum Solo] = 122 [A capella] = 123 [Euro-House] = 124 [Dance Hall] = 125 End Enum Private Type tipoTag Tag As String * 3 Name As String * 30 Artist As String * 30 Album As String * 30 Year As String * 4 Comment As String * 30 Genre As String * 1 End Type Private m_sName As String, m_sAlbum As String, m_sArtist As String, _ m_iYear As Integer, m_iGenre As Integer, m_sComment As String, _ m_iSongNumber As Integer Private m_sPath As String, m_bFileExists As Boolean, m_bReadOnly As Boolean, _ m_bHasID3tag As Boolean Property Get Album() As String Attribute Album.VB_Description = "Sets / returns album name." Album = m_sAlbum End Property Property Let Album(sAlbum As String) m_sAlbum = IIf(Len(Trim(sAlbum)) > 30, Left(Trim(sAlbum), 30), Trim(sAlbum)) End Property Property Get Artist() As String Attribute Artist.VB_Description = "Sets / returns artist name." Artist = m_sArtist End Property Property Let Artist(sArtist As String) m_sArtist = IIf(Len(Trim(sArtist)) > 30, Left(Trim(sArtist), 30), Trim(sArtist)) End Property Property Get Comment() As String Attribute Comment.VB_Description = "Sets / returns comment field." Comment = m_sComment End Property Property Let Comment(sComment As String) m_sComment = IIf(Len(Trim(sComment)) > 30, Left(Trim(sComment), 30), Trim(sComment)) End Property Property Get FileExists() As Boolean Attribute FileExists.VB_Description = "Returns True if file exists." FileExists = m_bFileExists End Property Property Get FileName() As String Attribute FileName.VB_Description = "Sets / returns path to the file we want to work with." FileName = m_sPath End Property Property Let FileName(ByVal sPath As String) Dim FF As Integer sPath = Trim(sPath) If sPath = "" Then m_sPath = "" m_bFileExists = False m_bReadOnly = False Exit Property End If On Error Resume Next FF = FreeFile Open sPath For Input As #FF If Err.Number <> 0 Then Err.Clear m_sPath = "" m_bFileExists = False m_bReadOnly = False Exit Property End If Close #FF m_sPath = sPath m_bFileExists = True Open sPath For Append As #FF If Err.Number <> 0 Then Err.Clear m_bReadOnly = True Else Close #FF m_bReadOnly = False End If On Error GoTo 0 Load End Property Property Get Genre() As enGenres Attribute Genre.VB_Description = "Sets / returns genre." Genre = CLng(m_iGenre) End Property Property Let Genre(lGenre As enGenres) m_iGenre = CInt(lGenre) End Property Property Get Genre_str() As String Attribute Genre_str.VB_Description = "Returns genre as string." Select Case m_iGenre Case 0 Genre_str = "Blues" Case 1 Genre_str = "Classic Rock" Case 2 Genre_str = "Country" Case 3 Genre_str = "Dance" Case 4 Genre_str = "Disco" Case 5 Genre_str = "Funk" Case 6 Genre_str = "Grunge" Case 7 Genre_str = "Hip-Hop" Case 8 Genre_str = "Jazz" Case 9 Genre_str = "Metal" Case 10 Genre_str = "New Age" Case 11 Genre_str = "Oldies" Case 12 Genre_str = "Other" Case 13 Genre_str = "Pop" Case 14 Genre_str = "R&B" Case 15 Genre_str = "Rap" Case 16 Genre_str = "Reggae" Case 17 Genre_str = "Rock" Case 18 Genre_str = "Techno" Case 19 Genre_str = "Industrial" Case 20 Genre_str = "Alternative" Case 21 Genre_str = "Ska" Case 22 Genre_str = "Death Metal" Case 23 Genre_str = "Pranks" Case 24 Genre_str = "Soundtrack" Case 25 Genre_str = "Euro-Techno" Case 26 Genre_str = "Ambient" Case 27 Genre_str = "Trip-Hop" Case 28 Genre_str = "Vocal" Case 29 Genre_str = "Jazz+Funk" Case 30 Genre_str = "Fusion" Case 31 Genre_str = "Trance" Case 32 Genre_str = "Classical" Case 33 Genre_str = "Instrumental" Case 34 Genre_str = "Acid" Case 35 Genre_str = "House" Case 36 Genre_str = "Game" Case 37 Genre_str = "Sound Clip" Case 38 Genre_str = "Gospel" Case 39 Genre_str = "Noise" Case 40 Genre_str = "AlternRock" Case 41 Genre_str = "Bass" Case 42 Genre_str = "Soul" Case 43 Genre_str = "Punk" Case 44 Genre_str = "Space" Case 45 Genre_str = "Meditative" Case 46 Genre_str = "Instrumental Pop" Case 47 Genre_str = "Instrumental Rock" Case 48 Genre_str = "Ethnic" Case 49 Genre_str = "Gothic" Case 50 Genre_str = "Darkwave" Case 51 Genre_str = "Techno-Industrial" Case 52 Genre_str = "Electronic" Case 53 Genre_str = "Pop-Folk" Case 54 Genre_str = "Eurodance" Case 55 Genre_str = "Dream" Case 56 Genre_str = "Southern Rock" Case 57 Genre_str = "Comedy" Case 58 Genre_str = "Cult" Case 59 Genre_str = "Gangsta" Case 60 Genre_str = "Top 40" Case 61 Genre_str = "Christian Rap" Case 62 Genre_str = "Pop/Funk" Case 63 Genre_str = "Jungle" Case 64 Genre_str = "Native American" Case 65 Genre_str = "Cabaret" Case 66 Genre_str = "New Wave" Case 67 Genre_str = "Psychadelic" Case 68 Genre_str = "Rave" Case 69 Genre_str = "Showtunes" Case 70 Genre_str = "Trailer" Case 71 Genre_str = "Lo-Fi" Case 72 Genre_str = "Tribal" Case 73 Genre_str = "Acid Punk" Case 74 Genre_str = "Acid Jazz" Case 75 Genre_str = "Polka" Case 76 Genre_str = "Retro" Case 77 Genre_str = "Musical" Case 78 Genre_str = "Rock & Roll" Case 79 Genre_str = "Hard Rock" Case 80 Genre_str = "Folk" Case 81 Genre_str = "Folk-Rock" Case 82 Genre_str = "National Folk" Case 83 Genre_str = "Swing" Case 84 Genre_str = "Fast Fusion" Case 85 Genre_str = "Bebob" Case 86 Genre_str = "Latin" Case 87 Genre_str = "Revival" Case 88 Genre_str = "Celtic" Case 89 Genre_str = "Bluegrass" Case 90 Genre_str = "Avantgarde" Case 91 Genre_str = "Gothic Rock" Case 92 Genre_str = "Progressive Rock" Case 93 Genre_str = "Psychedelic Rock" Case 94 Genre_str = "Symphonic Rock" Case 95 Genre_str = "Slow Rock" Case 96 Genre_str = "Big Band" Case 97 Genre_str = "Chorus" Case 98 Genre_str = "Easy Listening" Case 99 Genre_str = "Acoustic" Case 100 Genre_str = "Humour" Case 101 Genre_str = "Speech" Case 102 Genre_str = "Chanson" Case 103 Genre_str = "Opera" Case 104 Genre_str = "Chamber Music" Case 105 Genre_str = "Sonata" Case 106 Genre_str = "Symphony" Case 107 Genre_str = "Booty Bass" Case 108 Genre_str = "Primus" Case 109 Genre_str = "Porn Groove" Case 110 Genre_str = "Satire" Case 111 Genre_str = "Slow Jam" Case 112 Genre_str = "Club" Case 113 Genre_str = "Tango" Case 114 Genre_str = "Samba" Case 115 Genre_str = "Folklore" Case 116 Genre_str = "Ballad" Case 117 Genre_str = "Power Ballad" Case 118 Genre_str = "Rhythmic Soul" Case 119 Genre_str = "Freestyle" Case 120 Genre_str = "Duet" Case 121 Genre_str = "Punk Rock" Case 122 Genre_str = "Drum Solo" Case 123 Genre_str = "A capella" Case 124 Genre_str = "Euro-House" Case 125 Genre_str = "Dance Hall" Case Else Genre_str = "" End Select End Property Property Get HasID3tag() As Boolean Attribute HasID3tag.VB_Description = "Returns True if file has an ID3 1.0 or 1.1 tag." HasID3tag = m_bHasID3tag End Property Property Get Name() As String Attribute Name.VB_Description = "Sets / returns track name field." Name = m_sName End Property Property Let Name(sName As String) m_sName = IIf(Len(Trim(sName)) > 30, Left(Trim(sName), 30), Trim(sName)) End Property Property Get ReadOnly() As Boolean Attribute ReadOnly.VB_Description = "Returns True if the file can't be modified." ReadOnly = m_bReadOnly End Property Property Get SongNumber() As Integer Attribute SongNumber.VB_Description = "Sets / returns song number in album. If set to 0, tag version will be 1.0 and song number won't be saved. If set to a valid value, tag version will be 1.1." SongNumber = m_iSongNumber End Property Property Let SongNumber(iSongNumber As Integer) If iSongNumber >= 0 And iSongNumber <= 255 Then m_iSongNumber = iSongNumber Else m_iSongNumber = 0 End If End Property Property Get Year() As Integer Attribute Year.VB_Description = "Sets / returns year field." Year = m_iYear End Property Property Let Year(iYear As Integer) If iYear >= 0 And iYear <= 9999 Then m_iYear = iYear Else m_iYear = 0 End If End Property Function Load() As Boolean Attribute Load.VB_Description = "Loads tag information from file. Automatically called after setting the FileName property." Dim lLen As Long, lPos As Long, FF As Integer, tTag As tipoTag Clear m_bHasID3tag = False If Not m_bFileExists Then Load = False Exit Function End If On Error Resume Next FF = FreeFile Open m_sPath For Binary As #FF If Err.Number <> 0 Then Close #FF Load = False Exit Function End If On Error GoTo 0 lLen = LOF(FF) lPos = lLen - 128 + 1 If Not lPos > 0 Then Close #FF Load = False Exit Function End If Seek #FF, lPos Get #FF, , tTag Close #FF With tTag If .Tag = "TAG" Then m_bHasID3tag = True m_sName = RTrim(.Name) If InStr(m_sName, Chr(0)) > 0 Then _ m_sName = Left(m_sName, InStr(m_sName, Chr(0)) - 1) m_sAlbum = RTrim(.Album) If InStr(m_sAlbum, Chr(0)) > 0 Then _ m_sAlbum = Left(m_sAlbum, InStr(m_sAlbum, Chr(0)) - 1) m_sArtist = RTrim(.Artist) If InStr(m_sArtist, Chr(0)) > 0 Then _ m_sArtist = Left(m_sArtist, InStr(m_sArtist, Chr(0)) - 1) If Trim(.Year) <> "" Then If IsNumeric(.Year) Then m_iYear = CInt(.Year) Else m_iYear = 0 End If Else m_iYear = 0 End If If Mid(.Comment, 29, 1) = Chr(0) Then If Right(.Comment, 1) <> Chr(0) Then m_iSongNumber = Asc(Right(.Comment, 1)) m_sComment = RTrim(Left(.Comment, 28)) If InStr(m_sComment, Chr(0)) Then _ m_sComment = Left(m_sComment, InStr(m_sComment, Chr(0)) - 1) Else m_iSongNumber = 0 m_sComment = RTrim(.Comment) If InStr(m_sComment, Chr(0)) Then _ m_sComment = Left(m_sComment, InStr(m_sComment, Chr(0)) - 1) End If Else m_iSongNumber = 0 m_sComment = RTrim(.Comment) If InStr(m_sComment, Chr(0)) Then _ m_sComment = Left(m_sComment, InStr(m_sComment, Chr(0)) - 1) End If m_iGenre = Asc(.Genre) Load = True Else Load = False End If End With End Function Function Save() As Boolean Attribute Save.VB_Description = "Saves ID3 tag information to file." Dim tTag As tipoTag, FF As Integer, lLen As Long, _ lPos As Long If Not m_bFileExists Or m_bReadOnly Then Save = False Exit Function End If FF = FreeFile On Error Resume Next Open m_sPath For Binary As #FF If Err.Number <> 0 Then Close #FF Save = False Exit Function End If lLen = LOF(FF) lPos = lLen - 128 + 1 If Not lPos > 0 Then Close #FF Save = False Exit Function End If Seek #FF, lPos Get #FF, , tTag If Not tTag.Tag = "TAG" Then lPos = lLen + 1 With tTag .Album = m_sAlbum & String(30 - Len(m_sAlbum), Chr(0)) .Artist = m_sArtist & String(30 - Len(m_sArtist), Chr(0)) If m_iSongNumber > 0 Then If Len(m_sComment) > 28 Then _ m_sComment = Left(m_sComment, 28) .Comment = m_sComment & String(28 - Len(m_sComment), Chr(0)) & Chr(0) & Chr(m_iSongNumber) Else .Comment = m_sComment & String(30 - Len(m_sComment), Chr(0)) End If .Genre = Chr(m_iGenre) .Name = m_sName & String(30 - Len(m_sName), Chr(0)) .Tag = "TAG" .Year = IIf(m_iYear > 0, Format(m_iYear, "0000"), String(4, Chr(0))) End With Seek #FF, lPos Put #FF, , tTag Close #FF m_bHasID3tag = True Save = True End Function Function RemoveTag() As Boolean Attribute RemoveTag.VB_Description = "Removes ID3 tag information from file." Dim FF As Integer, tTag As tipoTag, _ lLen As Long, lPos As Long, lHnd As Long, SA As SECURITY_ATTRIBUTES, _ lRes As Long If Not m_bFileExists Or m_bReadOnly Or Not m_bHasID3tag Then RemoveTag = False Exit Function End If FF = FreeFile On Error Resume Next Open m_sPath For Binary As #FF If Err.Number <> 0 Then RemoveTag = False Exit Function End If On Error GoTo 0 lLen = LOF(FF) lPos = lLen - 128 + 1 If Not lPos > 0 Then Close #FF RemoveTag = False Exit Function End If Seek #FF, lPos Get #FF, , tTag If Not tTag.Tag = "TAG" Then Close #FF RemoveTag = False Exit Function End If Close #FF lHnd = CreateFile(m_sPath & Chr(0), GENERIC_READ Or GENERIC_WRITE, 0&, _ SA, OPEN_EXISTING, 0&, 0&) If lHnd = INVALID_HANDLE_VALUE Then RemoveTag = False Exit Function End If lPos = lPos - 1 lRes = SetFilePointer(lHnd, lPos, 0&, FILE_BEGIN) lRes = SetEndOfFile(lHnd) If lRes = 0 Then RemoveTag = False Else RemoveTag = True m_bHasID3tag = False End If CloseHandle lHnd End Function Sub Clear() Attribute Clear.VB_Description = "Clears all ID3 tag fields." m_sName = "" m_sAlbum = "" m_sArtist = "" m_iYear = 0 m_iGenre = 255 m_sComment = "" m_iSongNumber = 0 End Sub Private Sub Class_Initialize() Clear End Sub Ответ: Автор ответа: Alexwander IV Давным-давно скачал откуда-то статью по работе с mp3 тегами (ID 3), там описывается, как написать библиотеку для работы с этими самыми тегами. Если надо могу прислать и библиотеку и эту статью. Пиши. Вопрос: Можно ли делать в vbnet asm вставки? Ответ: Автор ответа: freeloader Насколько я знаю, нет, да и быть такого по логике вещей не может... Вопрос: Не сталкивался ли кто нибуть с такой штукой… Комп находиться в локальной сети и очень хочется изменить адрес контролера (Mac address), связанный как я понял с сетевой картой. Рассматриваю все, и фантастические варианты тоже. Ответ: Автор ответа: Sergey Kuksenko Это зависит от модели сетевухи. Я встречал некоторые 3COM модели, где MAC адрес можно поменять в свойствах карты в диспетчере устройств. Но зачастую MAC адрес прошит в карте жестко и не меняется никак. Вопрос: Ребята, подскажите, как сделать, чтоб при вводе текста в TextBox прога проверяла все слова в ListBox на соответствие и, если такое слово найдено, выделяла его. Ответ: Автор ответа: Александр Павлов Используй этот код... 'Text1 - имя твоего TextBox 'ListBox1 - имя твоего ListBox Private Sub Text1_Change() Dim LIndex As Integer Dim LCount As Integer With ListBox1 For LIndex = 0 To .ListCount - 1 If Text1.Text = .List(LIndex) Then .Selected(LIndex) = True Else .Selected(LIndex) = False End If Next End With End Sub Ответ: Автор ответа: Роман При вводе каждого символа проверяй, если это не буква, а, допустим, пробел или дефис, то в цикле перебирай все слова ListBox'а и сравнивай со своим словом. Ответ: Автор ответа: C...R...a...S...H Private Sub Text1_Change() Dim i As Integer For i = 0 To List1.ListCount - 1 If InStr(1, List1.List(i), Text1) <> 0 Then List1.ListIndex = i: Exit For Next i End Sub Ответ: Автор ответа: Hr. Кудрявцев Private Sub Text1_KeyPress(KeyAscii As Integer) Dim i As Integer For i = 0 To (List1.ListCount - 1) If Text1.Text = List1.List(i) Then List1.ListIndex = i List1.Text = Text1.Text End If Next End Sub Можете заполнить эту форму, либо отослать вопрос СЮДА Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта. |
Выпуск подготовили: |
Сурменок Павел |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||