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

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


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

Выпуск
52
Дата выхода
29.10.2006
Ответственный за выпуск
Константин
Подписчиков
7231
Архив рассылки
Архив этого выпуска
   

Сайт рассылки
VisualBasic.noka.ru - сайт для любителей Visual Basic. На сайте вы найдете большое количество исходников, статей, компонентов. Книги, программы, форум, статьи, а также другие рассылки нашего портала, помогут вам найти любую исчерпывающую информацию на любой вопрос.

Новости

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

Вот и концилось лето, кончилась пара отпусков. Надо снова браться за дело! Что-то я уже в течении двух месяцов не ощущаю от вас активности! Давайте, присылайте свои вопросы, а также отвечайте на вопросы прошлого выпуска! Дерзайте! Искренне Ваш, Автор рассылки :)

Вопросы и ответы

Сегодня в выпуске:
Вопросов: 7
Ответов: 8

Десятка лучших

Игорь
167
*Casper*
161
Bourn None
116
visualprogs@yandex.ru
103
Bullet [PCLO]
99
Stormbringer
92
Master (Роман)
87
Андрей
73
Oleg K.
63
Перекладов Владимир
61

Новые вопросы

228/Уважаемые программисты. Написал программу для учета товара на складе, в базе данных Access. И вопрос таково характера при выписке товара со склада на Накладной нужна сумма прописью. Помогите с написанием кода для суммы прописью. Заранее благодарен.[Ответить]
229/Здравствуйте! Подскажите пожалуйста, как вывести иконку файла в PictureBox зная путь к файлу? Заранее спасибо![Ответить]
230/Как сделать отступы в RichTextBox? Заранее спасибо![Ответить]
231/Доброе время суток. Как или в каком элементе управления можно проиграть avi-файл, чтобы: -Файл проигрывался во весь или не во весь экран. -Файл проигрывался циклически, т.е, если закончился, то начался сначала. Заранее спасибо![Ответить]
232/Здравствуйте! Подскажите, как можно в отчете в один rptTextBox объединить данные из двух полей?[Ответить]
233/Здравствуйте! Подскажите как можно в отчет в одном контроле rptTextBox объединить данные из вдух полей базы?[Ответить]
234/Работая в Visual Basic (у меня Visual Basic 6.0 Service Pack 5) у меня постоянно сбиваются настройки меню и панелей в интерфейсе редактора (пропадают необходимые элементы меню, кнопки, иногда изображения на кнопках не соответствуют макросам и необходимым действиям). Для исправления ошибок мне приходится сбрасывать настройки панелей, но и это не всегда помогает. Например, сейчас у меня стало пропадать меню «Удалить» в меню «Правка» и меню «Удалить», которое должно появляться при отжатии правой кнопки меню от формы в броузере объектов и я не могу удалить не нужную мне форму, модуль и т.п. Также часто пропадает меню «Вставить пользовательский контрол» и я не могу добавить его в проект. Таких глюков с меню очень много. Переустановка пакета Visual Basic ничего полезного не приносит. Может кто-то встречался с подобными проблемами и знает, как их исправить, прошу сообщить. [Ответить]

Вопросы, нуждающиеся в ответах

184/ Здравствуйте!
Я по поводу субклассирования.
Определяю стандартную оконую функцию в модуле. Как теперь сделать так, чтобы эта функия вызвала другую, именно из той копии класса, которая субклассирует даное окно?
Напремер:
У меня есть три контрола:

ContrA субклассирует окно 1
ContrB --////--- 2
ContrC --////--- 3

и NewWindowFunction (в стандартном модуле) если она будет вызвана как можно узнать какая именно копия котнрола ёё вызвала? И вызвать функцию именно того контрла, которая ёё вызвала?

Может ёще существует какой-нибудь другой алгоритм? А то я понатия не имею как можно его организовать.

А как еще можно субклассировать окно пренадлежащее другому процессу?
SetWindowLong конечно возвращае ошибку. Для этой цели пользовался специальным контролом, но хотелось бы "избавиться" от необходимости его присутствия для даных целей.
[Ответить]
211/Уважаемые эксперты. Как в VB.Net перетаскивание картинки сделать таким же наглядным, как в VB6? В VB6 указываешь для перетаскиваемой картинки в качестве свойства DragIcon саму картинку, и таскаешь имено ее. А в VB.Net такого свойства нет и таскаешь какой-то перечеркнутый кружок. Не красиво и не наглядно.[Ответить]

