VB6-программистам
Я очень люблю порядок и простоту в исходном коде программ, поэтому часто стараюсь избавиться от лишних операторов, сократить размер кода.
Еще давно я узнал значение приятной функции IIf которая позволила избавиться мне от лишних операторов IF, если нужно вывести True или False в зависимости от значения переменной, например:
chk_act - это CheckBox, в зависимости от значения которого определяется значение булива BoolActive.
Спустя некоторое время я задумался - а почему бы не сделать фунцкию с обратным эффектом, которая, наоборот будет возвращать разные значения в зависимости от булива.
Так родилась моя самодельная функция с названием BIf:
If row Then BIf = truepart: Exit Function
BIf = falsepart
End Function
Поразительно, но применение новая функция нашла себе везде, я прямо жить без нее не мог. А каждый раз ее использования давал повод для радости - никаких If'ов.
Не будем рассматривать самый банальный случай ее использования, есть намного более интересные ситуации.
Определить номер активного OptionButton, если дан массив из трех таких объектов:
Определение значения переменной в зависимости от того, нажат ли Shift:
Рисование сложной сетки 32х32, которая еще поделена на квадраты 16х16:
For i = 0 To 640 Step 16
pctEd.Line (i, 0)-(i, 480), BIf(Not bool16, clrGrid1, clrGrid2)
bool16 = Not bool16
Next i
For i = 0 To 480 Step 16
pctEd.Line (0, i)-(640, i), BIf(bool16, clrGrid1, clrGrid2)
bool16 = Not bool16
Next i
Впрочем, несмотря на всю свою полезность, функция кажется слишком банальной. Не удивлюсь, если не один я такое придумал.
EDIT: После разговора с Yanex'ом я понял, что жутко ступил, и что еще давным давно неправильно понял значение функции IIf в результате чего заварилась вся эта каша.
IIf оказывается, выполняет не то, что я писал выше, а ровно то же, что и моя самодельная функция.
LOL.
Комментарии:
xyz – 15.04.2010 18:22
в вб не работает вот это?:
boolActive := chk_act.Value = 1;
Yanex – 16.04.2010 15:41
xyz: нет, не работает.
По теме: либо я что-то не понимаю, либо BIf - это полный аналог функции IIf, только самописный.
Кстати, у тебя хостинг ложился днем :)
Yanex – 16.04.2010 15:43
Кстати, твоя функция сделана не по канонам программирования :) У всего должен быть один вход и один выход. Тогда уж вот так сделать стоит:
Public Function BIf(row As Boolean, truepart, falsepart)
If row Then BIf = truepart Else BIf = falsepart
End Function
Тем более что никакой оптимизации от преждевременного выхода ты не получишь.
vladikcomper – 18.04.2010 08:01
После разговора с Yanex'ом по аське я понял, что жутко ступил, и что давным давно неправильно понял значение функции IIf в результате чего заварилась вся эта каша.
IIf оказывается, выполняет не то, что я писал выше, а ровно то же, что и моя самодельная функция.
lol
vladikcomper – 18.04.2010 08:02
> Тем более что никакой оптимизации от преждевременного выхода ты не получишь.
Это привычка, выработанная после полугодового программирования на ассемблере. ;)