Iosif Gartsman : другие произведения.

Визуал Бейсик изначальный

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Ссылки:
Школа кожевенного мастерства: сумки, ремни своими руками
Оценка: 6.00*3  Ваша оценка:
  • Аннотация:
    Глава3


Ну, с чего начнем?
	Разумеется, с нового проекта, он у нас эпохальный. 
Сделаем впервые, уже вполне коммерческую программу. Пона-
чалу, помечтаем, что бы делала наша программа? Чего нет у 
других? И, Спартак, свою армию наращивал не в миг один, на-
чинал с десятка друзей, кончил жизнь героем, во главе десятка 
когорт, а победа первая, была только над манипулом римлян, 
охранявшим школу гладиаторов.. Итак, посоперничаем с 
Notepad, первое, что унижает его? Невозможность открытия бо-
лее одного документа и удручающее однообразие цвета шрифта 
и тип оного. Вот и хорошо! Переплюнем Микрософт! С ее же 
благословения, ведь откуда дровишки, господа? VB?
Значитца, предполагается, что унылая Form1, уже пред соколи-
ными взорами моих читателей. Не подобает девушке быть без 
присмотра, заключим форму под защиту MDI-form, что за 
фрукт?
 
Понимаете, я до сих пор делал SDI-формы, то есть программы 
с интерфейсом, что видели, или того же Notepad, а это будет, 
программа типа Word’а.
SDI, уже имеем и так, добавим в проект MDI. Для этого, в 
панели Бейсика, нажмем на пункт меню “Project”, а там,  “Add 
MDI Form”. Конец делу. Имеете шикарную, многооконную 
программу, спасибо гейтсковскому дитяте, за заботу. Еще тело-
движение и все заработает. Вернемся к первой форме, в ее пане-
ли свойств, измените значение поля MdiChild, на True, этим  
сообщим королеве, что у нее, как минимум, 1 подданная 
имеется. Будьте уверены, наша MDI-форма очень довольна, как 
будете и вы, запустив сейчас программу, дав волю мании пре-
следования. Как видите, я вас не обманул. Однако, вот, непри-
ятность, закрыли SDI-форму или  иначе говоря, дочернюю, и не 
видать нам как своих ушей, ее больше.  Дело, однако, поправи-
мое. Мы же программисты, нет? Сделаем, меню, в главной 
форме. Кстати, давно, пора окрестить новорожденных. MDI-
форму назовем  frmEdtor, а SDI-форму frmPad. В их Caption’ы 
предлагаю соответственно, My Editor и Message. Чтобы создать 
пункт в меню, сначала привлеките внимание, VB 5.0, к форме, 
щелкнув по ней. Когда она, с пунцовым личиком, от всеобщего 
внимания, появится на переднем плане, жмем пункт меню, в 
панели Бейсика. Пункты, TOOLS, далее, MENU EDITOR. И...

Должны увидеть, как на рис. 22, искомое..
Наша конечная цель получить то же, что на рис.23. Для этого, 
в редакторе  меню, дважды похлопаем по кнопке Insert. По-
имеем 2-е пустоты. Нормально, перещелкнем в 1-е пустое место, 
сверху. Щелкаем в окошко Caption для активации, набираем 
имя пункта меню, File, которое и будем видеть в работающей 
программе. После этого, жмем на клавиатуре “Tab”, курсор 
перейдет в поле Name, там наберем mnuFile, родив этим, новый 
объект в программе. Рекомендую, в идентификационных полях 
объектов, всегда, первыми 3-мя буквами обозначить тип 
объекта, для более легкой, в последующем, навигации по коду 
программы. Принято, для форм, писать frm, а для меню - mnu, 
кнопок - cmd и т.д. 
После этого, щелкнем под появившимся в списке меню, File, 
на “пустом” месте, что оно выделяется, говорит, что таки, не 
пустое.
 Нажмем в редакторе на кнопку со стрелкой вправо, появится 