212/В VB6 c помощью ShowDefaultCharacterProperties вызываю в своей программе галерею MS агентов. 2 вопроса по работе с ней. 1) Почему в галерее показывается только 5 стандартных агентов, хотя в C:\Windows\Msagent\Chars их у меня 16? 2) Как передать в программу ссылку на выбранного в галерее агента?[Ответить]

214/в дополнению к 206 вопросу. Для вывода данных из MS SQL использую запрос и DataGrid Public Sub zapros1(sSQL) Set rs = New ADODB.Recordset With rs .ActiveConnection = cn .CursorLocation = adUseClient .CursorType = adOpenKeyset .Source = sSQL .Open End With Set frmZagruzka.DataGrid1.DataSource = rs Files_name = DataGrid1.Text End Sub хотел спросить, есть ли иной путь передачи сведений из MS SQL в части передачи одного значения (например: количества строк)сразу в переменную, кроме как создавать невидимый на форме DataGrid1 передавать ему сведения, а потом забирать из DataGrid1 сведения (как показано выше).[Ответить]

215/Доброго времени суток. Недавно скачал "iRender 3D 2.5", правда не знаю как им пользоваться. Напишите пожалуйста пару примерчиков. Заранее спасибо.[Ответить]

216/Доброго времени суток, уважаемые разработчики. Делаю РПГ. В ней карту, типа Фоллаутовской. Столкнулся с такой проблемой: есть поле с картинкой (местность, вид сверху), по ней двигаеться обьект, в данном случае кружок. Есть черно-белая маска местности.. Так вот как сделать так, чтобы кружок двигался только в пределах белой области маски, а на черную не лез? Заранее благодарю. [Ответить]

