Статьи
Написать нам

Недокументированные возможности ММВ, или 12 полезных советов - Статьи

Примечание as-master:

В этой небольшой статье (автор - Rush) приведено, однако, столько полезного, сколько иногда не найдешь и в статьях гораздо большего объема. Как мне представляется, эта информация предназначена прежде всего продвинутым пользователям ММВ, но и начинающие юзеры, желающие глубже вникнуть в суть работы программы, также не должны игнорировать данный материал.

1. Чтобы эдитбокс не терял фокус при работе скрипта, запускающегося когда изменяется текст, используйте вместо функции LoadText функцию DisplayValue.

2. Чтобы вернуть фокус эдитбоксу после нажатия, например, кнопки, впишите последней командой в скрипте этой кнопки функцию Show("EditBox"), где "EditBox" название нужного эдитбокса.

Фокус не только вернется в эдитбокс, но и весь текст в нем будет выделен...

3. Несмотря на то, что в ММВ не предусмотрено других логических операторов кроме AND (&) и OR (|), можно все же использовать в скриптах не только их.

Например, чтобы сравнить условия оператором XOR (исключающее ИЛИ, при котором условие выполняется, если истинной будет только одна из двух переменных), подойдет такой код:

MMB Script
If (a$='one'<>b$='two') Then

И выполнение условия произойдет по принципу логического оператора XOR.

4. Если нужно нескольким числовым переменным присвоить одинаковые значения (например, обнулить их в конце или начале скрипта) - вместо такой записи:

MMB Script
a=0
b=0
c=0

гораздо удобнее и экономнее использовать такую:

MMB Script
a=b=c=0

5. В продолжение предыдущего - не очень и полезная, но интересная особенность - string-переменные можно записать в одну строку, например, так:

MMB Script
a$='one'/b$='two'/c$='three'

Вообще, в качестве разделителя можно использовать любой арифметический или логический оператор кроме плюса.

6. Аналогом арифметического оператора MOD (вычисление остатка от деления), отсутствующего в ММВ, является такое уравнение:

MMB Script
result=x-INT(x/y)*y

где X - это делимое, а Y - делитель.

Этот оператор интересен для программирования тем, что одинаковый результат повторяется через Y раз, например:

MMB Script
For index=1 To 100
  n=index-INT(index/5)*5
  If (n=0) Then
    .......
  End
Next index

Здесь условие n=0 будет выполняться каждый пятый проход цикла.

7. Операции со строковыми данными всегда медленней, чем с числовыми. Просто потому, что они подвергаются лишнему преобразованию. Поэтому, например, код

MMB Script
If (LEN(a$)<>0) Then

работает быстрее, чем код

MMB Script
If (a$<>'') Then

Конечно, при разовом сравнении выигрыш по времени будет совсем небольшим, однако, если он находится внутри достаточно большого цикла, разница будет уже ощутимой.

8. Еще немного об ускорении работы - если у вас в цикле идёт проверка некоторых условий при помощи логического оператора AND, например:

MMB Script
If (x>1 & y=5 & LEN(a$)<12) Then
  .....
End

Можно применить метод сокращённой оценки:

MMB Script
If (x>1) Then
  If (y=5) Then
    If (LEN(a$)<12) Then
      .....
    End
  End
End

Здесь условие y=5 будет проверяться только тогда, когда будет соблюдено условие x>1, а в первом варианте оно проверяется всегда (вообще, в первом варианте проверяются всегда ВСЕ условия, даже если уже первое не соответствует истине). Во втором варианте также важна последовательность условий - верхним желательно помещать условие, которое может быть верным реже чем нижние и т. д. Если цикл большой, то сразу будет заметен выигрыш в скорости.

9. Арифметический оператор возведения в степень (^) работает в несколько раз медленней, чем простое умножение. Поэтому вычисление x=2^10 выполняется намного медленней вычисления x=2*2*2*2*2*2*2*2*2*2

10. Для того, чтобы узнать количество определенных символов (или сочетаний символов) в тексте, используйте функцию GetArrayNum. Например:

MMB Script
txt$='Ребята, не верьте девчатам из чата. У каждой есть дети и даже внучата. Еще борода и прокуренный свитер, а рядом стоит как минимум литр...'
symb$='та'
n=GetArrayNum(txt$,symb$)

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

Вот пример использования ее в скрипте определения позиции нужного символа:

MMB Script
txt$='Убедись, товарищ, лично — клизма действует отлично.'
symb$='ли'
null$=CHR(1)
tmp$=txt$
For i=1 To 3
  pos=POS(symb$,tmp$)
  tmp$=StrOfChar(null$,pos)+StrDel(tmp$,1,pos)
Next i
tmp$=''

Необходимый комментарий к скрипту: Как известно, функция POS ищет в заданной строке определенную пользователем подстроку и возвращает номер первого символа этой подстроки. Но только первую подстроку. А ведь их может быть несколько в строке. Этот скрипт и предназначен для расширения действия функции POS. В данном примере будет возвращен номер первого символа уже не первой, а третьей по счету подстроки.

Можно возвратить и номера первых символов всех имеющихся подстрок:

MMB Script
txt$='Убедись, товарищ, лично — клизма действует отлично.'
symb$='ли'
null$=CHR(1)
UBound=GetArrayNum(txt$,symb$)
tmp$=txt$
If (UBound>0) Then
  For i=1 To UBound
    pos[i]=POS(symb$,tmp$)
    tmp$=StrOfChar(null$,pos[i])+StrDel(tmp$,1,pos[i])
  Next i
End
tmp$=''

В этом примере в массиве pos[i] будут отображены номера первых символов всех подстрок.

12. Одна из самых полезных констант (которую, конечно, приходится создавать самому, так как в ММВ ее нет) при работе с текстом - перевод строки - CHR(13)+CHR(10). Ее можно использовать и как разделитель массива, при котором элементом массива становится отдельная строка, и для многих других целей.

Пример показывает, как с ее помощью можно быстро обработать текст на удаление начальных и конечных пробелов, а также пустых строк:

MMB Script
CRLF$=CHR(13)+CHR(10)
RTrim$=CHR(32)+CRLF$
LTrim$=CRLF$+CHR(32)
Empty$=CRLF$+CRLF$
txt$=CRLF$+StrFromFile(c:\test.txt,1,-1)+CRLF$
For i=0 To Infinity
  If (POS(LTrim$,txt$) | POS(RTrim$,txt$) | POS(Empty$,txt$)) Then
    txt$=StrChange(txt$,RTrim$,CRLF$)
    txt$=StrChange(txt$,LTrim$,CRLF$)
    txt$=StrChange(txt$,Empty$,CRLF$)
  Else
    Break()
  End
Next i
len=LEN(txt$)-4
txt$=StrCopy(txt$,3,len)
return=StrToFile(c:\test.txt,txt$,FALSE,FALSE)
txt$=''

Rush
17 Октября 2007
3530

Всего комментариев: 0


Добавлять комментарии могут только зарегистрированные пользователи
[ Регистрация | Вход ]