строчка с точками, это сообщение, что создаваемое меню, 
подменю предыдущего. (Если еще раз, то точки удвоятся, будет  
подменю для подменю.)
Повторим операции по вводу имен. Предлагаю: Add Message, 
mnuADD, готово? Закроем редактор менюшек, нажав на “ОК”. 
В форме должно появиться меню, как на рис.23. Запустите My 
Editor, полюбуйтесь на выпадающее меню, из File. А оно не 
работает, нет кода. Будет вам и код. Выключив программу, 
опять вызовите редактор меню, установите выделение на меню 
File, и щелкните в переключатель WindowList, поставив 
галочку. Закройте редактор, пускайте опять программу, 
щелкните по меню и увидите, что внизу метка, что в данный 
момент имеется 1 форма!
Разве это не чудесно, иметь список всех запущенных форм? 
Пригодится.
С вас, причитается мне пиво.
Неужто не заслужил?.. Ну, тогда продолжим..		
В режиме проектировки программ, жмем на меню, как видите, 
выпадает подменю, оно уже и выдает редактор кода, при нажа-
тии на нее. В нем и напишем, сей код:
	Dim NewObj As New frmPad
		NewObj.Show
И всех делов-то.. Помните, я упоминал, о типах переменных? 
Сейчас именно такой случай, когда это совершенно необходимо, 
указать точно. В данном случае, я заказал создание нового 
объекта. Слово NEW, является ключевым, для этого. Оно, 
объявляет, все, что можно создать, новым! После этого, я 
попросту, делаю видимым, этот, новый объект.. Каждый раз.. 
Наслаждайтесь! 
Однако..
	Вот, досада, их куча и все одинаковы, близняшки! Нет, 
не годится путаться в собственных отпрысках.
Добавим, еще пару строк кода, в то же событие:
		Private Sub mnuAdd_Click()
	Dim NewObj As New frmPad
		Static Ancker As Byte
NewObj.Caption = "New Message " & "Љ" & Ancker
		Ancker = Ancker + 1 
	NewObj.Show
		End Sub
Теперь могу и отдохнуть, пока вы поиграете с прибавками 
семейства.
Static Ancker - это, переменная, для счета нажатий на пункт 
меню.Так как, этот объект, “не имеет тела”, ему просто негде 
хранить последнее значение переменной, как могут, те же, 
скажем, Form’ы. Я, вынужденнно, объявил переменную, не 
через Dim, а посредством ключевого слова Static , оно 
принудительно заставляет программу помнить последнее 
значение объявленной, за ней, переменной. Что и требовалось. 
А значение свойства Caption, я изменяю, на этот раз, не в поле 
панели Properties, а непосредственно в коде. И только. Разницы 
никакой. Компьютеру, он один истинный демократ в этом мире, 
все равно.. Вернемся-ка к frmPad, нарисуем на ней объект 
RishTextBox. Надеюсь, не забыли, как его добывать? Покройте 
им все свободное пространство формы. С этого момента, при 
пуске программы, мы имеем, при желании, бесконечное 
количество MESSAGE’гов.
      Но, нащелкав их, великое множество, породили проблему 
их упорядочивания на экране.
Придется в frmEditor, завести новую менюшку, с пунктами, 
которые будут расставлять все записки по местам, каскадом, по 
вертикали или по горизонтали, ну, упорядоченно. Для этого, 
опять вызовите редактор меню и выделив последнюю строчку, в 
списке менюшек, нажмите на кнопку Next, и еще, еще и еще раз, 
полученные строки обработаем в их полях, как и предыдущий 
раз. Давая, им, последовательно, имена: mnuWindow, 
mnuCascade, mnuHorizontaly, mnuVerticaly, их же надписи: 
Window, Title Cascade, Title Horizontaly, Title Verticaly. 
У mnuWindow, когда закончите, щелкните кнопочку со 
стрелкой влево. Этим, вы сделаете новый главный пункт меню, 
а все остальные меню, что под ней, станут ее подменю, а не 
подменю меню File! Сделав дело, не спим, а щелкаем по новым 
пунктам меню, вызывая редактор кодов. И:
	Private Sub mnuCascade_Click()
frmEditor.Arrange vbCascade
	End Sub

	Private Sub mnuHorizontaly_Click()
frmEditor.Arrange vbHorizontal
	End Sub

	Private Sub mnuCascade_Click()
frmEditor.Arrange vbVertical
	End Sub

Так как, форма - MDI, она имеет особый метод Arrange, он и 
делает всю работу. vbVertical и т.д. - это ее значения 
(аргументы), по которым она узнаёт, какой вид работы выпол-
нять. Удивительно просто, верно? Теперь, вперед, Шма Исра-
эль! В меню File, добавим  еще пункты подменю: Save, Save As, 
Open. Сделаем еще и 3-ю, главную, меню - пункт: Color Text, с 
именем mnuClrTex, с ее подменюшками: Red, Blue, Green, 
Wellow, Black, ну, хватит и за глаза.
Набьем их кодом, как питу шуармой.
	Private Sub mnuRed_Click()
