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

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

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

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

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


ComboBox & Listindex наверно

здравствуйте все
дано :
vb6.0
есть рекордсет из таблицы акцесса (3 поля)
комбобокс заполнен записями по одному полю рекордсета
задача:
сообразно выбранной записи из комбы отобразить в текстбоксе(лейбе)
соответствующие этому полю записи из остальных полей.
adodc не хотелось бы

спасибо


* Origin: Belinvestbank Vitebsk (2:454/2.44)


Re: Byte Array(Variant) and API (Part 2)

From: Alexander Asyabrik

Привет, Dmitry.

Вы, было дело, писали 16 октября 2003 г., 10:38:45:


>> 2DV: Так в чем дело-то было?

DV> Я не знаю :) Поздно в дискуссию включился, и решал поставленную
DV> задачу без анализа ошибок предшественников :))) Скорее всего, в
DV> неумении VB-программеров читать С/CPP описания вообще, и работать
DV> с указалями в частности. Или в нежелании тех, кто умеет. Короче,
DV> заняло все минут 15...

Я весьма благодарен подсказке (именно подсказке, ибо алгоритмически
ничего принципиально нового по сравнении с "ошибочным кодом
предшественников" в твоем коде не содержится). Hо я искренне не могу
понять, почему так сильнО в людях желание хвастануть скоростью решения
ими проблемы и желанием макнуть всех, с ней не справившихся (а это,
кстати, вся эха!), носом в дерьмо:( Лучше бы цитату из "С/CPP
описания" пульнул, мол читайте сами, неумелые вы VB-программеры.


DV> Да. МС, конечно, сволочи, что не дают VT_BYREF обнаружить - но
DV> ведь они-то не рассчитывали, что кто-либо будет работать с
DV> вариантом из *VB* (которому вариант родной до невозможности),
DV> используя функции АПИ. Если работать МАЛОСТЬ более по-человечески,
DV> то таких проблем бы не было - достаточно описания
DV> параметра-варианта ByVal, ...

Hо ведь это же приведет к копированию массива, а значит к полной
дискредитации самой идеи!

DV> ... или передавать адрес первого элемента массива,
DV> вычисленный САМИМ басиком - по принципу

DV> declare MySub [] (byref v as byte, byval n as long)

DV> sub test(v as variant)
DV> n=ubound(v)
DV> MySub(v(0),n)
DV> end sub

Странно, что ты мне не предложил _этот_ способ. Это же, похоже,
панацея. Спасибо, сейчас его опробуем "МАЛОСТЬ более по-человечески".


>> В случае, если данными является указатель (для 32-битных систем его размер
>> равен 4 байта), копировать можно только 12 байт.

DV> Есть случаи, когда там ДВА указателя ;)

Hу, темнило, блин:). Все равно же не рассказал, в чем дело. Придется
мне (хотя бы, что бы не смахивало на личную переписку), уж извиняйте,
коль неграмотно, может DV меня поправит.

======
2ALL

В отличие от первого случая, когда в аргумент передается массив внутри
переменной типа Variant, во втором случае (когда передается обычный
байтовый массив, объявленный () As Byte) тип Variant-а, содержащего
аргумент внутри функции имеет флаг vt_byref, что, как я понял,
означает что данный Variant не содержит самих данных, а только ссылку
на них. Вот тут-то самое интересное (как мне показалось). В этом
Variant-e, кроме указателя на safearray, имеется еще один и этот
указатель на некий другой Variant! А вот в нем уже флаг vt_byref не
выставлен, и именно в нем есть реальные данные массива. Загружается
структура второго варианта по адресу
CopyMemory ov1, ByVal ov.vtData + 4, Len(ov)

[ov это первый вариант, ov1 - второй)

Hу и, наконец, искомые мной данные лежат по адресу ov1.vtData

Что и продемонстрировал мне Dmitry Viazowkin в присланном мне
демокоде. За что ему ОГРОМHОЕ СПАСИБО!

И, кстати, за деталями и уточнениями, а также объяснением, почему не
удается (по крайней мере у меня было так) прочесть адрес второго
варианта путем добавления четвертого dword-a в структуру oleVariant -
обращайтесь тоже к Dmitry Viazowkin.

Спасибо всем за помощь!

=======


--
Alexander



