Техническая поддержка :

Современные решения

для защиты Windows программ

и восстановления исходного кода

Обсуждение программирования на Visual Basic в конференции ru.visual.basic


О сколько нам открытий чудных... (с) А.С. Пушкин

From: "A. Skrobov"

Hi All,

(Дизклеймер (C) Alexander Asyabrik :
Я собственно и не с вопросом...
Подозреваю, что я не одинок в своем неведении (по крайней мере надеюсь:-)
А фича-то, блин, удобная...
Прошу шибко грамотных;-) не пинаться, написано не для них.)

1. Как задать описание (helpstring) классу
Известно, что описание (helpstring) для проекта задаётся в окне Project ->
Properties, а для членов класса - в окне Tools -> Procedure Attributes.
Однако, для классов разработчики VB не предусмотрели удобного способа задать
описание. Hужно открыть Object Browser (F2), найти нужный класс, щёлкнуть
правой кнопкой и выбрать пункт Properties. В открывшемся окне и задаётся
описание. Альтернативный способ задать описание классу - вписать строку вида
Attribute VB_Description = "Описание"
в начало файла класса, контрола или формы, сразу после других строк Attribute.
Описание контрола отображается, например, программой ActiveX Control Test
Container в списке доступных контролов, так что задавать его имеет смысл. Где
показываются описания других видов классов - также, как и событий, я не нашёл.
Только что в самом Object Browser-е.

2. Если создать на панели инструментов кнопку About Microsoft Visual Basic и
переименовать её в "Show VB Credits" (регистр важен), то при щёлчке на неё
покажут мультик с музыкой и списком разработчиков VB.

3. Friend Event
Как известно, VB не позволяет создавать не-публичные события; однако, они
могут понадобиться, например, когда какой-то публичный класс должен оповещать
о действиях с собой другой публичный класс. Лобовое решение - создать в
оповещаемом классе дружественный метод и вызывать его из оповещающего - не
проходит из-за возникновения циклической ссылки. Любители вылавливать баги
могут устанавливать одну из этих двух ссылок через CopyMemory вместо Set и
затем в событии Terminate так же очищать, но "есть способ лучше". А именно,
создать приватный класс с единственным методом (с нужными параметрами) и
единственным событием. Код в этом классе примерно такой:
Event Update(ByVal Parm As Long)
Public Sub Update(ByVal Parm As Long)
RaiseEvent Update(Parm)
End Sub
Теперь оповещаемый класс создаёт у себя экземпляр этого промежуточного класса
и передаёт ссылку на него оповещающему, а тот, когда нужно, производит
оповещение, вызывая метод Update переданного экземпляра. Просто, без API, и
без циклических ссылок.
(Когда это может быть нужно: пусть у нас есть контрол TreeView с коллекцией
Nodes; когда в коллекцию добавляют новые узлы, контрол должен
перерисовываться.)

4. Быстрее, чем CopyMemory
Часто - даже в основном - процедурой CopyMemory приходится пользоваться для
пересылки 4-байтных значений. Однако та в этом отношении крайне неэффективна,
поскольку инициализация цикла в этом случае занимает больше времени, чем его
тело. Эффективнее использовать функции msvbvm60:
Private Declare Sub CopyLong Lib "MSVBVM60.DLL" Alias "GetMem4" (lFrom As Any,
lTo As Any)
Private Declare Sub PokeLong Lib "MSVBVM60.DLL" Alias "PutMem4" (lTo As Any,
ByVal lFrom As Long)
Hужно только обратить внимание на обратный порядок аргументов в CopyLong - по
сравнению с CopyMemory, и с тем, что PokeLong принимает вторым параметром не
адрес, а значение.
Такие же функции существуют и для остальных типов данных - в их названиях
вместо цифры 4 стоит одно из значений 1, 2, 8, Str, Obj, Var. С каким типом
работает какая - вроде бы ясно.

* Origin: FidoNet Online (2:5020/175.2)


Re: Ура!!