Screen.ActiveForm. RishTextBox1.ForeColor = vbRed
	End Sub
Повторите этот код, для всех остальных событий, для 
менюшек в Color Text, заменяя vbRed на другие цвета, 
соответственно, vbBlue, vbGreen, vbWhelow, vbBlack. Теперь, 
имеем текст разных цветов, как в Word 7.0! Но, почему такая 
длинная строчка у кода? А то, что я знать не знаю, с какой MES-
SAGE  работаю, Screen.ActiveForm, вот это, и ищет, конкрет-
ную, активную записку, далее, Бейсик работает с ее объектами, 
как обычно. ForeColor это свойство, присваивающее, указан-
ному объекту, цвет “переда”.
Для текстового объекта это текст, для графики, это может быть 
рисуемая линия, круг и т.д.
Фон же, то есть “бумагу” закрашивает команда BackColor. Как 
ее использовать, предлагаю уж, догадаться вам самим.
На frmEditor, добавьте объект CommonDialog, он как пом-
ните, добавляется в панель инструментов, вручную. Сделайте 
это.
Теперь, можем писать код для пунктов Open, Save...
 	Private Sub mnuOpen_Click()
CommonDialog1.Filter = "Text Files (*.txt)|*.txt| Formated Files 
(*.rtf)|*.rtf|"
CommonDialog1.DialogTitle = "Open message"
 CommonDialog1.ShowOpen
        If Len(CommonDialog1.filename) = 0 Then
            Exit Sub
        End If
	 If Len(CommonDialog1.filename)<> 0 Then
Screen.ActiveForm.RishTextBox1.LoadFile 
CommonDialog1.filename
	End If
	End Sub
Я использовал свойство Filter для уборки ”мусора”. Ни к чему 
видеть, в окне диалога, файлы, что априори, недоступны. 
DialogTitle, это, что формирует заголовок окна диалога. 
Len - подсчитывает длину текста (кол-во символов).
	
	Private Sub mnuSave_Click()
	If Len(CommonDialog1.filename)<>0 Then 
Screen.ActiveForm.RishTextBox1.SaveFile    frmEdit.CommonDialog1.file-
name 
Screen.ActiveForm.RishTextBox1.Caption = frmEdit.CommonDialog1.file-
name
	End If 
	End Sub
	
	Private Sub mnuSaveАs_Click()
	CommonDialog1.Flags = 2099206
       CommonDialog1.DialogTitle = "save message"
    	On Error Resume Next
CommonDialog1.ShowSave      
Screen.ActiveForm.RishTextBox1.SaveFile frmEdit.CommonDialog1.file-
name
Screen.ActiveForm.RishTextBox1.Caption = frmEdit.CommonDialog1.file-
name
	End Sub
Это, что за цифры в строке: CommonDialog1.Flags = 2099206 ?
Это установка, для окна диалога, следить, не валяем ли мы 
дурака, записывая файл поверх старого, нужного или 
ненормальное имя файлу придумали.. Каждое из этих действий 
имеет свой код - число, они суммируются и результирующее и 
пишешь туда. 
Я, в свое время, подсчитал для себя, желаемые, мной, числа
 и просто помню результат. Его пишу везде и всегда, вы же, 
можете составить собственный коктейль настроек. В хелпе 
поглядите возможные значения и подсчитайте желаемое себе. 
Для этого поместите курсор в Flags, и бух на F1, увидите 
справку по ним.
Остальное, вы уже способны, и без комментариев, понять, если 
читали предыдущие главы. Могу посоветовать вам в редакторе 
меню, для Save снять флажок Enabled, а в конец события 
Private Sub mnuSaveАs_Click(), добавить, в конец, строки :
	If Len(CommonDialog1.filename)<> 0 Then
mnuSave.Enabled=True
	End If