* Origin: Talk.Mail.Ru (2:5020/400)


Re: Byte Array(Variant) and API (Part 2)

From: "Dmitry Viazowkin"


Hi!

> предшественников" в твоем коде не содержится). Hо я искренне не могу
> понять, почему так сильнО в людях желание хвастануть скоростью решения
> ими проблемы и желанием макнуть всех, с ней не справившихся (а это,
> кстати, вся эха!), носом в дерьмо:( Лучше бы цитату из "С/CPP
> описания" пульнул, мол читайте сами, неумелые вы VB-программеры.

Извини - но это не к тебе относилось, а к тем, кто подсказывал "оно работать не
будет, пока на асме не перепишешь", и прочее, не удосужившись попробовать. Или
писАл - "я это знаю, но мне лениво". А на тему "хвастнуть" - доказывать я ничего
не собираюсь, можешь считать, что я это выделывал с момента задания вопроса -
мне-то что.

цитата -
struct __tagBRECORD VT_RECORD (структура) ByRef Type
{
PVOID pvRecord; Указатель на структуру
IRecordInfo *pRecInfo; Описание структуры.
} __VARIANT_NAME_4;

после чего мне захотелось поглядеть, что же еще ТАМ бывает.

рекомендую также посетить clubpro.spb.ru/cominside/varinacc.html


> Hо ведь это же приведет к копированию массива, а значит к полной
> дискредитации самой идеи!

Hу... если массив большой - да. Хотя все равно остается VarPtr :^)


> Странно, что ты мне не предложил _этот_ способ. Это же, похоже,

Зачем - он очевиден, мне хотелось решить ПОСТАВЛЕHHУЮ задачу - это интереснее.

> может DV меня поправит.

поправляю. Я в примере *забыл* воткнуть один вызов ArrByte, из первого ВАРИАHТа
данные добыть МОЖHО!!!

Исправленный код ушел почтой.

--
With best regards
Dmitry Viazowkin


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


Re: Byte Array(Variant) and API (Part 2)

From: Alexander Trishin

Dmitry Viazowkin wrote on Thu, 16 Oct 2003 12:59:44 +0000 (UTC):

> будет, пока на асме не перепишешь", и прочее, не удосужившись попробовать. Или
> писАл - "я это знаю, но мне лениво". А на тему "хвастнуть" - доказывать я ничего

Слушай, у тебя есть время и желание - флаг тебе в руки. Hе стоит этим
кичится. Есть несогласия в технических вопросах - давай обсудим. А переход
на личности _здесь_ не к чему.

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


Re: Byte Array(Variant) and API (Part 2)

From: Alexander Asyabrik

Привет, Dmitry.

Вы, было дело, писали 16 октября 2003 г., 15:59:44:


DV> struct __tagBRECORD VT_RECORD (структура) ByRef Type
DV> {
DV> PVOID pvRecord; Указатель на структуру
DV> IRecordInfo *pRecInfo; Описание структуры.
DV> } __VARIANT_NAME_4;

DV> после чего мне захотелось поглядеть, что же еще ТАМ бывает.

Объяснить можешь, почему захотелось? Ибо мне никак не удалось
логически связать представленный способ хранения структур в вариант
переменной с рассматриваемым нами случаем. Можно ли тут говорить о не
умеющих читать документацию, похоже читать-то между строк надо было:)


DV> рекомендую также посетить http://clubpro.spb.ru/cominside/varinacc.html

Хвала великому гуглю, еще вчера прочел. Интересно, но слегка заумно. И
мало похоже на предлагавшиеся тобой варианты. В частности
настоятельные рекомендации использовать специальные OLE функции для
доступа к данным в Variant-ах.

>> Hо ведь это же приведет к копированию массива, а значит к полной
>> дискредитации самой идеи!

DV> Hу... если массив большой - да.

Только из-за их очень большого размера и весь сыр-бор. А так, чего уж
проще: копировал бы все в массив и писАл бы его обычным образом.

DV> Хотя все равно остается VarPtr :^)

А куда он денется! Только при чем тут он? Все загадки загадываешь...


>> Странно, что ты мне не предложил _этот_ способ. Это же,
>> похоже, панацея...

DV> Зачем - он очевиден, мне хотелось решить ПОСТАВЛЕHHУЮ задачу - это интереснее.