218/Здравствуйте, у меня два вопроса о защите: 1) Как сделать так, чтобы программа работала только с CD диска. 2) Как сделать так чтобы при установке программа требовала серийный номер, а по истечении 3-х дней без этого номера браковалась или блокировалась.[Ответить]
219/Создал программу на VB6: по клику выскакивает очередной Перл или Перл по набранному номеру. Вопрос: как спрограммировать "Поиск Перла по набранному Слову"?.Сама программа KvintEssencGrac.rar находится на http://graciologiy.narod.ru/, а также на http://freesoft.ru/?id=667597. По требованию вышлю исходники. [Ответить]
220/Как в VB и VB.NET перехватить событие ВРАШЕНИЕ КОЛЕСИКА МЫШИ, например в Grid'е?[Ответить]
221/Здравствуйте! У меня вопрос: В моей программе есть определенные шрифты, которые есть не у каждого, но есть в папке с моей программой. Как мне сделать так, чтобы эти шрифты при установке программы автоматически устанавливались в папку Шрифты на ПК. Благодарю. Владимир.[Ответить]
222/Здарова всем! У меня такой вопрос (желательно отвечать подробнее, потому как я новичок). Мне надо сделать так, чтобы вtext моей программыкопировался определённый текст из html в браузере. Думаю вопрос понятен :) Спасибо![Ответить]
223/И снова поводу автоматизации (Вопрос # 204). Дело не в том, что мне нужен механизм копирования и хранение кода, он уже существует и встроен в Visual Studio.NET (раскрывающаяся панель справа). И не в классах дело, так как это не автоматизация, и лишь способ конструирования данных. В общем, я говорю даже не о проектировании кода, и даже не о проектировании как таковом, а о способах сделать эти процессы легче, быстрее, безошибочней и самое главное всеобъемлющими, имеется в виду то, что сама система должна подсказывать о следующем шаге. Ведь по существу все действия проделываемые программистами являются циклическими, это и называется опытом. Начинаем с мастеров, а дальше всё идёт, возвращаясь на круги своя. Короче, в Visual Studio.NET можно сделать всё что угодно, вопрос же не в этом. А в том, как добиться желаемого, более лёгким путём используя Add-In или что-либо в этом роде? Причём дело не в самом создании Add-In, это описывается в MSDN достаточно подробно, а в том, что же с помощью него необходимо автоматизировать в первую очередь. В общем, пишите, что бы вы хотели добавить в Visual Studio.NET, а так же в Visual Basic 6.3, который входит в состав AutoCAD, Corel, Microsoft Office и так далее.[Ответить]
224/Здравствуйте Подскажите как реализовать DOS печать на VB6.0, на работе только матричные принтеры Epson LX300 и Epson LX1050. Пользуюсь методом создания файла на диске с последующим открытием его DOS приложением, или просто командой "copy to prn...". Нет ли более изящного и правильного способа похожего на использование объекта printer (объект, свойства, события) ну или в крайнем случае строка инициализации и функции WinAPI ?[Ответить]
225/Здравствуйте. Вопрос такой. Мне нужно изменить структуру уже заполненной базы (в ручную нерационально, потому что эти изменения надо будет сделать 11 раз в разных географических местах) Хотела автоматизировать. Вопрос - как открыть существующую таблицу. чтобы можно было изменять ее структуру? ( изменить названия неокторых полей и его комментарий, затем добавить новые поля) Заранее и всегда - спасибо![Ответить]
226/Чтобы отправлять сообщения по локальной сети через службу сообщений в своей программе на VB6, я написал вот так. ExecCmd "net send " & user & " " & text 'где ExecCmd - модуль ждущий завершения вызваной програмы, user – пользователь, text - текст сообщения. Как отправить сообщение не через вызов net send, а через функцию API или через WinSock или ...? Если это возможно, то как перед отправкой проверить есть ли пользователь в сети? [Ответить]
227/Здравствуйте! Подскажите каким образом можно сделать свод по таблице. Имеется один столбец текстовый и пара числовых. Заранее спасибо.[Ответить]


Ответы на вопросы

Вопрос # 183
Как запустить свою прогу как сервис Винды?

Отвечает
Bullet [PCLO]
Запустить свою прогу как сервис винды можно, но код слишком громоздок
чтобы тут его выкладывать в прямом виде, посему код будет во вложении
в виде архива.

Скачать приложенный к ответу файл >>>

Оценка за ответ эксперту Bullet [PCLO]: 5 баллов

Вопрос # 214
в дополнению к 206 вопросу. Для вывода данных из MS SQL использую запрос и DataGrid Public Sub zapros1(sSQL) Set rs = New ADODB.Recordset With rs .ActiveConnection = cn .CursorLocation = adUseClient .CursorType = adOpenKeyset .Source = sSQL .Open End With Set frmZagruzka.DataGrid1.DataSource = rs Files_name = DataGrid1.Text End Sub хотел спросить, есть ли иной путь передачи сведений из MS SQL в части передачи одного значения (например: количества строк)сразу в переменную, кроме как создавать невидимый на форме DataGrid1 передавать ему сведения, а потом забирать из DataGrid1 сведения (как показано выше).

Отвечает
Bullet [PCLO]
Я для соединения например с SQL Server я использовал такой код:

' Строка запроса
Dim sSQLQuery As String
Dim sReturn As String
' Коннект
Dim dbConn As Connection
' Команда
Dim objComm As ADODB.Command
' Рекордсет
Dim RecSet_ As ADODB.Recordset

' Новая команда
Set objComm = New ADODB.Command
' Новый коннект
Set dbConn = New Connection

' Настроим коннект
With dbConn
.CursorLocation = adUseClient
.CommandTimeout = 700
.ConnectionTimeout = 700
.Open "Provider=SQLOLEDB.1;Password=password;Persist Security Info=True;User ID=userlogin;Initial Catalog=databasename;Data Source=servername"
End With
' Текст запроса
sSQLQuery = "select count(kol_d4) from pla"

With objComm
.CommandTimeout = 700
.CommandText = strSQLCmd ' Текст запроса
.CommandType = adCmdText
.ActiveConnection = dbConn.ConnectionString
End With
' Выполним запрос
Set RecSet_ = objComm.Execute
sReturn = RecSet_(0)
' Возвратим единственное значение рузельтата запроса
MsgBox sReturn


Тут легко можно переделать под любой вид базы данных, главное изменить
строку коннекта. Так что используй под любой коннект и никаких
DataGrid :) Только не забудь подключить в Project->References->Microsoft ActiveX
Data Objects 2.6 Library.

Оценка за ответ эксперту Bullet [PCLO]: 5 баллов