Это обеспечит вам чистоту работы программы, когда она 
запускается, пункт Save будет недоступным, тусклым. Но, когда 
вы, хоть раз, запишете файл, то это меню станет доступным и 
позволит записать файл, под уже заданным именем, в прошлом.
В панели свойств, для текстового блока, что в frmPad, в поле 
AutoVerbMenu, поставьте - True. Это обеспечит вас, при 
щелканье правой кнопкой мышки, на объекте, выпадающим 
меню, с кучей очень полезных услуг. Кстати, не забудьте 
установить нужные значения, для свойств: MultiLine, ScrollBar. 
Если пожелаете, чтоб был автоматический перенос слов, при 
достижении края текстового блока, то в поле свойства 
RightMargin, впишите 1.
В общем, программа вчерне готова.
Не хватает, только, чтоб при изменении размеров форм, разме-
ры текстового блока изменялись тоже, сохраняя пропорции.
Для этого, мы впервые, воспользуемся событием, из списка 
возможных, в форме frmPad. Вызовем редактор ее кода, в левом 
списке выберем - fоrm, в правом списке, из всех ее событий - 
событие Rеsize, когда форма меняет размер своего окна, генери-
руется это событие. Щелкнув по нему, увидите это событие, в 
коде. Если вы, чтоб вызвать редактор, щелкали по форме, то у 
вас получится, в итоге, 2-а события  
в коде: 
Private Sub Form_Load()       ?	Private Sub Form_Resize()
Событие по умолчанию, VB дает	.	Это уже, мы сами вставили.
	End Sub				 End Sub
?Сюда, ничего, вообще удалить!   ?А вот сюда, код вставим. 
Всего 2-е строчки!
Screen.ActiveForm.RishTextBox1.Move 0, 0, Screen.ActiveForm.Whidth 
Screen.ActiveForm.RishTextBox1.Move 0, 0, Screen.ActiveForm.Height
Команда MOVE перемещает любой указанный объект, я 
указал изменение ширины и высоты. По величине одноименных 
свойств формы, и текст. блок следует за формой, как привя-
занная к хвосту кошки, консервная банка. Так как, изменяются 
только эти, 2-а параметра, то вместо перемещения, мы видим 
только синхронное изменение размеров, с формой. Если, охота 
видеть “отбортовку” у краев, то уменьшите величины границ 
текст.блока, по отношению к границам формы. Например:
...............Screen.ActiveForm.Whidth - 25
..............Screen.ActiveForm.Height - 25
Величину отступа подберите сами, по желанию.
Сохранив проект, на диск, пообщайтесь с любимыми, пусть 
ЭВМ отдохнет... А, я соберусь с мыслями.
Будем делать графику. Мы учимся, посему и сделаем графику 
в другом проекте, в конце концов, ничто не помешает, потом, 
присоединить новый код в старый проект. А для усвоения так 
удобнее.
Сделайте все, то же самое, что делали только что, но текст. 
блок не  рисуйте. Меню сделайте также, такое же. Вот, код бу-
дет немного другой. В меню Window, правда, весь код, копия 
того.
Итак, при старте проектирования, имеем код только в меню 
Window,  имена формам, для разнообразия дадим другие, глав-
ной - frmPaint, дочерней -  frmGraficka.
		Private Sub mnuAdd_Click()
	Dim NewObj As New frmGraficka
		Static Ancker As Byte
NewObj.Caption = "New Message " & "Љ" & Ancker
		Ancker = Ancker + 1 
	NewObj.Show
		End Sub
Обратите внимание на крохотное несходство одноименной 
менюшки, здесь, от ее товарки, в frmEdit! 
Подготовка закончена. Осталось ввести пару строк кода и 
программа начнет пачкать красками все вокруг.
Откройте редактор, для frmGraficka, пользуясь драгоценными 
крохами знаний, откройте события:
Private Sub Form_MouseDown (Button As Integer, Shift As 
Integer, x As Single, y As Single)
If Button And 1 Then okDrawing = Not (okDrawing)
	CurrentX = x
		CurrentY = y
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As 
Integer, x As Single, y As Single)
	If okDrawing Then Line - (x, y)
End Sub 
Не забудьте, только задекларировать эту переменную.
	Dim okDrawing As Boolean

Все, запускайте и рисуйте, как Пикассо, углем. Если желаем 
уподобиться Гогену, айн момент, сварганим, и сейчас же. Для 
этого, бросаем эту форму, целуемся со главной красоткой. С 
frmPaint, в ней, не торопясь, добавляем еще меню: Line, в ней 
подменюшки: Сolor и Cize. А, в них, соответственно, свои под-
меню.
У Сolor, само собой, будет выбор цветов линий, стало быть:
Red, White, Blue, Yellow, Black, Green, Margenta, Cyan.
У Cize, само собой, будет выбор толщин линий, стало быть:
1, 2, 3, 4, 5, 6, 7, 8, 9.
Когда, эти пункты будут налицо, общелкайте их, чтоб комп 
понавставлял их события в код.
  Для заначки, вот:
Private Sub mnuRed_Click()
	Screen.ActiveForm.ForeColor = vbRed