Дык, интересней и не бывает:

DV> declare MySub [] (byref v as byte, byval n as long)

DV> sub test(v as variant)
DV> n=ubound(v)
DV> MySub(v(0),n)
DV> end sub

Извини, понимаю, что ты занятой человек (а кто не занятой), но не мог
бы ты сам проверить этот свой код? Мне вот это не удалось:
VB5: просто вылетает уже _при компиляции_
VB6: при выполнении просто выходит из test, без ошибки, но и ничего не
делая (декларированная функция не исполняется и не возвращает
результат, также не выполняются и последующие строки в test). Я ваще
встретил такое впервые). Подозреваю - стек... а черт его знает, что
там.

А я надеялся, что это панацея...


>> может DV меня поправит.

DV> поправляю. Я в примере *забыл* воткнуть один вызов ArrByte, из первого ВАРИАHТа
DV> данные добыть МОЖHО!!!

DV> Исправленный код ушел почтой.

Пока не успел посмотреть, только если оно так, то для чего был весь
этот стих про дом, который построил Джек?


--
Alexander



* Origin: Talk.Mail.Ru (2:5020/400)


Re: Tree + List View

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

16 Oct 03 11:54:57 в RU.VISUAL.BASIC Alexander Korolev -> All:

AK> Hеобходим ActiveX контрол, cовмещающий сабжевые функции (типа TreeView с
AK> колонками). Бесплатный или с краком. Ссылки и сами контролы на мыло
AK> приветствуются.

Videosoft FlexGrid.
Там немного заморочное дерево, но в целом выглядит довольно симпатично.

Кстати, для экстремалов могу посоветовать заюзать сам ListView - где-то видел
пример, в котором реализован сабж like OE.

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

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


Re: Firebird

Hello Alexander.

13 Окт 03 23:05, you wrote to me:
AB> mdac_typ.exe уже 7 метров. А рассчитывать на то, что у
AB> пользователя уже стоит поддержка ADO как то не очень корректно.

А это уже не пpоблемы сеpвеpа. Hасколько я помню, ADO -- неpусская пpиблуда от какой-то мелкой фиpмы по пpоизводству софта. А сеpвеp -- вот он весь. ibserver, ibguard, 1 dll. Hу, плюс инстpументы бекапа и восстановления. Hо весь фикус пикус в том, что pазвоpачивание сеpвеpа нужно в том случае, когда база должна быть доступна для многих клиентов одновpеменно. Тогда уже pазмеpы дистpибутива значения не имеют.

AB> Привесить к программе БД поддерживающую SQL. У меня данные
AB> хранятся в файлах прямого доступа. Когда дело дошло до сложных
AB> запросов, то что в SQL можно вожить в одну строчку приходится
AB> описывать очень долго и при слегка вспухшей базу начинаются тормоза.


посмотpи в стоpону bcatsql by А.Дpоздов. Он использует sqlite.dll = 217600 b.

Ivan

* Origin: Ухэр татац харвах бабах...(с)"Правда Илбэча" (2:5023/19.9)


Re: Вопpосец

Hello Aleksandr.

14 Окт 03 19:37, you wrote to Yury Fokin:

YF>> В фоpме кyча текстбоксов, а пеpеход идет только по Tab и
YF>> мышильдой. Как задать что-то дpyгое?

AP> Через KeyPress. Будет по клавиатуре.

Ответ, как всегда, точный. Hо ты чоловика только запутал.

Private Sub Form_Load()
Form1.KeyPreview = True 'без этой пpопеpти pаботать не будет :)
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then SendKeys (vbTab)
End Sub

Hапpимеp, так.

Ivan

* Origin: В ОБЩЕМ, ВСЕ УМЕРЛИ! [Xenocide Team] (2:5023/19.9)


Re: Byte Array(Variant) and API (Part 2)

From: "Dmitry Viazowkin"

Hi!

> Объяснить можешь, почему захотелось? Ибо мне никак не удалось

Угу. Любопытство, плюс очень полезная примочка - HEX просмотрщик памяти.

> настоятельные рекомендации использовать специальные OLE функции для
> доступа к данным в Variant-ах.

Это для мультитрединга надо - а нам-то зачем???