From: "Sergei Ho"

"Dmitriy Kozyrev" wrote in message news:65898634 [@] p148.f11.n5023.z2.ftn...
> Мы где-то виделись, Sergei?
>
> 10 Mar 04 09:42:28 в RU.VISUAL.BASIC Sergei Ho -> мне:
>
> >> http://mastershome.net.ru/vbfaq/
> SH> RAR не открывается!
>
> Архив запакован в WinRar 3.30, т.е. для его открытия потребуется версия не
> ниже 2.90. Если большинство это будет напрягать - могу переделать в Cab.
>
> Всего хорошего!
> Дмитрий Козырев aka Master

Я и пробовал v3.30! Говорит: неизвестный формат или разрушение.
Два раза скачивал.
С RAR всегда какие-то проблемы.
А зачем он вообще нужен?
Может он и дает 10Кб экономии при закачке архива,
но потом придется искать и качать разные версии RAR и подбирать.
А почему бы не использовать простой демократичный ZIP,
8O))
который у всех откроется? Или положить архивы разных форматов?

Сергей.


* Origin: Demos online service (2:5020/400)


Модем

Приветствую тебя, _Dmitriy_ !


Dmitriy Kozyrev и Vitaliy Pryahin сидели дома,пили пиво и болтали на тему _Re: Модем_.


DK> Как вариант: можно через MSComm пооткрывать порты от 1 до 4 (или до 256) и
DK> послать в них команду "AT". Если был отклик "OK" - значит, модем там,
DK> скорее всего, есть.
пробовал, да вот глючит.
не подкинешь примерчик :)?
DK> Hо учти, что таким образом можно лишь посоветовать юзеру, какой порт
DK> выбрать. Ограничивать же его выбор лишь теми портами, от которых был
DK> получем отклик, ни в коем случае нельзя.
это я знаю и делать этого как раз не хотел :)


Hе скучай,_Dmitriy_. С уважением,Виталий.

* Origin: (2:5096/19)


Модем

Приветствую тебя, _Dmitry_ !


Dmitry Viazowkin и Vitaliy Pryahin сидели дома,пили пиво и болтали на тему _Re: Модем_.


>> подкиньте код для определения на каком/каких портах висит модем в системе.

DV> TAPI - EnumDevices, в свойствах можно найти и номер порта.
Чет не понял, пример можешь дать, если не влом?

Hе скучай,_Dmitry_. С уважением,Виталий.

* Origin: (2:5096/19)


Re: Ура!!

Мы где-то виделись, Sergei?

10 Mar 04 09:42:28 в RU.VISUAL.BASIC Sergei Ho -> мне:

>> http://mastershome.net.ru/vbfaq/
SH> RAR не открывается!

Архив запакован в WinRar 3.30, т.е. для его открытия потребуется версия не
ниже 2.90. Если большинство это будет напрягать - могу переделать в Cab.

Всего хорошего!
Дмитрий Козырев aka Master

* Origin: Дорогу осилит идущий. (2:5023/11.148)


Re: Модем

From: "Dmitry Viazowkin"

Hi!

> DV> TAPI - EnumDevices, в свойствах можно найти и номер порта.
> Чет не понял,

Ты про MSDN слышал? Вот там есть описание интерфейса TAPI - ко всем телефонным
устройствам. С его помощью подобные задачи обычно и решаются. Только одно HО -
из VB его страшно неудобно использовать, приходится обвязку делать.



>пример можешь дать, если не влом?

Дай нормальный адрес - отправлю рабочий пример. А пока - цикл сканирования
устройств


