Часть 1/Часть 2/Часть 3/Часть 4/Часть 5/Часть 6/Часть 7/Часть 8/ Часть 9/Часть 10/Часть 11/Часть 12 /Часть 13/Часть 14 /Часть 15 /Часть 16 /Часть 17 /Часть 18
Не обязательно ныкать(Visible=FALSE) на форме объекты, и потом их показывать, можно просто на форму кинуть объект, и потом загружать другие, и ставить им свойства. Так вроде проще?
Начнем`с...
На форму кинь кнопку, потом кликни по ней правой кнопой мыши и выбери в меню Copy. Короче копируй кнопу.
Теперь нажми на форму правой кнопой мыши и выбери Paste. Короче вставь кнопку. После нажатия на Paste появляется окошко, жми на Да. Теперь выдели только что вставленную кнопу, и нажми на Del(твоя миссия удалить вставленную кнопу, т.к. на 1 форме нет места двум кнопкам:-)). Теперь код:
Dim t As Long ' Объявляем переменную
Private Sub Command1_Click(Index As Integer)
For i = 1 To 10' Делаем цикл от 1 до 10, спросишь почему не от 0 до 10? Да потому что объект с индексом 0 у нас есть, если написать от 0 до 10 то начнет ругаться(материться)
t = t + 500' Каждый цикл прибавляем к переменной t пятихатку, это переменная будет задовать высоту создаваемых кнопок, каждая кнопа на 500 ниже предыдущей
Load Command1(i)' Загружаем кнопу с именем Command1, а в скобах индекс( i каждый цикл на 1 больше, начинается с 1 до 10)
Command1(i).Caption = "Кнопа №:" & i' Устанавливаем свойство Caption для каждой кнопки
Command1(i).Top = t' Устанавливаем высоту(t = t + 500)
Command1(i).Left = 1700 ' Устанавливаем свойство Left
Command1(i).Visible = True' Показываем кнопки, т.к. они в начале скрытые
Next i
End Sub
Исходник ищи Здесь
Для удаление объектов есть оператор UnLoad "Имя объекта(индекс)"
Например, сделаем программу которая в начале будет создавать, а потом удалять объект. Создай массив кнопок(Если забыл, то напоминаю: На форму кинь кнопку, потом кликни по ней правой кнопой мыши и выбери в меню Copy. Короче копируй кнопу.
Теперь нажми на форму правой кнопой мыши и выбери Paste. Короче вставь кнопку. После нажатия на Paste появляется окошко, жми на Да. Теперь выдели только что вставленную кнопу, и нажми на Del(твоя миссия удалить вставленную кнопу, т.к. на 1 форме нет места двум кнопкам:-)). ). Вот код:
Private Sub Form_Load()
' Создаем кнопку с индексом 1
Load Command1(1)
Command1(1).Visible = True
Command1(1).Top = 50
End Sub
Private Sub Command1_Click(Index As Integer)
' Удаляем кнопку с индексом 1
Unload Command1(1)
End Sub
Исходник ищи Здесь
Ну в этом шаге сделаем простенькую программу, по теме создание объектов(массивы).
Открой исходник предыдущего шага, и не много до пишем код:
Dim t As Long, S As Long ' Объявляем переменные
Private Sub Command1_Click(Index As Integer)
If S = 0 Then ' Если S = 0 то загружаем кнопки
For i = 1 To 10 ' Делаем цикл от 1 до 10, спросишь почему не от 0 до 10? Да потому что объект с индексом 0 у нас есть, если написать от 0 до 10 то начнет ругаться(материться)
t = t + 500' Каждый цикл прибавляем к переменной t пятихатку, это переменная будет задовать высоту создаваемых кнопок, каждая кнопа на 500 ниже предыдущей
Load Command1(i) ' Загружаем кнопу с именем Command1, а в скобах индекс( i каждый цикл на 1 больше, начинается с 1 до 10)
Command1(i).Caption = "Кнопа №:" & i ' Устанавливаем свойство Caption для каждой кнопки
Command1(i).Top = t' Устанавливаем высоту(t = t + 500)
Command1(i).Left = 1700 ' Устанавливаем свойство Left
Command1(i).Visible = True ' Показываем кнопки, т.к. они в начале скрытые
Next i
End If
If Command1(Index).Index = 0 Then MsgBox "Нажата кнопа 0"' Если Индекс нажатой кнопки равен 0 то сообщаем об этом
If Command1(Index).Index = 1 Then MsgBox "Нажата кнопа 1"
If Command1(Index).Index = 2 Then MsgBox "Нажата кнопа 2"
If Command1(Index).Index = 3 Then MsgBox "Нажата кнопа 3"
If Command1(Index).Index = 4 Then MsgBox "Нажата кнопа 4"
If Command1(Index).Index = 5 Then MsgBox "Нажата кнопа 5"
If Command1(Index).Index = 6 Then MsgBox "Нажата кнопа 6"
If Command1(Index).Index = 7 Then MsgBox "Нажата кнопа 7"
If Command1(Index).Index = 8 Then MsgBox "Нажата кнопа 8"
If Command1(Index).Index = 9 Then MsgBox "Нажата кнопа 9"
If Command1(Index).Index = 10 Then MsgBox "Нажата кнопа 10"
S = 1 ' S = 1, это для того чтоб при нажатии на кнопку не происходили ошибки, т.к. начнут создаваться кнопки, а они уже есть, и VB ругаться начинает
End Sub
Private Sub Form_Load()
S = 0
End Sub
Исходник ищи Здесь
В файлах с расширением *.INI хранятся настройки программы, вобще с появлением виндоваза 95(и выше) ini файлы стали не так популярны, т.к. дядя Билл изобрел реестр. В нем на много удабнее записывать настройки, но ini файлы все равно еще живы, т.к. у них есть свои плюсы(например можно переносить настройки вместе с программой на другой комп).
*.Ini файлы выглядят так:(они открываются обычным блокнотом)
[Setup]
Left=1000
Top= 4534
[Other]
Title = Заголовок
То что находится между скобами [] называется разделом, то что перед знаком = - переменная, то что после - значение переменной. В след. шаге сделаем программу для записи в ini файл, а потом чтение. Вобще все операции с ini можно делать только при помощи API.
Как всегда сделаем программу, на форму кинь текст. поле, кнопку(Caption = "Запись"), вот код:
' Объявляем API
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Private Sub Command1_Click()
Dim Left As String, Top As String, Text As String
' Устанавливаем значение переменных
Left = Form1.Left
Top = Form1.Top
Text = Text1.Text
WritePrivateProfileString "Setup", "Left", Left, App.Path & "/set.ini" ' Записываем в раздел Setup в переменную Left значение переменной Left(Form1.Left), и все это записываем в файл set.ini(при помощи App.Path узнаем путь к программе), если этого файла нет то он создается.
WritePrivateProfileString "Setup", "Top", Top, App.Path & "/set.ini" ' Записываем значение переменной Top
WritePrivateProfileString "Text", "Text1", Text, App.Path & "/set.ini" ' Записываем текст, который находится в текстовом поле(в переменной Text)
End Sub
Исходник ищи Здесь
Для чтения файлов есть API GetPrivateProfileString, ща мы сделаем программу, которая при загрузке перемещает форму на то значение, которое указанно в файле set.ini, в разделе Setup, переменной Left. Код:
'Объявляем API для чтения
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Sub Form_Load()
Dim Htenie
Dim z As String
z = Space(255) ' Выделяем место в памяти из 255 пробелов(можно написать так z="255 раз нажми на пробел(хотя можно и меньше(я вписал 255 т.к. это 1 строчка))"), для записи(см. ниже) значения читаемой переменной
Htenie = GetPrivateProfileString("Setup", "Left", "no", z, 255, App.Path & "/set.ini") ' Считываем из ключа Setup, значение переменной Left. Я написал слово "no"(можно вписать любое), это слово нам потом пригодится(если ключа/переменной нет, то z будет равно слову no).
z = Left(z, Htenie) ' убираем все ненужные символы с правой стороны у строки, чтобы получить настоящее значение.
If z = "no" Then
MsgBox "Такого раздела/переменной не существует" ' Если ключа/переменной нет, то сообщем об этом
Else
Form1.Left = val(z) ' Ставим форму на то место, которое указано в файле ini. (в разделе Setup переменной Left)
End If
End Sub
Исходник ищи Здесь
Часто народ спрашивает: "Как убрать мерцание при передвижение объектов??? КАК?????". Вобще для этого есть DirectX, но его хрен два освоишь(по себе знаю), а есть еще и функция BitBlt. У ней возможности намного меньше, но работать с графикой без мерцания она может. Начнем`с... Сделаем программу которая будет перемещать наш рисунок, БЕЗ мерцания.
Очень часто при работе с графикой нужно сделать прозрачный фон у картинки, т.к. фон картинки может не вписываться в фон формы(ил другого объекта). Можно конешно у формы сделать черный фон, и у рисунка, но будет все уродско.
Эта функция нужна для проверки существования каталога или файла.
Я забыл написать ее в пятой части(там о работе с файлами), а теперь этот шаг туда не помещается. Начнем`с.
На форму кинь кнопку, вот код:
Наверняка, если ты напишешь супер программу ты захочешь на ней бабло заработать. Вот только может хрень такая получиться, ты продашь челу программу, а он начнет ее распространять(сайты всякие делать, на болванки скидывать(и продавать)). Так чтоб этого избежать, т.е. защитить свою программу от пиратов и злых дядек, надо сделать регистрацию программы. Т.е. программой сможет пользоваться только тот кто заплатил за нее деньги, и зарегистрировал. Надо сделать так, что б на каждом компе был свой серийный номер и ключ, т.к. если у всех будут одинаковые ключи и с/н то ты продашь ее одному челу, а он начнет всем говорить коды. автор учебника: Падре Место под Банеры
На форму кинь, Таймер, Picture, и засунь туды какой - нибуть рисунок(главное чтоб не очень большой, можешь мою фотку взять: )
Теперь установи свойства для формы:
Form1:
Scalemode = 3-Pixel
Теперь свойства для Picture1:
ScaleMode 3-Pixel
Picture1 AutoRedraw True
Picture1 Visible False
У таймера:
Timer1 Interval 1
Код:
' Объявляем API
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Dim x As Long, y As Long
Private Sub Form_Load()
Draw ' Запускаем функцию
x = 0
y = 0
End Sub
Function Draw() ' Функция Draw
Form1.Cls ' Очищаем форму
' При помощи функции BitBlt берем картинку из Picture1(ширина и высота картинки равна ширине и высоте Picture1), и начинаем рисовать ее на форме с координатами x и y
BitBlt Form1.hDC, x, y, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hDC, 0, 0, vbSrcCopy
Form1.Refresh ' Обновляем форму(при использование свойства AutoRedraw = True, форму надо всегда обновлять...)
End Function
Private Sub Timer1_Timer()
' Перемещаем картинку в право на 1 пиксель
x = x + 1
' Опускаем ее вниз
y = y + 1
' Повторяем функцию Draw
Draw
End Sub
Исходник ищи Здесь
ШАГ 158
Функция BitBlt. Маска:
А вот для создания картинки с прозрачным фоном нужно создать маску этой картинки, а у самой картинки сделать черный фон. Не будем далеко уходить, и возьмем мою фотку. Вместо зеленого фона, сделаем прозрачный. Начнем.
Для начала сделаем у картинки черный фон, и маску(белый фон, а сама картинка черная):
Картинка:
Маска
Для создания маски(и фона самой картинки) я использовал обычный Point(Программы>>Стандартные...), хотя намного удобнее будет в FhotoShope, ил др. граф. редакторах. При создании маски главное чтоб все изображение было черным.
Теперь перейдем к программной части, на форму кинь 2 Picture:
ScaleMode = 3-Pixel
AutoRedraw = True
Visible = False
У Picture1 Picture = "Маска.gif"
У Picture2 Picture = "Картинка.gif(только не просто картинка, а та что с черным фоном)"
Свойства Form1:
Scalemode = 3-Pixel
AutoRedraw = True
И кинь еще кнопку на форму, ОК?
Вот код:
' Объявляем API
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Sub Command1_Click()
' Рисуем маску на форме(с режимом vbSrcAnd)
BitBlt Form1.hDC, 0, 100, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hDC, 0, 0, vbSrcAnd
' Рисуем саму картинку(с режимом vbSrcPaint)
BitBlt Form1.hDC, 0, 100, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture2.hDC, 0, 0, vbSrcPaint
Form1.Refresh ' Обновляем форму
End Sub
Исходник ищи Здесь.
ШАГ 159
Функция Dir
Private Sub Command1_Click()
If Dir("c:\1.txt") <> "" Then ' Если файла/папки не существует, то функция возвращает "", если же существует, то функция возвращает имя файла
MsgBox "Файл существует"
Else
MsgBox "Файл не существует"
End If
End Sub
Теперь создай в диске C:\ файл текстовой с именем 1, нажми на кнопку, а потом удали файл, и опять нажми.
Исходник ищи Здесь.
Друние функции
1. FileLen - Узнает длину файла. Пример: Print FileLen("c:\1.txt")
2. FileDateTime - Узнает дату последней модификации файла. Пример: Print FileDateTime("c:\autoexec.bat")
ШАГ 160
Делаем регистрацию для своей программы
Ну, тянуть не буду, скажу идею:
На форме 2 текст. поля, первое текст. поле это с/н, при первом запуске программы в заныканый файл(или реестр) записывается случайный с/н(RND). Второе текстовое поле, это ключ. Он высчитывается в зависимости от с/н, по определенной формуле(например ключ = с/н * 3/555+1). Так вот, чел присылает тебе свой с/н(а он на каждом компе свой) + бабло, а ты ему ключ. Идею понял?? Ну тогда начнем`с:
Как я уже и говорил, на форму кинь кнопку(Caption = "Регистрация"), 2 текст. поля(в ряд), 2 метки(у первой Caption = "Серийный номер", она находится напротив первого текст. поля, у второй: Caption = "Ключ", напротив второго текст. поля). Вот что у тебя должно получиться:
Теперь подайдем к коду:
Dim SNPath As String ' В этой переменной будет храниться путь к заныканому файлу с с/н
Dim GetReestr As String ' В эту переменную будет читаться данные из реестра
Dim Serial As String ' А эта переменная, будет загружать в текст. поле 1 с/н из файла
Function Start() ' Эта функция будет выполняться если программа зарегистрирована
End ' Я написал End, а ты можешь сюда что - нбудь по умнее вставить
End Function
Private Sub Form_Load()
Randomize ' Этот оператор нужен для того, чтоб всегда генерировались случайные числа(RND(ты что забыл??))
On Error Resume Next ' Если происходит ошибка, то игнорируем ее
GetReestr = GetSetting("proga", "serial", "serial") ' Читаем из реестра значение параметра serial(если serial = 0, значит программа не зарегистрированая, а если 1 то зарег-на)
SNPath = Environ("windir") & "\key.sn" ' В переменную SNPath - записываем путь к заныканому в папке windows файлу key.sn
f = FreeFile
If Val(GetReestr) <> 1 Then ' Если GetReestr не равен 1, то продолжаем регистрацию, если же = 1, то программа уже зарегистрирована
If Dir(SNPath) = "" Then ' Если файла с с/н не существует, то:
Text1.Text = Fix(Rnd * 8000000000#) ' Генерируем случайное число(в любом пределе, можно вместо 8 с деветью нулями написать любое число), и округляем его(Fix())
Serial = Text1.Text ' Это число записываем в перем. Serial
Open SNPath For Output As f ' Открываем заныканный файл
Print #f, Text1.Text ' Записываем в него с/н из текст. поля 1
Close #f ' Закрываем
SaveSetting "proga", "serial", "serial", 0 ' Записываем в реестр параметр Serial со значением 0(ноль означает что программа не зарегистрирована)
Else ' Если же файл существует, то читаем из него с/н
Open (SNPath) For Input As f
Serial = Val(Input(LOF(f), f))
Text1.Text = Serial ' В текс. поле помещаем с/н
Close #f
End If
Else ' Если же в реестре параметр Serial = 1(программа зарег-на), то запускаем функцию Start
Start
End If
End Sub
Private Sub Command1_Click() ' При нажатии на кнопку:
Text1.Text = Serial ' Копируем в текст. поле значение переменной serial(на случай, если чел изменил текст в текст. поле 1)
If Text2.Text = Fix(Val(Serial) * 3 + 333 / 2) Then ' Вот самое интересное :-), если текст. поле 2(ключ) равен с/н умноженному на 3 + 333 / 2
SaveSetting "proga", "serial", "serial", 1
MsgBox "Программа зарегистрирована"
Start ' Запускаем функцию Start
Else
MsgBox "Введен не правильный ключ!!! Для регистрации отправь автору программы с/н и $, а он вышлет тебе ключ"
End If
End Sub
Ну вот и все, чтобы узнать ключ с/н * 3 + 333 / 2. Для этого лучше написать программу(см. след. шаг)
Исходник ищи Здесь.
Дата создания: 12 декабря 2003 года