End Sub

Private Sub mnu1_Click()
	Screen.ActiveForm.DrawWidth = 1
End Sub
Напишите, раз, эти строки, а потом покопируйте их, в другие 
события. Потом, за минуту, в каждой строке ( см. в их конец ), 
смените названия цветов, на соответствующие, имени меню, то 
же и с толщинами линий. Чего повторяться? Они же почти 
идентичные.
Берегите нервы смолоду, они, как известно, не восстанав-
ливаются. Или, время  деньги. Теперь, объясню, что за фокусы с 
кодом.
Проще всего про цвет, уже пробовали с текстом. Сами знаете. 
Толщина линии, по тому же принципу, только у них параметр 
другой, используется метод DrawWidth, можно увеличивать 
толщину, разумно, до 9. Если, надо еще толще, то обычно, 
используются другие способы. Сколько программеров, столько 
и способов. А, вот чтоб, мышь рисовала, это любопытная шутка.
Я задекларировал общую, для всей программы, переменную, 
Dim okDrawing As Boolean, она имеет тип, способный иметь, 
только 2 значения, True и False, то есть истина и ложь. Так на-
зываемая, булева величина, логический переключатель. Введена 
для того, чтоб, в зависимости от очередного нажатия на мышку, 
рисовало или нет, а в дополнение, еще подусловие, какая кнопка 
была нажата, Button And 1, если бы была, левой кнопкой, Button 
And 2, то реакция на правую кнопку. Но, может и наоборот сра-
батывать, если вы себе, в Виндоус, делали в опциях настройки 
мыши, настройку ее клавиш, для левши.
Вот, когда okDrawing, “истина”, комп реагирует на нажатие 
мыши, эти штучки, CurrentX, CurrentY, в событии Form_ 
MouseDown, возвращают, координаты места, где вы изволили 
щелкнуть мышкой, с присваиванием их значений моим 
переменным х и у.
Почему именно в это событие?: Form_MouseDown, а потому, 
что оно вызывается, когда кнопку мыши отпускают, самое 
время знать координаты начальной точки для рисования, 
прекращения этого, в зависимости состояния переключателя. А, 
это событие: Form_MouseMove, генерируется программой, ког-
да мышь двигается, ну как не сейчас, сидеть пнем? Малюйте 
или прицеливайтесь на новый мазок!
Line, это команда рисовать линию. Line - (x, y), это не полный 
ее синтаксис, но, это нарочно. Если, не указать начало коор-
динат, то по умолчанию начало считывается с последнего места 
его фиксации, то есть, от последнего места, где щелкали мыш-
кой. А, останов линии, где опять, щелкнем мышкой. Событие 
щелчка генерируется первым и успевает передать данные по х и 
у, событию движения мыши, а потом оно само себе дает данные. 
Вы видите линию, а на деле, это очень близко стоящие рядом 
друг с другом, точки. Сливаются под нашим несовершенным 
зрением. Сейчас, ознакомимся с полным синтаксисом этой 
команды. Сделаем с ее помощью, шахматную доску.
Создайте новый проект, 1 SDI - форма...
В ее коде, откройте событие Paint. Введите это:
	Private Sub Form_Paint()
For i = 0 To in - 1
    For j = 0 To jn - 1
If (i + j) Mod 2 = 0 Then c = vbWhite  Else c = vbBlue
Line (x1 + i * Sx, y1 + j * Sy)-(x1 + (i + 1) * Sx, y1 + (j + 1) * Sy), c, BF
    Next
	Next
	End Sub

 Const jn = 8, in = 8, Sx = 500, Sy = 500, x1 = 500, y1 = 500

Примитив, верно?
Всех делов, задать 2 цикла, они заняты тем, что задают 8 
квадратов по вертикали и горизонтали. Интересно то, что они 
чередуются цветом. х1, у1 задают отступ от края формы, для 
красоты. Можете, их, не писать вообще. Sy, Sx определяют 
размер квадра-тов. А, сами они, возникают от команды Line.
Это не парадокс, а военная хитрость. Дело в том, что у этой 
команды, есть довесок - BF.
 Он и задает прорисовку прямоугольника. Если убрать F, 
получите рамку, с толщиной линии принятой по умолчанию, 1, 
или можете в событие Load формы, поставить строчку, 
задающую другую толщину, ее, что-то вроде: Form1.DrawWidth 
= 7.
 