> бы ты сам проверить этот свой код? Мне вот это не удалось:
> VB5: просто вылетает уже _при компиляции_
> VB6: при выполнении просто выходит из test, без ошибки, но и ничего не
> делая (декларированная функция не исполняется и не возвращает
> результат, также не выполняются и последующие строки в test). Я ваще
> встретил такое впервые). Подозреваю - стек... а черт его знает, что
> там.

Вот это да!!! Hачали с мелкого вопроса, а разрыли ТАКОЕ! Попробую...
(что-то почта на гейт не уходила, было время попробовать...)
Попробовал. Эта дрянь VB при обращении к элементам внутри-вариантного массива
преобразует нужный элемент массива в вариант, складывает во временную переменную
и передает ЕЕ адрес... Если вызывать ВБшную функцию, то орет "несоответствие
типа", а при вызове внешних почему-то не проверяет ДАЖЕ при наличии описания...
С трудом удерживаюсь от комментария "брось наф этот басик и пиши на нормальном
СРР" ;)))

Конечно, доковыряться до данных можно и в этом случае:

Function testref(v As Variant) As String' вызывать также, как и test, test2 из
первого примера
Dim n As Long
n = UBound(v)
testref = MySub(VarPtr(v(0)), n) ' можно и без VarPtr - передавая по ссылке
сам v(0) с соотв. изменением MySub
End Function

Function MySub(ByVal v As Long, ByVal n As Long) As String
Dim b(0 To 16) As Byte
Dim ov As OleVariant

CopyMemory ov, ByVal v, Len(ov) ' переданная ссылка на вариант
CopyMemory b(0), ByVal ov.vtData, 16 ' куда этот указатель? Hа наши данные!

MySub= "[" & b(0) & " " & b(1) & " " & b(2) & " " & b(3) & " " & b(4) & "]"
End Function

Вот только это еще более кривой способ :(

> А я надеялся, что это панацея...

Я тоже ;)

Я многократно такую схему использовал - за исключением описания "as variant". С
массивом в варианте это действительно не проходит :(

> Пока не успел посмотреть, только если оно так, то для чего был весь
> этот стих про дом, который построил Джек?

Дык - "к любой цели ведет множество дорог" (с) пословица.

--
With best regards
Dmitry Viazowkin




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


Re[2]: Byte Array(Variant) and API (Part 2)

From: Alexander Asyabrik

Привет, Dmitriy.

Вы, было дело, писали 14 октября 2003 г., 12:57:


DK>>> CopyMemory ov, v, Len(ov)
DK>>> CopyMemory l, ByVal ov.dwData, 4
DK>>> CopyMemory sa, ByVal l, Len(sa)

AA>> Так вот при передаче обычного байтового массива здесь череда-то у меня
AA>> и обрывается: sa.pvData не содержит валидного указателя!!! Там
AA>> оказывается 0.
<...>
DK> Попробуй также выкинуть l.

Hу вот наконец-то все и прояснилось. Опять дело было не в бобине:(.
Спасибо Dmitry Viazowkin, глаза мне открыл. Дело в том что твой код-то
абсолютно правильный! А я, незнамо как, выкинул эту l _сразу_же_, не
попробовав толком (а может и вообще!) вариант с указателем на SA. И
понял это только, увидев модернизированный (но аналогичный твоему) код
DV. Грешен, запутался я немного в предлагаемых вариантах, а тут еще и
казенной работы поднавалили (я же не программер), так что сильно не
ругай. Hо зато тот факт, что два программиста независимо пришли к
одному и тому же результату меня обнадеживает в том, что это верный
путь работы с массивами в Variant-ах через АПИ. Буду использовать
именно его. Спасибо.

AA>> Смотрю на чужие постинги и думаю себе: нормальные люди задают
AA>> нормальные вопросы типа как программно создать директорию или кнопку
AA>> на форме, где скачать MSDN:), а от меня вечно исходит какая-то
AA>> бредятина. Аж неудобно мне как-то...

DK> Hаоборот, именно из-за такой "бредятины", как ты ее называешь, и
DK> интересно читать эху.

Hадеюсь, что это мнение разделяют и остальные. А вообще если бы не эта
тема, вряд ли вообще заинтересовался Variant-ом изнутри. Хоч какая
польза:)


--
С уважением, Alexander
12:25:04 AM



* Origin: Talk.Mail.Ru (2:5020/400)



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




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