Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual Basic для новичков и профессионалов


Информационный Канал Subscribe.Ru

Visual Basic для новичков и профессионалов

Наш Web-портал:

Тема выпуска:
Выпуск #NN
От 23.10.2005
Создание первого приложения "с нуля"
От 23.10.2005

Здравствуйте уважаемые подписчики!


Долгое время не выходила рассылка. Причина этому был МОЙ ЮБИЛЕЙ и работа. В общем, в воскресенье мне исполнилось XX лет. Говорить сразу не буду, а вот погадать вы можете, для этого на форуме была открыта новая тема (http://visualbasic.noka.ru/forum/viewtopic.php?t=29). Жду Ваших поздравлений, хоть и с опозданием, но другого времени небыло. Ну а если писать сообщения в облом, то просьба просто проголосовать. Мне интересны Ваши результаты. Заранее спасибо всем! Искренне на Вас надеюсь.


Также приношу извинения "юным программистам". Если Вы читаете наш раздел для новичков, то извиняюсь за кашу, которая с каждым выпуском становится все более густой. Выбросьте из головы прошлый выпуск и сегодня мы создадим нормальное приложение с нуля.

Теперь о теме выпуска. Все знают (ну может правтически все), что рассылка разделена на две части: новичкам и профессионалам. Для новичков есть раздел обучения, для профессионалов раздел вопросов и ответов. В общем и в разделе вопросов и ответов частенько промелькают новички. Но это не важно. Обратите внимание на тему выпуска, теперь она содержит тему раздела для новичков.

 
Новости сайта, форума
Продолжается работа над сайтом.
 
Обучение для новичков
 

Первое приложение на Visual Basic
Создавать приложения на Visual Basic — это так просто. А как просто? Чтобы ответить на этот вопрос, создадим одно приложение: Hello, Visual Basic.

При создании приложений на Visual Basic необходимо выполнить три основных шага:
1. Создать интерфейс.
2. Установить свойства.
3. Написать код.

Чтобы увидеть, как это делается, следует выполнить шаги нижеследующих процедур создания простого приложения, состоящего из текстового поля и кнопки управления. При нажатии кнопки управления в текстовом поле появится сообщение "Hello, world!"

Создание интерфейса

Формы (forms) являются фундаментом (основой) создания интерфейса для приложения. Они используются для добавления окон и диалогов в приложение. Также их можно использовать в качестве контейнеров (containers) элементов, не являющихся видимой частью интерфейса приложения. Например, можно иметь в приложении форму-контейнер для графики, которую предполагается отображать в других формах.
Первым шагом в построении приложения на Visual Basic является создание форм, которые будут основой интерфейса приложения. Затем на них изображаются объекты, которые и составляют интерфейс. Для нашего первого приложения будем использовать два элемента управления из панели элементов управления (Toolbox).

Чтобы нарисовать элемент управления с помощью панели Toolbox, следует:
1. Щелкнуть на кнопке соответствующего элемента управления — в нашем случае текстового поля.
2. Переместить указатель (pointer) внутрь разрабатываемой формы. Указатель превращается в перекрестие (cross hair).
3. Поместить перекрестие в место, где будет расположен левый верхний угол элемента управления.
4. Перетаскивать перекрестие, пока элемент управления не достигнет желаемых размеров. (Перетаскивание (dragging) означает перемещение объекта при нажатой левой кнопке).
5. Отпустить кнопку мыши, после чего элемент управления появится на форме.
Другой простой путь добавления элемента управления на форму — дважды нажать кнопку соответствующего элемента управления из панели Toolbox. Таким способом создается элемент управления с размерами по умолчанию, расположенный в центре формы, который можно затем переместить в нужное место на форме.

Изменение размеров, перемещение и блокировка элементов управления.

При размещении элемента управления на форме в его углах появляются небольшие прямоугольники, называемые маркерами размера (sizing handles). При выполнении следующего шага мы используем их для изменения размера (resizing) элемента управления. Для перемещения (move) элементов управления, блокировки (lock), разблокировки (unlock) и регулирования местоположения элемента управления можно использовать мышь, клавиатуру и команды меню.
Для изменения размеров элемента управления следует:
1. Щелчком кнопки мыши выбрать элемент управления, размеры которого предполагается изменить. В его углах появятся маркеры размера.
2. Установить курсор мыши на каком-нибудь маркере размера и перетаскивать его, пока элемент управления не достигнет нужных размеров.
Угловые маркеры изменяют размеры элемента управления и по горизонтали и по вертикали, тогда как маркеры, расположенные по серединам сторон, изменяют размер элемента управления только в одном направлении.
3- Отпустить кнопку.

Другой способ изменения размера элемента управления — использование клавиши <Shift> вместе с клавишами перемещения курсора для изменения размеров выбранного элемента управления.
Для перемещения элемента управления можно:
- Перетащить элемент управления в новое место на форме при помощи мыши;
- Изменить свойства Тор (Верх) и Left (Левый) в окне Properties (Свойства).
Выбрав элемент управления, можно использовать клавишу <Ctrl> совместно с клавишами перемещения курсора для перемещения элемента управления.
Заблокировать положения всех элементов управления можно:
- Командой Lock Controls (Заблокировать элементы управления) меню Format (Формат)
- Нажать кнопку Lock Controls Toggle (Переключение фиксации элементов управления) панели инструментов Редактора форм (Form Editor). Это приведет к фиксированию всех элементов управления в местах их нахождения, так что их случайное перемещение станет невозможным. Это относится к элементам управления только выбранной формы, на других формах элементы управления останутся не затронутыми этой командой. Эта команда работает как переключатель, поэтому ее можно использовать для разблокирования положений элементов управления. Изменить положение заблокированных элементов управления можно:
- Одновременным нажатием клавиши <Ctrl> и подходящей клавиши перемещения "слегка подтолкнуть" ("nudge") имеющий фокус элемент управления;
- Изменить свойства Тор и Left элемента управления в окне Properties (Свойства)
Мы создали интерфейс для приложения "Hello, world!".

Установка свойств

Следующим шагом необходимо установить значения свойств для созданных объектов в окне Properties (Свойства), открыв его предварительно командой Properties (Свойства) меню View (Вид), нажатием кнопки Properties панели инструментов или с помощью контекстного меню для соответствующего элемента управления.

Окно Properties состоит из следующих элементов:
- Окно объектов — отображает имена объектов, для которых можно задать свойства. Раскрыв список (нажатием стрелки (arrow) в правой части списка), можно увидеть перечень всех объектов текущей формы
- Вкладки сортировки — позволяют отображать свойства в списке либо в алфавитном порядке, либо в иерархическом виде с разделением на логические категории, например, категории, связанные с внешним видом, шрифтами или положением
- Список свойств — в левой колонке отображаются все свойства выбранного объекта. Редактировать и видеть установленные значения можно в правой колонке
Задание свойств в окне Properties:
1. Выбрать команду Properties меню View (Вид) или нажать кнопку Properties панели инструментов. В окне Properties отобразятся установки для выбранной формы или элемента управления.
2. Из списка Properties выбрать нужное свойство.
3. правой колонке задать или выбрать новое значение свойства.
Перечислимые свойства имеют заранее заданный список значений. Можно тобразить весь набор значений, раскрыв список Settings (Установки), или Циклически просматривать его, дважды щелкая на отображаемом в поле ввода списка Settings значении.

Для приложения "Hello, world!" необходимо изменить значения трех свойств. Для других свойств следует использовать значения по умолчанию.

Объект
Свойство
Значение
форма Caption (Надпись) Hello, world!
Текстовое окно Text (Текст) (Пустое поле)
Кнопка управления Caption OK

Установка свойства Icon

Все формы в Visual Basic имеют одинаковый, задаваемый по умолчанию значок, который появляется при ее сворачивании. Однако можно изменить его таким образом, чтобы он отражал смысл формы в приложении. Для назначения значка форме следует установить значение ее свойства icon (Значок). Можно использовать как значки размером 32x32 пиксела, которые являются стандартными для 16-разрядных версий Microsoft Windows и используются в Windows 95 и Windows NT, так и значки размером 16x16 пикселов, применяемые в Windows 95.

Написание кода

Окно Редактора кода (Code Editor) — это окно Project (Проект), в котором на языке Visual Basic записывается программный код (или просто код) приложения, состоящий из операторов языка, констант и объявлений. В окне Code можно просматривать и редактировать любой фрагмент кода приложения. Чтобы открыть окно Project (Проект) следует:
1. Дважды щелкнуть на форме или элементе управления, для которого следует написать код.
2. Выбрать имя формы или модуля в окне Project Explorer (Проводник проекта) и нажать кнопку View Code (Посмотреть код).
Для отображения всех процедур в одном окне следует:
1. Выполнить команду Options меню Tools.
2. На вкладке Editor (Редактор) диалогового окна Options (Опции) установить флажок слева от переключателя Default to Full Module View. флажок слева от переключателя Procedure Separator добавляет или удаляет разделительные линии между процедурами.
3. Можно также нажать кнопку Full Module View в левом нижнем углу окна Project.

Для отображения одной процедуры в окне Project следует:
1. Выполнить команду Options меню Tools .
2. На вкладке Editor диалога Options сбросить флажок слева от переключателя Default to Full Module View.

Окно Project содержит следующие элементы:
- Список объектов — отображает имя выбранного объекта. При раскрытии этого списка отображается список всех объектов, ассоциированных с данной формой
- Список процедур — перечисляет процедуры или события объекта. Пока он не раскрыт, в нем отображается имя выбранной процедуры. Раскрыв список, можно увидеть перечень всех процедур объекта.

Создание процедур обработки событий

Код приложения Visual Basic делится на более мелкие блоки, называемые процедурами (procedure). Процедура обработки события (event procedure) — это процедура, содержащая код, который выполняется, если происходит соответствующее событие, например, щелчок кнопкой мыши. Имя процедуры обработки события для элемента управления составляется из истинного имени элемента управления (заданного в свойстве Name (Имя)), знака подчеркивания (_) и имени события. Например, чтобы при нажатии (click) кнопки управления с именем Command 1 инициировалось выполнение'процедуры Обработки события, имя этой процедуры должно быть Commandl_Click.

Для создания процедуры обработки события следует:
1. В списке объектов выбрать элемент с именем объекта активной формы (active form) (форма называется активной, если она находится в фокусе). Для нашего примера следует выбрать кнопку управления с именем Command 1.
2. В списке процедур выбрать элемент с именем события для выбранного объекта.
Теперь процедура фактически уже выбрана, так как она является процедурой по умолчанию для объекта "кнопка управления". Заметим, что теперь в окне Project отображается шаблон (template) для процедуры обработки события.
3. Ввести между операторами sub и End Sub следующий код:

Text1.Text = "Hello, world!"


Процедура обработки события должна выглядеть следующим образом:

Private Sub Commandl_Click ()
Textl.Text = "Hello, world!"
End Sub


Здесь следует отметить, что код просто изменяет свойство Text (Текст) элемента управления с именем Text 1 таким образом, чтобы читалось "Hello, world!" Синтаксис для этого примера имеет вид object.property, где object:=Text1 — это имя объекта, a property.=Text — название свойства. Такой синтаксис можно использовать для изменения установок свойств любой формы или элемента управления как результат реакции на произошедшее событие во время выполнения приложения.

Выполнение приложения


Чтобы выполнить приложение, надо выбрать команду Run меню Start (Выполнить), или нажать кнопку Start панели инструментов, или нажать клавишу <F5>. Нажав кнопку управления, созданную на форме нашего примера, увидим "Hello, world!" в текстовом окне приложения.

По материалам книги Visual Basic 6.0 "МАСТЕР"
 
Вопросы и ответы
Наши лидеры


Место
Имя (ник)
Счет
1
Игорь (=) 167
2
*Casper* (=) 86
3
Андрей (=) 68
4
Bullet [PCLO] (=) 59
5
Stormbringer (=) 82
6
Bourn None (=) 77
7
HouseBugs (=) 60
8
AGavrilov (=) 28
9
Андрей (now@) (=) 24
10
Артемий (=) 23


(+) - на место выше, (-) - на место ниже, (=) - прежнее место, (New!) - впервые в таблице.

Всего участников: 81
Общее число баллов: 1246
Максимальный счет: 167
Минимальный счет: 2
Новые вопросы

173/ Можно ли программно на ВБ-6 сжать базу данных Access?
Если можно, то подскажите код для выполнения такой операции.
[Ответить]
174/ Здравствуйте господа Програмисты.
У меня к вам возникло пару вопросов, надеюсь на вашу отзывчивость и
помощь.
Вопрос 1. Как в Visual Basic.NET 7.0 работать с реестром,какие значения
для этого используются и для чего.
Вопрос 2. Я создал программу по работе с базой данных Access и мне надо
как-то подключить еще одну программу, а точнее один exe-файл. Так чтобы
при открытии программы сначало срабатывал тот exe-файл который я
подключу а потом через определенное время запускалась сама програма.
Возможно ли так сделать, если да то как и с помощью чего?
Заранее Благодарен.
С уважением Роман.
[Ответить]
175/ Здавствуйте!
Плиз, помогите!
Я написал ScreenSaver и столкнулся с такой проблемой:
после компиляции и изменении расширения с EXE на SCR и копирования в WINDOWS
у меня не удаётся взаимодействие с WINDOWS, а именно: при выборе моей
заставки она берёт и запускается вместо показа на "нарисованном экранчике".
Как это можно исправить?
Заранее спасибо.
[Ответить]
176/ Здравствуйте! Как получить данные со входа звуковой карты? [Ответить]
Вопросы без ответов

63/ Здравствуйте! Как сделать столбец для таблицы с помощью VB который будет показывать номера кварталов с min зарплатой(в таблице 4 квартала). Другой столбец - Динамика изменения средней зарплаты по кварталам (рост, падение, колебание, постоянно)\ нужно найти среднее знаение среди записей каждого отдела и чтобы написал динамику изменени, то что напискано в скобках, одно слово. [Ответить]
76/ podskazhite pozhalusta, kak pravil'nee pristupit' k sozdaniu tablic i kakogo roda tablica nujna dlya vvoda, obrabotki i rascheta dannix, na VB.net. mne bazu sozdavat' ne nado. Zaranee spasibo [Ответить]
88/ Здравствуйте. У меня такой вопрос: можно ли из VB послать команду так, чтобы включилась удалённая машина в сети, на которой включен WakeUp on LAN. Если да, то как? За ранее спасибо за оказанную помощь! [Ответить]
99/ Здравствуйте. Создается регистратор переговоров. Подскажите, пожалуйста, каким образом записать звук в файл, чтобы в дальнейшем можно было открыть его и прослушать? Заранее спасибо. [Ответить]
115/ Как при работе в сети при разрыве связи можно узнать, что связь разорвана
удаленным сервером или локальной программой (ошибка 600)?
[Ответить]
117/ Как сделать чтобы при выборе шрифта с помощью Microsoft CommonDialog менялся
и набор символов (Кириллица, Западноевропейский и т.п.)? Спасибо.
[Ответить]
122/ Как сделать чтобы при нажатии на объект ListView НЕ воспроизводился тот
идиотский звук, который воспроизводится?
[Ответить]

130/ Доброго времени суток, User`ы. Подскажите пожалуйсто, как в VB 6.0 к какому-либо устройству в порте COM по определённому адресу? Благодарю за внимание и за ответ. Спасибо. [Ответить]
136/ Здравствуйте!
У меня возникла проблема: для создания страниц сайта специфической тематики (математика) требуется программа, способная сохранять введенные пользователем в объект Equation данные в формате gif или png [как это делает MS Word, при сохранении документа в html формате. Т.е. технологический процесс такой: введение формул в Ворде, сохранение в html -> получение рисунков -> верстка страницы].
Сохранять данные в виде рисунка не проблема, но размер у них не такой какой необходим. Это и есть проблема: как сделать так, чтобы OLE объект со вставленным Equation'ом, изменял свои размеры в соответствии с изменениями размеров Equation'а (как это реализовано в MS Word)
[Ответить]
144/ Подскажите: есть MySQL база, в ней есть какбы ячейки с номером,
например 84538834 или 444449329232, эти ячейки содержат информацию -
числа например 100 332 или 50.
Как можно средствами VB сделать программу которая искала бы в
этой базе значения этих ячеек равные нулю и удаляла бы их, и самое
главное нужен отчет о номерах удалённых ячеек, т.е. сколько чего
удалено из базы.
[Ответить]
155/ Здравствуйте. Как изменить иконку у EXE файла програмным методом на VB с помощью функций: BeginUpdateResource, UpdateResource, hResUpdate? [Ответить]
159/ Можно-ли в MS Access в таблице сохранить документ html и вывести его на форму для просмотра. А если можно, то как? [Ответить]
160/ Благодарю Игоря за ответ,очень помогло,также уже сделал редактирования.
Но дальше возникли еще вопросы.
Например:
1.Не как не могу сделать меню правка с подменю
копировать,вставить,вырезать.
Ну уже все перепробовал нечего не помагает((((
2.Везде искал но не как не могу найти,хоть что нибудь про импорт и
экспорт из базы данных.
Почему так мало информации по Visual Basic.NET?
Пожалуйста помогите,кто может начинающему.
Учусь програмироватьб на Visual Basic.NET, вроде что-то наченает
получатся,вот только некоторые вещи тормозят.
Заранее благодарен за помощь.
С уважением Роман.
[Ответить]
162/ Вот у меня вопрос. Имею 2 модема. Опишите мне подробно:
1) набор номера
2) соединение межде модемами
3) установка связи
Желательно через MSComm
[Ответить]
Ответы на вопросы

40/Здравствуйте ! У меня к вам будет один вопрос. Можно ли на ВБ (у меня установлена 6-я версия программы) сделать поиск подключенных компьютеров по локальной сети. Мне нужно узнать их ай-пи адрес и желательно имя компьютера. Я начинающий программист, если можно, объясните более подробно. [Ответить]

Отвечает: Игорь Осипов
В VB возможно получить список компьютеров, используя компонент MS WinSock.
Этот компонент предназначен для передачи пакетов по сети. И есть у него такое свойство как .LocalIP (текущий IP),
что позволяет определить маску IP - адресов сети.
После чего следует тупой цикл - последовательно перебираются возможные адреса, и если есть соединение,
то выводятся в список.

Функции API предоставляют дополнительные возможности.
Я не знаю функции, которая бы выдавала список компов в сети напрямую,
но можно получитьинформацию об отдельно взятом компутере, зная его IP (или имя).
Это WinSock' овские gethostbyaddr, gethostbyname, gethostname.

Кроме того, можно изначально плясать не от IP - компьютера клиента, а от адресов всех DNS - серверов доступных для
клиента, используя GetNetworkParams.
(После чего снова сканирование по маске адресов + получение дополнительной информации о каждом компьютере...)

Еще один вариант получить адреса DNS, и IP компутера - с помощью реестра.

Приложение к ответу (код):
Размещаем на форме:
Listlog - ListBox
tmrInterval - Timer
ws - WinSock
lv - ListView
lblStatus - Label
tIPNum(0) ... tIPNum(3) - TextBox
cmdScan - CommandButton
cmdExit - CommandButton
Ch1 - CheckBox
Label2 - Label
prb - ProgressBar

Label2.Caption = "Чистить список при повторном сканировании"

===================================
!!!КОД ФОРМЫ!!!
===================================


Dim nCount As Byte, nIPAddrLast As Byte, sMask As String, sFullHost As String, _
itm As ListItem
Option Explicit

'
Private Sub Form_Load()
Dim i As Byte
ListLog.Clear
ListLog.AddItem "Сканирование - NET_BIOS"
WinsockInit 'запуск WinSock

subNetWksta
ListLog.AddItem "Группа " & sNetWkstaGroup
ListLog.AddItem "Компьютер " & sNetWkstaName

subDefaultMask

End Sub

Sub subDefaultMask() 'Устанавливает IP-маску по умолчанию
Dim nPos As Integer
ws.RemotePort = 139 ' сканирование по порту NetBios
tmrInterval.Interval = 250
'ws.RemoteHost = "10.25.26.1"
ws.Connect
sMask = ws.LocalIP
sFullHost = ws.LocalHostName
ws.Close
' заполняем маску
nPos = InStr(1, sMask, "."): tIPNum(0).Text = Left$(sMask, nPos - 1): sMask = Right$(sMask, Len(sMask) - nPos)
nPos = InStr(1, sMask, "."): tIPNum(1).Text = Left$(sMask, nPos - 1): sMask = Right$(sMask, Len(sMask) - nPos)
nPos = InStr(1, sMask, "."): tIPNum(2).Text = Left$(sMask, nPos - 1): sMask = Right$(sMask, Len(sMask) - nPos)
tIPNum(3).Text = sMask
sMask = ""
If Trim(UCase(sFullHost)) <> Trim(UCase(sNetWkstaName)) Then ListLog.AddItem "Возможны ошибки при сканировании"
sFullHost = ""
End Sub

Private Sub cmdExit_Click()
ws.Close
End
End Sub

Private Sub cmdScan_Click()
If cmdScan.Caption = "Scan" Then

cmdScan.Caption = "Stop"
prb.Value = 0: nCount = 0: nIPAddrLast = 0
ListLog.Clear
ListLog.AddItem "Сканирование начато " & Now() & vbCrLf
If Ch1 = True Then lv.ListItems.Clear
ws.RemotePort = 139 ' можно поменять номер для отслеживания коннекта по другим портам
tmrInterval.Interval = 250 ' изменив интервал таймера получим более надежное сканирование (до 2500)
sMask = Trim(tIPNum(0).Text) & "." & Trim(tIPNum(1).Text) & "." + Trim(tIPNum(2).Text) & "."
subScan
Else
cmdScan.Caption = "Scan"
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
ws.Close
WSACleanUp
End Sub



Private Sub lv_BeforeLabelEdit(Cancel As Integer)
Cancel = True
End Sub

Private Sub tIPNum_Change(Index As Integer)
On Error Resume Next
If Not IsNumeric(tIPNum(Index).Text) Or tIPNum(Index).Text < 0 Or tIPNum(Index).Text > 255 Then
MsgBox "Введите число!", vbCritical, "Внимание!!!"
tIPNum(Index).SetFocus
End If
If Len(tIPNum(Index)) = 3 And Index <> 2 Then tIPNum(Index + 1).SetFocus
If Len(tIPNum(Index)) = 3 And Index = 2 Then cmdScan.SetFocus
End Sub

Private Sub tmrInterval_Timer() ' при срабатывании таймера запускается проверка очередного адреса
ws.Close
tmrInterval.Enabled = False
If nCount = 254 Then
subStopScan
Exit Sub
End If
subScan
End Sub

Private Sub ws_Connect()
tmrInterval.Enabled = False
Set itm = lv.ListItems.Add(, sFullHost, sFullHost)
itm.SubItems(1) = HostByAddress(sFullHost)
ws.Close
nIPAddrLast = nIPAddrLast + 1
If nCount = 254 Then
subStopScan
Exit Sub
End If
subScan
End Sub

Private Sub ws_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
tmrInterval.Enabled = False
ws.Close
If nCount = 254 Then
subStopScan
Exit Sub
End If
subScan
End Sub

Public Sub subScan()
If cmdScan.Caption = "Scan" Then
subStopScan
Exit Sub
End If
ws.Close ' закрываем WinSock перед очередным соединением
nCount = nCount + 1 ' берем следующий порядковый номер
sFullHost = sMask + Trim(Str(nCount)) 'добавляем порядковый номер к маске, получаем IP хоста
ws.RemoteHost = sFullHost
prb.Value = nCount ' оформление - увеличиваем значение прогресс-бара
lblStatus.Caption = sFullHost ' оформление - выводим IP хоста на форму
ws.Connect ' коннектимся к хосту с адресом sFullHost
tmrInterval.Enabled = True
End Sub

Public Sub subStopScan() ' оформление конца операции
prb.Value = 0
cmdScan.Caption = "Scan"
ListLog.AddItem "Сканирование закончено " + Str(Now) + vbCrLf
ListLog.AddItem "Найдено " + Str(nIPAddrLast) + " узлов"
lblStatus.Caption = " ."
End Sub

==================================
!!!КОД МОДУЛЯ!!!
==================================
Public Const PF_INET = 2 'AF_INET '

Private Type T_WSA '
wVersion As Integer
wHighVersion As Integer
szDescription(0 To 255) As Byte
szSystemStatus(0 To 128) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type
'
Dim WSAData As T_WSA '
'
Public Type T_Host
h_name As Long
h_aliases As Long
h_addrtype As Integer
h_length As Integer
h_addr_list As Long
End Type

'Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb&)
Declare Function gethostbyaddr Lib "wsock32.dll" (addr As Long, ByVal addr_len As Long, ByVal addr_type As Long) As Long
Declare Function inet_addr Lib "wsock32.dll" (ByVal addr As String) As Long
Declare Function WSAStartup Lib "wsock32.dll" (ByVal a As Long, b As T_WSA) As Long
Declare Function WSACleanUp Lib "wsock32.dll" Alias "WSACleanup" () As Integer
'_____________________________________________________________________________________
Public Type WKSTA_INFO_102
wki100_platform_id As Long
pwki100_computername As Long
pwki100_langroup As Long
wki100_ver_major As Long
wki100_ver_minor As Long
pwki102_lanroot As Long
wki102_logged_on_users As Long
End Type

Declare Function NetWkstaGetInfo Lib "netapi32" (ByVal servername As String, ByVal level As Long, lpBuf As Any) As Long
Declare Function NetApiBufferFree Lib "netapi32" (ByVal Buffer As Long) As Long
'Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb&)
' В принципе, можно обойтись без использования API - функций.
' Я их использую лишь для получения имени рабочей группы (ну и компутера заодно).
' В профессиональном приложении, можно обойти недостатк WinSock (один локальный
' IP-адрес) используя API для составления списка DSN - серверов.
' В данном же проекте WinSock тупо сканирует сеть по всем IP - адресам.

Public sNetWkstaGroup As String, sNetWkstaName As String

Public Sub subNetWksta() ' записывает в переменные имя домена(группы) и компьютера (API - функции)
Dim pWrkInfo As Long, WrkInfo(0) As WKSTA_INFO_102, lResult As Long
lResult = NetWkstaGetInfo("", 100, pWrkInfo)
If lResult = 0 Then
Dim cname As String
cname = String$(255, 0)
CopyMemory WrkInfo(0), ByVal pWrkInfo, ByVal Len(WrkInfo(0)) '''''
CopyMemory ByVal cname, ByVal WrkInfo(0).pwki100_langroup, ByVal 255
sNetWkstaGroup = SConvert(StrConv(cname, vbFromUnicode))
cname = String$(255, 0)
CopyMemory ByVal cname, ByVal WrkInfo(0).pwki100_computername, ByVal 255 '''''
sNetWkstaName = SConvert(StrConv(cname, vbFromUnicode))
NetApiBufferFree ByVal pWrkInfo
End If
End Sub

Public Function SConvert(sInput As String) As String
Dim nPos As Integer
nPos = InStr(1, sInput, vbNullChar)
If nPos > 0 Then
SConvert = Left$(sInput, nPos - 1)
Else
SConvert = sInput
End If
End Function


Public Sub WinsockInit()
WSAStartup &H101, WSAData
End Sub

Function HostByAddress(ByVal sAddress As String) As String
Dim lAddress As Long
Dim p As Long
Dim HostName As String
Dim Host As T_Host
lAddress = inet_addr(sAddress)
p = gethostbyaddr(lAddress, 4, PF_INET)
If p <> 0 Then
CopyMemory Host, ByVal p, Len(Host)
HostName = String(256, 0)
CopyMemory ByVal HostName, ByVal Host.h_name, 256
If HostName = "" Then HostByAddress = "Unable to Resolve Address"
HostByAddress = Left(HostName, InStr(HostName, Chr(0)) - 1)
Else
HostByAddress = "No DNS Entry"
End If
End Function


Оценка за ответ: 5
100/Здравствуйте. Меня интересует протокол ZModem или подобный. Спасибо [Ответить]

Отвечает: Oleg K.
Протоколы передачи данных
http://РЕКЛАМА*РЕКЛАМА*РЕКЛАМА/

На этой странице представлены описания различных протоколов передачи данных.

Xmodem & Ymodem
Zmodem
SEAlink
Megalink
Kermit
Zmodem на русском
Cmodem
Fast
Modem7
Xmodem, CRC Xmodem, Wxmodem
Modem7 и Xmodem
X.PC Protocol
JModem

Конкретно Zmodem на русском чаще всего представлен этим файлом
http://www.ishodniki.ru/base/Pascal/zmodem_r.zip

Оценка за ответ: 3

111/У меня к компу подключен принтер который в сети сделан общедоступным, можно ли сделать такое, чтобы если кто-то с другого компьютера послал что-нибудь ко мне на печать, то это застопорилось, а то я шнур принтера от компьютера включаю то в лазерный принтер, то в матричный (в зависимости от того, что надо печатать), а в винде он у меня установлен как лазерный. А если мне пошлют на печать документ, когда у меня матричный подключен ??? знаете какая кака-бяка получается...
Заранее благодарен Евгений
[Ответить]

Отвечает: Oleg K.
Вопросом на вопрос: А что мешает установить или лазерный или матричный
принтер на другой комп и сделать его тоже общедоступным сетевым
принтером?

Оценка за ответ: 3

152/Прошу вас подсказать мне в решении проблемы.
Я начинающий программист на VB6.
Проблема такова: Требуется отправить файл на E-mail с компьютера который подключен к интернету, у него нет почтового клиента, и всё это незаметно для пользователя.
Подскажите пожалуйста.
[Ответить]

Отвечает: HouseBugs
Троян ,значит ваяем? ;-). Ну что-же держи:

Приложение к ответу (код):
Sub WaitFor(ResponseCode As String)
Dim Start As Double
Dim Response As String
Dim Tmr As Integer
Start = Timer ' Time event so won't get stuck in loop
While Len(Response) = 0
Tmr = Timer - Start
DoEvents
If Tmr > 60 Then ' Время в секундах на ожидание
Winsock1.Close
Exit Sub
End If
Wend
While Left(Response, 3) <> ResponseCode
DoEvents
If Tmr > 60 Then
Exit Sub
End If
Wend
Response = ""
End Sub

Sub SendEmail(MailServerName As String, FromName As String, FromEmailAddress As String, ToName As String, ToEmailAddress As String, EmailSubject As String, EmailBodyOfMessage As String)
On Error GoTo Tut
Winsock1.LocalPort = 0
If Winsock1.State = sckClosed Then
DateNow = Format(Date, "Ddd") & ", " & Format(Date, "dd Mmm YYYY") & " " & Format(Time, "hh:mm:ss") & "" & " -0600"
First = "mail from:" + Chr(32) + FromEmailAddress + vbCrLf
Second = "rcpt to:" + Chr(32) + ToEmailAddress + vbCrLf
Third = "Date:" + Chr(32) + DateNow + vbCrLf
Fourth = "From:" + Chr(32) + FromName + vbCrLf
Seventh = EmailBodyOfMessage + vbCrLf
Eighth = "From:" + Chr(32) + vbCrLf + "To:" + ToName + Chr(32) + vbCrLf + "Subject:" + EmailSubject
Winsock1.Protocol = 0
Winsock1.RemoteHost = MailServerName
Winsock1.RemotePort = 25
Winsock1.Connect
WaitFor ("220")
Winsock1.SendData ("HELO " + vbCrLf)
WaitFor ("501")
Winsock1.SendData (First)
WaitFor ("250")
Winsock1.SendData (Second)
WaitFor ("250")
Winsock1.SendData ("data" + vbCrLf)
WaitFor ("354")
Winsock1.SendData (Eighth + vbCrLf)
Winsock1.SendData (EmailBodyOfMessage + vbCrLf)
Winsock1.SendData ("." + vbCrLf)
WaitFor ("250")
Winsock1.SendData ("quit" + vbCrLf)
WaitFor ("221")
Winsock1.Close
Else
GoTo Tut
End If
MsgBox "Письмо отправлено"
Exit Sub
Tut:
MsgBox "Письмо не отправлено. Ошибка № " & Str(Winsock1.State)
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Winsock1.GetData Response
End Sub

Вызовешь функцию отправки:
Call SendEmail("Имя POP сервера", "Отправитель", "Email отправителя", "Кому письмо", "Email получателя", "Тема сообщения", "Текст сообщения")
и все будет путем.


Оценка за ответ: 5

153/Задачка такая:
Есть продукция металлопрокатного стана – палки с определенной длинной.
Нужно с них нарезать заготовки заданных длин.
Требуется разместить на палках заготовки так, чтобы получить минимальный отход.
Т.е. было израсходовано как можно меньше палок и обрезки были как можно короче.
Как это все сделать на VB?
Буду благодарен, если просто укажите, где найти алгоритмы раскроя с оптимизацией.
[Ответить]

Отвечает: Oleg K.
Это обычная задача линейного программирования.
Решается, как правило, симплекс-методом.
Можно вообще в Excel-е решать. Например так:
http://????РЕКЛАМА????/cheer/ch9_3/ch9_3p07.htm

одно из решений (на паскале) можно посмотреть тут:
http://????РЕКЛАМА????/67/14982/1.html

Оценка за ответ: 2

166/Создал Программу: при ОК на кнопку выходит очередной Перл.
Каждый Перл пронумерован. Как спрограммировать на VB6, чтобы при клике на кнопку Найти Перл или хотя бы его Номер по СЛОВУ? Если требуется перешлю Исходник (в архиве 15 Кб).
[Ответить]

Отвечает: Sergei
Здравствуйте.

Будем считать, что все Перлы у Вас в массиве. Тогда этот код должен
выводить необходимый перл.

Приложение к ответу (код):
Dim i As Long

Private Sub Command1_Click()
i = Str(1)
Do Until i = 11 ' 11 - это число перлов + 1 (в данном случае 10), не забудьте поменять на
необходимое
If InStr(massiv(i), Text1.Text) <> Empty Then 'Text1 - textbox, в котором Вы пишите
слово, а massiv - имя Вашего массива
Label1.Caption = massiv(i) 'Label1 - label, в котором появится Перл
Exit Do
End If
i = Str(i + Str(1))
Loop
End Sub


Оценка за ответ: 5

172/вопрос по RAS:
как получить параметры имеющихся на компе соединений(dial-up)?
[Ответить]

Отвечает: Avil
Все настройки соединения храняться в файле "rasphone.pbk".
Для того чтоб узнать параметры соединения можно использовать стандартные API функции работы с INI-файлом.
Пример:
(Дважды клацнуть по имени соединения для отображения параметров и значений параметров)
создать проект и добавить 2 listView
Первому listView дать имя=Session1 и View=2
Второму listView дать имя=Param_Znach и View=3
и добавить код

Приложение к ответу (код):
Option Explicit
Private Declare Function GetPrivateProfileStringSections& Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName&, ByVal lpszKey&, ByVal lpszDefault$, ByVal lpszReturnBuffer$, ByVal cchReturnBuffer&, ByVal lpszFile$)
Private Declare Function GetPrivateProfileStringKeys& Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName$, ByVal lpszKey&, ByVal lpszDefault$, ByVal lpszReturnBuffer$, ByVal cchReturnBuffer&, ByVal lpszFile$)
Private Declare Function GetPrivateProfileStringByKeyName& Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName$, ByVal lpszKey$, ByVal lpszDefault$, ByVal lpszReturnBuffer$, ByVal cchReturnBuffer&, ByVal lpszFile$)

Dim file_ini As String
'Получить список СОЕДИНЕНИЙ
Private Function GetListSession(FileName As String, ListSession As Variant) As Integer
Dim characters As Long, i As Integer
Dim SectionList As String, ArrSection() As String
Dim NullOffset%
SectionList = String$(5001, 0)
characters = GetPrivateProfileStringSections(0, 0, "", SectionList, 5000, FileName)
i = 0
Do
NullOffset% = InStr(SectionList, Chr$(0))
If NullOffset% > 1 Then
ReDim Preserve ArrSection(i)
ArrSection(i) = Mid$(SectionList, 1, NullOffset% - 1)
SectionList$ = Mid$(SectionList, NullOffset% + 1)
i = i + 1
End If
Loop While NullOffset% > 1
GetListSession = i - 1
ListSession = ArrSection
End Function

'Получить значения конкретного параметра конкретного соединения
Public Function ValKey(ByVal section$, ByVal key$, file$) As String
Dim KeyValue$, characters As Long
KeyValue$ = String$(5001, 0)
characters = GetPrivateProfileStringByKeyName(section$, key$, "", KeyValue$, 5000, file$)
KeyValue$ = Left$(KeyValue$, characters)
ValKey = KeyValue$
End Function

'Получить список параметров СОЕДИНЕНИЯ
Public Function GetListPar(Session As String, FileName As String, KeyNames As Variant) As Integer
Dim characters As Long, i As Integer
Dim KeyList As String, ArrKey() As String
KeyList = String$(5001, 0)
characters = GetPrivateProfileStringKeys(Session, 0, "", KeyList, 5000, FileName)
Dim NullOffset%
i = 0
Do
NullOffset% = InStr(KeyList, Chr$(0))
If NullOffset% > 1 Then
ReDim Preserve ArrKey(i)
ArrKey(i) = Mid$(KeyList, 1, NullOffset% - 1)
KeyList$ = Mid$(KeyList, NullOffset% + 1)
i = i + 1
End If
Loop While NullOffset% > 1
GetListPar = i - 1
KeyNames = ArrKey
End Function

Sub load_Param_Znach()
Dim i As Integer, Kol_s As Integer
Dim nameP As Variant, str As String, ListIt As ListItem
Kol_s = GetListPar(Session1.SelectedItem, file_ini, nameP)
For i = 0 To Kol_s
'str = ValKey(Session1.SelectedItem, nameP(i), file_ini)
Set ListIt = Param_Znach.ListItems.Add(i + 1, , nameP(i))
ListIt.SubItems(1) = ValKey(Session1.SelectedItem, nameP(i), file_ini)
Next i
End Sub

Private Sub Form_Load()
file_ini = "D:\SHARE\rasphone.pbk" 'Указать путь
Dim i As Integer, Kol_s As Integer
Dim nameS As Variant, nameP As Variant
Kol_s = GetListSession(file_ini, nameS)
For i = 0 To Kol_s
Session1.ListItems.Add i + 1, , nameS(i)
Next i
Param_Znach.ColumnHeaders.Add 1, "Par", "Параметр", Param_Znach.Width / 6 * 4
Param_Znach.ColumnHeaders.Add 2, "Znach", "Значение", Param_Znach.Width / 6 * 1.5
load_Param_Znach
End Sub

Private Sub Session1_DblClick()
Param_Znach.ListItems.Clear
load_Param_Znach
End Sub


Оценка за ответ: 5

 
 
Статья выпуска
Присылайте свои статьи на наш адрес: vb-question@list.ru
 
Юмор
Одна блондинка спрашивает у другой:
- Что за новый кавалер у тебя появился?
- Скульптор. Но я его уже прогнала. Представляешь: сперва любовался моей фигурой, а потом захотел меня высечь. Садист!

***

Жена на кухне поздно вечером в ожидании мужа pассматpивает pяд скалок разного pазмеpа, висящих над столом. Hа каждой скалке надпись:
"Полночь", "Час ночи", "Два часа ночи"...
 
Наши партнеры

Рассылки Subscribe.Ru
Visual Basic для новичков и профессионалов
Программирование на Delphi

Хотите стать нашим партнером? Пишите сюда.

 

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.vbforbeginprof
Архив рассылки
Отписаться
Вспомнить пароль

В избранное