for (dwDeviceID = 0; dwDeviceID < g_dwNumDevs; dwDeviceID ++) {
dwAPIVersion = I_lineNegotiateAPIVersion(dwDeviceID);
if (dwAPIVersion) {

//удобная обертка к lineGetDevCaps
lpLineDevCaps = I_lineGetDevCaps(lpLineDevCaps, dwDeviceID,
dwAPIVersion);
if (lpLineDevCaps) {
if ((lpLineDevCaps -> dwLineNameSize) &&
(lpLineDevCaps -> dwLineNameOffset) &&
(lpLineDevCaps -> dwStringFormat == STRINGFORMAT_ASCII)) {
// This is the name of the device.
lpszLineName=ExtractString(lpLineDevCaps, lpLineDevCaps ->
dwLineNameOffset, lpLineDevCaps->dwLineNameSize);


//помимо имени, здесь можно получить почти любую инфу про устройство - в том
числе и его порт.
// для этого - lineGetDevConfig, указав класс "comm/datamodem/portname"

if(lpszLineName==NULL) // Line name started with a NULL.
lpszLineName = szLineNameEmpty;
} else // DevCaps doesn't have a valid line name. Unnamed.
lpszLineName = szLineUnnamed;
} else // Couldn't GetDevCaps. Line is unavail.
lpszLineName = szLineUnavail;
} else // Couldn't NegotiateAPIVersion. Line is unavail.
lpszLineName = szLineUnavail;

// Put the device name into the VB control
CallObject(g_lpUnk,lpszLineName,dwDeviceID);

// If this line is usable and we don't have a default initial
// line yet, make this the initial line.
if ((lpszLineName != szLineUnavail) &&
(dwDefaultDevice == MAXDWORD) &&
(VerifyUsableLine(dwDeviceID) == SUCCESS)) {
dwDefaultDevice = dwDeviceID;
}
}


где-то перед этим вызываешь

lReturn = lineInitializeEx(&g_hLineApp, g_hInstance,
0/*LineCallbackFunc*/, "TapiComm", &g_dwNumDevs, &APIvers,&LineParams);

оно дает общее количество устройств в системе.

Как-то так ;)


--
With best regards
Dmitry Viazowkin


* Origin: Me? Organized??? (2:5020/400)


IIS

Hi!

Если не в тему, то сорри.
ru.asp неработает у меня.

Имееся w2k server sp2. Запущен IIS:
файл gb.asp: 

dim strconn
dim db
strconn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db\db.mdb")
Set db = Server.CreateObject("ADODB.Connection")
db.open strconn
sqlquery="insert into gb(id,iddate,name,message,subject) values("&cstr(max)&",'"&iddate&"','"&name1&"','"&message&"','"&subject&"')"
>Set rs = db.Execute(SQLQuery)
db.Close
Set db = Nothing

Hа показанной строке ругается:
Error Type:
Microsoft JET Database Engine (0x80004005)
Operation must use an updateable query.
/rshb/gb.asp, line 150

Причем,на локальной машине w2k proff sp2,access97/2000.Все прекрасно работает.
Hа сервере ругается,а select работает :
SQLQuery = "Select * From gb ORDER BY id DESC"
Set rs = db.Execute(SQLQuery)

Чего править?!ruki.sys?brain.com? Hе ужели придется ставить access на сервак? Или не из-за аксеса?

Best wishes,
OSer.

* Origin: Embankment LAN Point (2:5066/70.103)


Re: True DBGRID

Hello Gribkov!

Thu Mar 04 2004 09:04, Gribkov M.N. wrote to All:

GN> From: "Gribkov M.N."


GN> Коллеги! Подскажите!
GN> Как сделать так, чтобы TDBdown не только разворачвался над нужным полем,
GN> но и на экране в качестве значенимя поля было например Имя,
GN> а на самом деле в качестве значения был бы код!

GN> Hу то есть как в Акцесе. Пользователь видит название, а в программе и в
GN> таблицу пишется код.

Hа закладочку Values. Кнопочка Translate. И заполняешь внизу замену. Для небольших справочников помогает. А иначе я так понял что-то типа DbDropDown юзать надо.

Dmitry

* Origin: Malikov [@] ngs.ru (2:5005/68.18)


Re: IIS

From: Alexander Trishin

Sergey Ozyakov wrote on Wed, 10 Mar 2004 17:19:25 +0300:

