Можно ли явно указать CompareMethod в выражении?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 20.06.2010 (Вс) 1:46

Некоторые функции (например InStr) принимают параметр Compare.
Вопрос: как самому написать такую функцию?

PS
Пишу InStrRev для VBA5. Пока выглядит так:

Код: Выделить всё
Public Function InStrRev&(String1$, String2$, Optional StartPos&, Optional Compare& = -1, Optional InNumber& = 1)
' !StartPos меряется СЛЕВА! (это памятка самому себе :)
' InNumber--какое по счету (справа) вхождение искать
' Compare на самом деле ВСЕГДА vbUseCompareOptions (добавлено для "совместимости")
Dim i&
If Len(String1) And CBool(Len(String2)) Then Else Exit Function
If StartPos <= 0 Then StartPos = Len(String1)
For i = StartPos To 1 Step -1
    If Mid(String1, i, Len(String2)) = String2 Then
        InNumber = InNumber - 1
        If InNumber Then Else Exit For
    End If
Next i
InStrRev = i
End Function

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение Хакер » 20.06.2010 (Вс) 2:01

1) Чудовищно низкопроизводительный код.
2) lstrcmp, lstrcmpi, CompareString — к твоим услугам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 20.06.2010 (Вс) 3:03

1) о скорости речь пока не идет--главное, чтобы работало в принципе;
2) это поможет лишь отчасти, ибо есть еще vbUseCompareOption и vbDatabaseCompare. Что делать с ними?
ps
Походу, а lstrcmp учитывает национальные настройки (язык системы)?

PPS
А можно ли как-то прочесть текущее значение Option Compare модуля?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение Хакер » 20.06.2010 (Вс) 3:07

1) О ней речь идёт всегда.
2) Выбор за тобой.

А можно ли как-то прочесть текущее значение Option Compare модуля?

Недокументированно — да.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение NashRus » 20.06.2010 (Вс) 9:46

Код: Выделить всё
Option Explicit
'Option Compare Text
Option Compare Binary

Private Sub Form_Load()
    Debug.Print fnGetOptionCompare()
End Sub

Private Function fnGetOptionCompare() As VbCompareMethod
    fnGetOptionCompare = IIf("A" = "a", vbTextCompare, vbBinaryCompare)
End Function

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 22.06.2010 (Вт) 12:37

Хакер писал(а):
А можно ли как-то прочесть текущее значение Option Compare модуля?

Недокументированно — да.

Так расскажи, как ;)
Кстати, а как это делает штатная InStr?

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение NashRus » 22.06.2010 (Вт) 12:50

0xy писал(а):
Хакер писал(а):
А можно ли как-то прочесть текущее значение Option Compare модуля?

Недокументированно — да.

Так расскажи, как ;)
Кстати, а как это делает штатная InStr?



мой пост не подходит ?

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 22.06.2010 (Вт) 13:55

Нет, ибо есть еще vbDatabaseCompare.
Да и не красиво: хотелось бы сделать точно так же, как в InSrt (если параметр опущен, должно испольльзоваться Option Compare модуля.)

Хакер
Так как прочесть?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение Хакер » 22.06.2010 (Вт) 14:00

Как InStr читает, так же и прочесть. Как читает InStr — посмотреть отладчиком.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 22.06.2010 (Вт) 15:54

InStr ни чего не читает. Она получает готовый параметр ;)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение Хакер » 22.06.2010 (Вт) 15:56

Если ты укажешь -1, что тогда она использует?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение NashRus » 22.06.2010 (Вт) 16:25

0xy писал(а):Нет, ибо есть еще vbDatabaseCompare.
Да и не красиво: хотелось бы сделать точно так же, как в InSrt (если параметр опущен, должно испольльзоваться Option Compare модуля.)


Ерунду говоришь. Элегантно и красиво и единственно правильно.
А ты совсем не шаришь: Database только для Акссеса, см. МСДН.

Вот и вызывай в своей функции мою для по-уомолчания и будет тебе счастье, хотя навряд ли.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 22.06.2010 (Вт) 16:38

А на -1 она вообще ругается "недопустимый аргумент" :)
И действительно: в списке подсказок всего три варианта, а vbUseCompareOption нет. Что в VB6, что в Access 97.

Походу, дефолтное значение параметра [Compare As vbCompareMethod=vbBinaryCompare] в подсказке указано ОШИБОЧНО! На самом деле, по-умолчанию как раз vbUseCompareOption, но его нельзя задавать явно!

Так вот, если этот параметр не указан, то при вызове функции, в стек кладется не ноль и не -1, а значение, соответствующее Option Compare модуля!

PS
Вызов идет через переходник:
/$ MOV EAX,DWORD PTR SS:[ESP+4]
|. MOV EDX,DWORD PTR SS:[ESP+8]
|. PUSH 1
|. MOV ECX,DWORD PTR DS:[EAX]
|. MOV EAX,DWORD PTR DS:[EDX]
|. PUSH ECX
|. PUSH EAX
|. PUSH 0 (PUSH 1, PUSH 2)
|. CALL DWORD PTR DS:[<&MSVBVM60.__vbaInStr>]
\. RET 8

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 23.06.2010 (Ср) 12:36

Хакер
По-моему, это доказывает, что значение Option Compare модуля в явном виде не хранится. Или??

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение NashRus » 23.06.2010 (Ср) 14:29

Это опция компилятора. Какое хранение.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение Хакер » 23.06.2010 (Ср) 14:33

0xy, ты проверяешь на VB или на VBA?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли явно указать CompareMethod в выражении?

Сообщение 0xy » 23.06.2010 (Ср) 15:58

Это проверялось и там, и там:
А на -1 она вообще ругается "недопустимый аргумент"
И действительно: в списке подсказок всего три варианта, а vbUseCompareOption нет. Что в VB6, что в Access 97.

Походу, дефолтное значение параметра [Compare As vbCompareMethod=vbBinaryCompare] в подсказке указано ОШИБОЧНО! На самом деле, по-умолчанию как раз vbUseCompareOption, но его нельзя задавать явно!


А переходник для вызова InStr--из скомпиленого VB exe.

Сейчас глянул в VBA--и здесь тоже функция InStr получает от переходника готовый параметр Compare [=Option Compare].
Правда, переходник в VBA поинтереснее: он действительно использует сохраненное значение. Но я не представляю, как его можно найти из своей функции (которая, само-собой, описана за пределами вызывающего ее модуля).


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 99

    TopList