Вопрос # 217
Здравствуйте! Помогите!!! Расскажите как создавать файлы с данными на VB, заносить в них новые данные, изменять ну и т.д. Ну например хочу сделать прогу типа телефонного справочника, я заношу данные, удаляю и все это должно где то хранится. Я понятия не имею как это сделать. Помогите!!! Если не трудно вышлите ответ на senichka85@mail.ru Заранее благодарен!

Отвечает
*Casper*
А что тут сложного. ПО сути справочник - это таблица, верно. В таблице есть
поля, а есть строки. Разберемся с полями. Пусть нам надо ФИО, адрес,
телефон, и примечания.

Создаем структуру в отдельном модуле:
Public Type tRecord
FIO as string
Addres as string
Phone as string
Memo as string
End type
Еще полезная структурка. Она позволит более просто обращаться с файлом
Public Type tFile
Records() as tRectord
End type


Также в модуль следует добавить процедуру загрузки и сохранения справочника

Public Sub ReadFile(byval FileName as string, ByRef Data as tFile)
Dim File as integer,D as tFile
File= FreeFile
open Filename for binary as File
Get #File,1,D
close File
Data=D
End sub

Public Sub WriteFile(byval FileName as string, ByRef Data as tFile)
Dim File as integer,D as tFile
File= FreeFile
D=Data
open Filename for binary as File
Put #File,1,D
close File
End sub

'// на этом заканчиваем наш модуль и переходим к программе.

Чтобы получить доступ к какой либо записи в базе, делаем так
Определяем переменную для всего файла
Dim MyFile as tFile
В процедуре form_load() пишем загрузку
ReadFile "C:\MyDataBase.dat",MyFile

Теперь весь справочник лежит в одной переменной. Запись номер 5 считываться
будет так
ФИО - MyFile.Records(5).FIO
Адрес - MyFile.Records(5).Addres
Телефон - MyFile.Records(5).Phone
Примечания - MyFile.Records(5).Memo

Чтобы добавить запись:
Redim Preserve MyFile.Records(Ubound(MyFile.Records)+1)
Функция Ubound(MyFile.Records) выведет номер последнего элемента в массиве
MyFile.Records()

Для удаления придется изловчиться:
Пусть надо удалить 19 запись:
For i=19 to ubound(MyFile.Records)-1
MyFile.Records(i)=MyFile.Records(i+1) 'Смещаем все элементы после 19
на один назад. То есть на место 19 встанет 20, на место 20 - 21 и тд...
Next I
Redim Preserve MyFile.Records(Ubound(MyFile.Records)-1) 'Удаляем последнюю
запись, тк она лишняя

НУ вообщем-то все. Думаю поймешь что и как. Смотри вложение

Скачать приложенный к ответу файл >>>

Оценка за ответ эксперту *Casper*: 5 баллов

Вопрос # 219
Создал программу на VB6: по клику выскакивает очередной Перл или Перл по набранному номеру. Вопрос: как спрограммировать "Поиск Перла по набранному Слову"?.Сама программа KvintEssencGrac.rar находится на http://graciologiy.narod.ru/, а также на http://freesoft.ru/?id=667597. По требованию вышлю исходники.

Отвечает
*Casper*
Если перлы хранятся в массиве A(), то все просто:
Dim Word as string, I as integer
Dim A() as string
'// Считываем перлы в массив

'//-------------------------

'// теперь собственно поиск
i=0
While i<ubound(A)
if instr(1,A(i),Word)>0 then
'искомое слово найдено в перле. Выводим значение A(i) на
экран. Тут сам смотри как удобнее будет
end if
Wend
'//--------------------------
Таким образом будет получен список перлов, в котором содержится искомое
слово или фраза.
Функция InStr([Start],String1,String2,.....)
[Start] - начальная позиция для поиска. Почему то если пропустить, то
вылетает ошибка, поэтому я пишу 1
String1 - строка, в которой ищется образец
String2 - строка образец
Далее есть еще параметры, но на вскидку не помню. Связаны они с типом
сравнения. То есть важен или нет регистр, или еще чего-нибудь.

Оценка за ответ эксперту *Casper*: 5 баллов

Вопрос # 220
Как в VB и VB.NET перехватить событие ВРАШЕНИЕ КОЛЕСИКА МЫШИ, например в Grid'е?