> Или не из-за аксеса?

NTFS permissions


--
AT
* Origin: Demos online service (2:5020/400)


О сколько нам открытий чудных... (с) А.С. Пушкин

From: "A. Skrobov"

Hi All,

(Дизклеймер (C) Alexander Asyabrik :
Я собственно и не с вопросом...
Подозреваю, что я не одинок в своем неведении (по крайней мере надеюсь:-)
А фича-то, блин, удобная...
Прошу шибко грамотных;-) не пинаться, написано не для них.)

1. Как задать описание (helpstring) классу
Известно, что описание (helpstring) для проекта задаётся в окне Project ->
Properties, а для членов класса - в окне Tools -> Procedure Attributes.
Однако, для классов разработчики VB не предусмотрели удобного способа задать
описание. Hужно открыть Object Browser (F2), найти нужный класс, щёлкнуть
правой кнопкой и выбрать пункт Properties. В открывшемся окне и задаётся
описание. Альтернативный способ задать описание классу - вписать строку вида
Attribute VB_Description = "Описание"
в начало файла класса, контрола или формы, сразу после других строк Attribute.
Описание контрола отображается, например, программой ActiveX Control Test
Container в списке доступных контролов, так что задавать его имеет смысл. Где
показываются описания других видов классов - также, как и событий, я не нашёл.
Только что в самом Object Browser-е.

2. Если создать на панели инструментов кнопку About Microsoft Visual Basic и
переименовать её в "Show VB Credits" (регистр важен), то при щёлчке на неё
покажут мультик с музыкой и списком разработчиков VB.

3. Friend Event
Как известно, VB не позволяет создавать не-публичные события; однако, они
могут понадобиться, например, когда какой-то публичный класс должен оповещать
о действиях с собой другой публичный класс. Лобовое решение - создать в
оповещаемом классе дружественный метод и вызывать его из оповещающего - не
проходит из-за возникновения циклической ссылки. Любители вылавливать баги
могут устанавливать одну из этих двух ссылок через CopyMemory вместо Set и
затем в событии Terminate так же очищать, но "есть способ лучше". А именно,
создать приватный класс с единственным методом (с нужными параметрами) и
единственным событием. Код в этом классе примерно такой:
Event Update(ByVal Parm As Long)
Public Sub Update(ByVal Parm As Long)
RaiseEvent Update(Parm)
End Sub
Теперь оповещаемый класс создаёт у себя экземпляр этого промежуточного класса
и передаёт ссылку на него оповещающему, а тот, когда нужно, производит
оповещение, вызывая метод Update переданного экземпляра. Просто, без API, и
без циклических ссылок.
(Когда это может быть нужно: пусть у нас есть контрол TreeView с коллекцией
Nodes; когда в коллекцию добавляют новые узлы, контрол должен
перерисовываться.)

4. Быстрее, чем CopyMemory
Часто - даже в основном - процедурой CopyMemory приходится пользоваться для
пересылки 4-байтных значений. Однако та в этом отношении крайне неэффективна,
поскольку инициализация цикла в этом случае занимает больше времени, чем его
тело. Эффективнее использовать функции msvbvm60:
Private Declare Sub CopyLong Lib "MSVBVM60.DLL" Alias "GetMem4" (lFrom As Any,
lTo As Any)
Private Declare Sub PokeLong Lib "MSVBVM60.DLL" Alias "PutMem4" (lTo As Any,
ByVal lFrom As Long)
Hужно только обратить внимание на обратный порядок аргументов в CopyLong - по
сравнению с CopyMemory, и с тем, что PokeLong принимает вторым параметром не
адрес, а значение.
Такие же функции существуют и для остальных типов данных - в их названиях
вместо цифры 4 стоит одно из значений 1, 2, 8, Str, Obj, Var. С каким типом
работает какая - вроде бы ясно.

* Origin: FidoNet Online (2:5020/175.2)



Назад Содержание Вперед




Главная     Программы     Статьи     Разное     Форум     Контакты