Когда форма запустится, это уже будет задано  по умолчанию, 
при рисовании. Взгляните на рис 26. Он поясняет схему дейст-
вии этой программы.
Если охота увидеть и другие графические фокусы, добавьте 
этот код, в событие “ MouseDown ”, для формы. См. ниже:
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X 
As Single, Y As Single)
If Button And 1 Then
' случайно получаем цвет.
FillColor = QBColor(Rnd * 15)
'случайно получаем стиль закраски.
    FillStyle = Int(Rnd * 8)
 ' рисуем эллипс, его размер и место.
Circle (X, Y), (70 * Rnd), vbRed, , , Rnd * 4
 ' рисуем круг, его размер и место.
  Circle (X + 80, Y), (50 * Rnd), RGB(Rnd * 255, Rnd * 255, Rnd * 255)
  ' рисуем сектор, его размер и место.
Circle (X, Y + 80), (70 * Rnd), vbBlue, -1, -0.6, Rnd * 4
End If
 
 If Button And 2 Then
 i = MsgBox("Quit?", vbOKCancel, "Question")
If i = vbOK Then End
      End If
End Sub
Как видите, нового почти и нет..
Только команда Circle, она делает круг, но она может и 
большее. Если исполь-зовать полный синтаксис, то вы сможете 
и эллипсы сгенерить и сектора дуг, круги, уже обгрызенные 
Карлсоном, “мужчиной в расцвете лет“ и с пропеллером. 
Наверное, за торт принял. В общем, трясите хелп по этой 
команде, много чего посыплется интересного. А пока, смотрите 
на рис.26а пример.
Обратите особое внимание на скобки! Что за словами “Mouse-
Down”, в них параметры с которыми оперирует эта функция. 
Button и X,Y. Только благодаря этому, мы можем узнать где 
щелкнули мышкой и какой кнопкой. Так вот в событии 
“Click()”, этот же, наш, код уже не сработает! Почтите своим 
вниманием так же очень важные установки свойств формы как 
ScaleMode и DrawMode. Они устанавливают масштаб , отсчет 
координат и вид рисования (перо). Поиграйте с ними, результат 
может быть ошеломляющим и это-то при одном, неизменном 
коде в редакторе!
В программе, я не предусматривал кнопку, для выхода из прог-
раммы, ее закрытия, я обычно, для этого использую событие 
правой кнопки мыши. Как видите, тут вызываю окно сооб-
щения, если нажал в нем “ОК”, кончина бедняжки неизбежна..
 
Правда, чтоб там было 2 кнопки, для возможности выбора, я 
вписал в серединку: vbOKCancel, потом, и будут кнопки ОК и 
Cancel, могу и больше кнопок! Максимум 4, да куда ж, больше 
надо, для скромного окошка?! Если узнаете, что можно и 
картинки там понавставлять, утешитесь? Так вот, если добавить 
“64”, к примеру, vbOKCancel + 64, то будет вам картинка, 
”внимание!”.
Единственное что, это я забыл упомянуть, что когла мы в прог-
рамме, Paint, делали увеличение, перемещение форм, и рисунки 
пропадали, это не дефект, а такая настройка свойств у формы. 
Программа не перерисовывает каждый раз графику, если свой-
ство формы, AutoRedraw, в False, надо в True. Поправьте и все 
будет в порядке. Но, если скажем, хотите иметь “ластик”, то это 
значение свойства, вам еще понадобится. Кажется, с графикой 
покончил. Пора анимацию просекать. Я что-то устал, пора 
отдохнуть, может и вам?.. До Лас-Вегаса далеко, сделаем себе, 
его, на дому.
Вот код “однорукого бандита”:
Dim I As Integer   ‘счетчик таймера
Dim S As Integer   'это монеты, казна казино
Private Sub Command1_Click()
	End 	      ‘выход из программы, коль проигрались.
End Sub
Private Sub Form_Load()
Randomize 	     ‘ улучшение работы крупье
S = 12  	‘    вся мошна заведения
End Sub
Private Sub Image1_Click()
    If Text1.Text <> "" Then
'бросание костей
Label1.Caption = Int(Rnd * 10)
' переключение рычага
Image1.Visible = False
    Image2.Visible = True
        End If
 'условие для запуска обогащения
    If Text1.Text = Label1.Caption Then
Timer1.Enabled = True
      Image2.Enabled = False
  End If
'чтоб не жульничали! 1 раз - 1 розыгрыш!
If Text1.Text <> Label1.Caption Then Text1.Text = ""
  End Sub
	Private Sub Image2_Click()
  'очистка игрового стаканчика
    For a = 0 To 11