Отвечает
Bullet [PCLO]
На сайте был для этого такой код:
Как отследить скролл мыши
В переменную Wheel передаётся направление вращение: -1 при движении вниз или 1 при движении вверх
'КОД ФОРМЫ
Option Explicit

Private Sub Form_Load()
Call Hook(Me.hwnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHook(Me.hwnd)
End Sub


'КОД МОДУЛЯ
Option Explicit
Private Declare Function CallWindowProcA Lib "user32" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLongA Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowTextA Lib "user32" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Const GWL_WNDPROC = -4
Private Const WM_MOUSEWHEEL = &H20A
Private lpPrevWndProc As Long, Wheel As Integer

Sub Hook(hwnd As Long)
lpPrevWndProc = SetWindowLongA(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Sub UnHook(hwnd As Long)
Call SetWindowLongA(hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub

Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo xErr
If uMsg = WM_MOUSEWHEEL Then
If wParam = -7864320 Or wParam = -23592960 Or wParam = -15728640 Then Wheel = -1
If wParam = 7864320 Or wParam = 23592960 Or wParam = 15728640 Then Wheel = 1
Call SetWindowTextA(Form1.hwnd, "Wheel " & Wheel)
Else
WindowProc = CallWindowProcA(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End If
xErr:
End Function

Оценка за ответ эксперту Bullet [PCLO]: 5 баллов

Вопрос # 221
Здравствуйте! У меня вопрос: В моей программе есть определенные шрифты, которые есть не у каждого, но есть в папке с моей программой. Как мне сделать так, чтобы эти шрифты при установке программы автоматически устанавливались в папку Шрифты на ПК. Благодарю. Владимир.

Отвечает
Denisk@
Для того, чтобы добавить фонты (шрифты,если кто не знает...=) )
достаточно воспользоваться API функцией AddFontResource. Пример:
В данном примере есть форма и на ней есть кнопа - addFont по
нажатию которой добавляется твой шрифт,есть так же модуль.
На кнопу вешаешь код:
Private Sub addFont_Click()
Dim fname As String 'переменнай, которая будет содержать адрес и имя фонта
fname = ("C:\Verdana.ttf")
AddFontResource (fname)
End Sub

Затем открываем модуль и пишем:
Public Declare Function AddFontResource Lib "gdi32" Alias "AddFontResourceA" (ByVal lpFileName As String) As Long
Для удобства присвой своей переменной fname = (App.Path & "\имя_фонта")
Вот и усе =)))

Оценка за ответ эксперту Denisk@: 5 баллов


Отвечает
*Casper*
Вот тебе 2 APIшки.

Public Declare Function AddFontResource Lib "gdi32" Alias "AddFontResourceA"
(ByVal lpFileName As String) As Long
Public Declare Function RemoveFontResource Lib "gdi32" Alias
"RemoveFontResourceA" (ByVal lpFileName As String) As Long

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

Во вложении смотри пример

Скачать приложенный к ответу файл >>>

Оценка за ответ эксперту *Casper*: 5 баллов


Отвечает
wi-tak
При использовании мастера создания установочных пакетов можно указать
ему необходимые действия с файлом шрифтов, в саму разрабатываемую
программу включить модуль проверки наличия файла шрифтов в папке Fonts,
и при необходимости его туда скопировать и т.д.

Оценка за ответ эксперту wi-tak: 5 баллов

Вопрос # 224
Здравствуйте Подскажите как реализовать DOS печать на VB6.0, на работе только матричные принтеры Epson LX300 и Epson LX1050. Пользуюсь методом создания файла на диске с последующим открытием его DOS приложением, или просто командой "copy to prn...". Нет ли более изящного и правильного способа похожего на использование объекта printer (объект, свойства, события) ну или в крайнем случае строка инициализации и функции WinAPI ?

Отвечает
Oleg K.
Подобные вопросы часто возникают и у пользователей Access.
Ответ на него достаточно подробно осветил в своей рассылке
Виктор Конюков
Подписка: "Access 2000 - программирование и готовые решения"
Выпуск 11
Автор: Виктор Конюков
Дата: 25.09.2000
Сайт: http://www.leadersoft.ru

Сомневаться в его компетентности пока не приходилось, так что привожу
и вопрос и его ответ на него ЦЕЛИКОМ. (ссылка на файл, который также
следует искать на сайте ЛидерСофт).