Image4(a).Visible = False
    Next a
' переключение рычага вверх
Image2.Visible = False
    Image1.Visible = True
	End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
	If KeyAscii = 13 And Text1.Text <> "" Then
'бросание костей
Label1.Caption = Int(Rnd * 10)
' переключение рычага вниз
Image1.Visible = False
    Image2.Visible = True
    'условие для запуска обогащения
If Text1.Text = Label1.Caption  Then
Timer1.Enabled = True
      Image2.Enabled = False
'если уже выигрывали, надо восстановить финансы казино
S = 11 
 End If
	End If
'чтоб не жульничали! 1 раз загадал - 1 розыгрыш!
If Text1.Text <> Label1.Caption Then Text1.Text = ""
  If Text1.Text = "" Then
    Image2.Visible = False
       Image1.Visible = True
     'очистка игрового стаканчика
    For a = 0 To 11
Image4(a).Visible = False
    Next a
    End If
	End Sub
Private Sub Timer1_Timer()
'движение монеты
Image3.Visible = True
  Image3.Move Image3.Left, Image3.Top + 200 + I
	If Image3.Top + 850 >= Picture1.Top Then
Image3.Top = 500
S = S - 1                     'подсчет очередной монеты в столбике
    If S <= 0 Then        'ограничение цикла этого подсчета
Timer1.Enabled = False
  Image3.Visible = False
     Image3.Top = 500
        Image2.Enabled = True
Text1.Text = ""
Exit Sub
     End If
'заполнение стаканчика монетами
Image4(S).Visible = True
End If
I = I + 1  'счетчик
	End Sub
Сначала, где нибудь нарисуйте или готовыми возьмите изобра-
жения монеты и монет для столбика монет, рукоятки (2 положе-
ния). Вполне годится любая граф. программа. Рисунки, через 
буфер вставьте в Image’и. Вот заготовки (рис.28 и +):
       

На рис.29 процесс выигрыша.

 
Предполагаю, что все из рисунков, имеете. Чтоб, размножить 
Image4, я сначала нарисовал PictureBox1, сразу же, пока он был 
выделенным, щелкнул по иконке Image и нарисовал ВНУТРИ 
PictureBox1, эту Image4! Она стала частью PictureBox1. Как 
говорится, в контейнере. Коим является PictureBox1, вообще-то, 
и форма контейнер. Но, помощнее. Суть же, одна.
Ну, после этого я выделил мышкой эту Image4 и скопировал ее 
в буфер, после вставил из буфера туда же. Комп запросил, 
делать ли массив на основе Image4? Я сказал - Да. После этого, 
еще покопировал в PictureBox1 из буфера, эти картинки. Бейсик 
сам им присвоил порядковый номер, чтоб не путаться в них. Я 
их расположил поживописнее. Установил для них и Image2, 
Image3 в cвойстве Visible, значение False. Теперь, остался толь-
ко код. Я написал его с комментариями, чтоб все было попо-
нятнее.
Я, себе, писал игру, а т.к. я люблю выигрывать, в коде гене-
рируются числа от 0 до 10. Это обеспечивает мне безбедную 
жизнь, но если вы хотите ободрать до липки, ближнего своего, 
то увеличьте диапазон генератора случайных чисел. Вместо :
Label1.Caption = Int(Rnd * 10), напишите,
Label1.Caption = Int(Rnd * 1000), уже достаточно, чтоб казино 
было всегда в выигрыше.
Все команды вам уже известны, по идее. Суть в их сочетании.
Можете себе сделать другой вариант. с 3-5 окошками с 
картинками вместо цифр. Если, выпадут все одинаковые 
картинки, выигрыш. Алгоритм таков: каждая цифра имеет 
ссылку на картинку и она становится видимой, когда генератор 
выбросит ее цифру, вот, Int(Rnd * 4), достаточно ограничиться 
диапазоном, от 0 до 4! Так как, для каждого окошка, свой 
крупье, выиграть уже будет очень трудно. Принцип я показал, 
успехов. Единственно, что неприятно в примере - это повтор 
идентичных строк кода в разных событиях. Это я про 
переключения рычага. Но, если заключить их в оболочки 
собственной функции, то достаточно потом везде проставлять 
имя этой функции и дело с концом. Ее пишем в секторе формы 
“General”. Вот например:
Function Рычаг_Вверх ()
' переключение рычага вверх
Image1.Visible = True
    Image2.Visible = False