========================
4.Объясните, пожалуйста, как использовать быструю печать шрифтами
принтера (EPSON FX1170 в частности) русских букв из MS Access 2000,
например, при выборе шрифта DRAFT 10 cpi (использовал печать отчёта из
MS Access 2000). Английский алфавит печатается, а вместо русского -
знаки "?". Используется Windows 98. По моему драйвер принтера здесь не
причём, так как изменение принтера в параметрах страницы на лазерный,
при том же шрифте ничего не меняет. Принтер EPSON поддерживает кодовую
страницу 866.

4. Ответ. Принтер EPSON FX1170 относится к матричным принтерам. Причем
у матричных принтеров существует два режима печати: один текстовый,
когда Вы можете печатать только текст (с подчеркиванием или
выделением) и другой - графический, когда Вы можете напечатать отчет с
любым оформлением. Все команды принтера имеют общий вид, т. е. с
начала идет символ ESC (десятичный код = 27) далее - код команды с
данными. (Внимание! У лазерных принтеров совершенно другая система
команд загрузки шрифтов и данных. Они полностью не совместимы с
матричными устройствами.)
При печати из Access 2000, драйвер Windows будет всегда принтер
переводить в графический режим, чтобы обеспечить приемлемое
качество отчета и поддержку русского алфавита. Графический режим
самый медленный, но если Вам нужно отпечатать текст в DRAFT-режиме
(быстрый режим), минуя драйвер Windows, то сначала сделайте
проверку принтера, загрузите шрифт, а потом уже отпечатайте отчет:
a) попробуйте послать ESC-команду подчеркивание: ESC-1
Test-underline ESC-0 (chr(27) & "-" & chr(1) ...). Если текст
будет с подчеркиванием, то можно будет загрузить драйвер принтера.
б) Возьмите любой драйвер загружающий русские символы. Он должен
иметь ДОСовский формат, т.е. разработан для DOS, а не для Windows.
Все DOS-драйверы в принципе одинаковы, их даже можно взять от
другого матричного принтера поддерживающего стандарт EPSON.
в) Драйвер русского алфавита загружается путем простого
копирования файла на принтер: FileCopy "Epson_Drive","PRN". При
удачной загрузке драйвера принтер не будет ничего печатать, иначе
выдаст "тарабарщину"
г) Текст из Access 2000 форматируется в ДОСовскую кодировку
командой: DoCmd.OutputTo acOutputReport, "Прайс-лист N2",
acFormatTXT, "PRN". В результате этого, он будет посылаться на
печать, минуя установленный в Windows драйвер печати, и
использовать Ваш набор символов и настройки принтера, которые Вы
выбрали на его панели управления. Решение в формате mdb Вы можете
найти в файле: la_report.mdb.

========================

Оценка за ответ эксперту Oleg K.: 5 баллов

Вопрос # 226
Чтобы отправлять сообщения по локальной сети через службу сообщений в своей программе на VB6, я написал вот так. ExecCmd "net send " & user & " " & text 'где ExecCmd - модуль ждущий завершения вызваной програмы, user – пользователь, text - текст сообщения. Как отправить сообщение не через вызов net send, а через функцию API или через WinSock или ...? Если это возможно, то как перед отправкой проверить есть ли пользователь в сети?

Отвечает
Bullet [PCLO]
Сообщение через службу сообщений можно отправить с момощью API функции
NetMessageBufferSend. Обьявить ее можно вот так:
Declare Function NetMessageBufferSend Lib "netapi32.dll" (ByVal ServerName As String, ByVal MsgName As String, ByVal FromName As String, Buf As Any, BufLen As Long) As Long
Пример:
sNameFrom = StrConv(txtHostFrom, vbUnicode)
sNameTo = StrConv(txtHostTo, vbUnicode)
sBuf = StrConv(txtText, vbUnicode)
lLen = LenB(txtText)

iRet = NetMessageBufferSend(vbNullString, sNameTo, sNameFrom, ByVal sBuf, ByVal lLen)
если iRet неравно 0 значит сообщение не дошло, так же можно проверять
в сети комп или нет. Раз не дошло то считать что не в сети. Но можно и
пинговать комп перед отправкой, но это долго, не советую.

Оценка за ответ эксперту Bullet [PCLO]: 5 баллов

Советуем подписаться на следующие рассылки


В избранное