End Function            ‘эту концовку, кстати, Бейсик сам вставит.
Теперь достаточно вставить везде только "Рычаг_Вверх".
Удобно, верно? Вы это особенно оцените, если будете писать 
повторяющиеся куски кода размером с книгу.

 
А теперь, галопом по Эвро-пам. Бейсик шикарная штука, вот, 
например хотите броузер? По интернету погулять? Нет проблем, 
даже код не надо писать!
Достаточно создать проект с MDI - формой, удалив Form1, что 
сейчас лишняя. После этого, в панели VB, в меню Project, 
выбрать Add Form, там щелкнуть на “Browser”. Готово. Теперь, 
чтоб программа запустилась, надо всего лишь,  щелк-нуть в 
Project, на Project1 Properties..., выбрать в
 списочке, что спра-ва, frmBrowser. См. рис.31.
 
Этого достаточно, чтоб вы уже имели собственный броузер! 
Если, имеете интернет, про-верьте, не сходя с места, как все 
чудес-но работает!
 
Вы уже заме-тили, что обла-даете целой кучей готовых форм, 
давайте воспользуемся мастером, который их всех, нам, 
поднесет на тарелочке, с голубой каемочкой. Начните новый 
проект, и пощелкайте по иконке, Vb Application Wizard, как на 
рис 32. Не мудрствуя, выберите тип проекта. И сразу на кнопку 
Finish. Вы получите в одном флаконе, почти все формы зараз. И 
все будут между собой связаны! Почти совсем готовая 
программа! 
Не верите, запустите и пробуйте!
Вот он, самый зрелищный вари-ант. Он же по умо-лчанию и 
предла-гается. Впрочем, это дело вкуса, о них не спорят..

Но, я, лично, обо-жаю MDI - вари-анты. Как видите, я даже 
базы данных, не прикладая рук, получил. Если, вы, как я, 
любите все держать “под контролем”, то рекомендую жать 
кнопку Next. И последовательно решить, что включать в вашу 
программу. Шаг первый, выбор типа вида программы (см. 
рис.34).
































Шаг второй (см. рис.35), выбираем, что хотим, для менюшек.. 
После этого окна, 2 запроса - окна, пропустим не глядя, как 
ненужное... Эти, для особых случаев, например, если 
программа, через интернет болтает. Пока не надо это.. Я не 
рискую с этой опцией. И файлов  ресурсов, попросту, нет у нас, 
они в С++ делаются... Правда, в VB6.0, это, уже есть...





























Это, куча форм, для вашего проекта, на первый раз,  попросите 
их все (см. рис.36).
Здесь, выберите базу данных, в следующем запросе, кнопоч-
ками - стрелками, выберите, что бы хотели видеть из данных 
базы (рис.37 и 38).
















И, наконец, финиш (рис.39), чтоб мастер, больше не докучал, 
щелкайте на опцию No. После, с чистой совестью, на Finish.
И получайте с пылу, с жару, товарец. Словили кайф?
Но, вернемся немного назад, к началу победного марша, ту 
кашу из значков, надо было еще переварить.. См. рис.32. 

Только, что пробовали..


Это и так, каждый раз пускали, нет проблем, а вот, 
следующий....

Да, то же самое! Разница, только в том, что панель 
компонентов, постарается ублажить вас, предложив все, что 
есть в наличии. 
Для упакованных юзеров. создает заготовку    для таких 
вещей, какие вы видели в меню VB, (Add-Ins).  Все, что 
там видите, это надстройки (плугины) VB. Как это 
писать, тема не 
для этой книжечки.Увы..

Программа, решающая задачи автоматизации. Для 
многокомпонентного проекта. В общем, сервер автоматизации 
OLE.

То же самое, но оформленное в DLL-файл.
Она только вызывается из других программ. Сама не 
запускается, в отличии от EXE-файлов.

Приложение для работы в Интернете. Запускается в Internet 
Explorer...  Готовый файл - DLL 
То же, разница в типе файла.
Этот - EXE.

Хотите создавать, симпатичные элементы управления, сами? 
Это для вас! После компиляции, увидите свою прогу в панели 
компонентов.. Не боги горшки обжигают..


 

А теперь, усталые и довольные, на переменку




42
Часть 3, Немного о графике и анимации
40
Часть 3, Немного о графике и анимации
 Иосиф Гарцман, декабрь,1998 г. "Визуал Бейсик изначальный"

Глава3,эксперименты с графикой и анимацией.

Оценка: 6.00*3  Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"