Автор | Сообщение |
|
| |
Пост N: 249
Зарегистрирован: 05.10.06
|
|
Отправлено: 04.02.20 10:33. Заголовок: оператор IN
Подскажите как можно реализовать препроцессором конструкцию вида Var IN (id1,id2,....idN) что бы возвращала значения Var==Id1.or.Var==Id2.or.....Var==IdN Причем что бы в скобках оператора можно было использовать так же и массив значений
|
|
|
Ответов - 13
[только новые]
|
|
|
| Администратор
|
Пост N: 3911
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.20 11:22. Заголовок: Можно просто использ..
Можно просто использовать ASCAN: ASCAN({id1,id2,....idN}, Var) # 0
|
|
|
|
| |
Пост N: 250
Зарегистрирован: 05.10.06
|
|
Отправлено: 04.02.20 11:59. Заголовок: Pasha пишет: ASCAN(..
Pasha пишет: цитата: | ASCAN({id1,id2,....idN}, Var) # 0 |
| тоже вариант, но хотелось бы транслировать препроцессором, так проще читается код, как работает препроцессор очень смутно понимаю )
|
|
|
|
| Администратор
|
Пост N: 3912
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.20 12:32. Заголовок: Вряд ли возможно пре..
Вряд ли возможно препроцессором транслировать в конструкцию с .or. Можно написать функцию, которая бы принимала параметры и выдавала бы .or., и эту функцию вызывать средствами препроцессора. А зачем ее писать, если уже есть ascan ?
|
|
|
|
| |
Пост N: 252
Зарегистрирован: 05.10.06
|
|
Отправлено: 04.02.20 18:05. Заголовок: Pasha пишет: и эту ..
Pasha пишет: цитата: | и эту функцию вызывать средствами препроцессора |
| Да, именно это, хотелось бы научиться транслировать разные текстовые конструкции в функции и передавать ей параметры описанные по правилам, после ключевых слов параметры подставляются туда куда надо, особенно если у функции множество принимаемых параметров...
|
|
|
|
| постоянный участник
|
Пост N: 3020
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.02.20 20:36. Заголовок: MIKHAIL пишет Да, им..
MIKHAIL пишет цитата: | Да, именно это, хотелось бы научиться транслировать |
| см. MiniGu\Include\i_*.ch там много примеров. Такой #translate MemVar . <AreaName> . <FieldName> => MemVar<AreaName><FieldName> /////////////////////////////////////////////////////////////////////////////// // STANDARD BROWSE /////////////////////////////////////////////////////////////////////////////// #command @ <row>,<col> BROWSE <name> ; [ ID <nId> ] ; [ <dummy1: OF,PARENT,DIALOG> <parent> ] ; [ WIDTH <w> ] ; [ HEIGHT <h> ] ; [ HEADERS <headers> ] ; [ WIDTHS <widths> ] ; [ WORKAREA <workarea> ] ; [ FIELDS <Fields> ] ; [ VALUE <value> ] ; [ FONT <fontname> ] ; [ SIZE <fontsize> ] ; [ <bold : BOLD> ] ; [ <italic : ITALIC> ] ; [ <underline : UNDERLINE> ] ; [ <strikeout : STRIKEOUT> ] ; [ TOOLTIP <tooltip> ] ; [ BACKCOLOR <backcolor> ] ; [ DYNAMICBACKCOLOR <dynamicbackcolor> ] ; [ DYNAMICFORECOLOR <dynamicforecolor> ] ; [ FONTCOLOR <fontcolor> ] ; [ ON GOTFOCUS <gotfocus> ] ; [ ON CHANGE <change> ] ; [ ON LOSTFOCUS <lostfocus> ] ; [ ON DBLCLICK <dblclick> ] ; [ <edit : EDIT> ] ; [ <inplace : INPLACE> ] ; [ <append : APPEND, ALLOWAPPEND> ] ; [ INPUTITEMS <inputitems> ] ; [ DISPLAYITEMS <displayitems> ] ; [ ON HEADCLICK <aHeadClick> ] ; [ <d2: WHEN, COLUMNWHEN> <aWhenFields> ]; [ <d3: VALID, COLUMNVALID> <aValidFields> ]; [ VALIDMESSAGES <aValidMessages> ] ; [ READONLY <aReadOnly> ] ; [ <lock: LOCK> ] ; [ <Delete: DELETE, ALLOWDELETE> ] ; [ <style: NOLINES> ] ; [ IMAGE <aImage> ] ; [ JUSTIFY <aJust> ] ; [ <novscroll: NOVSCROLL> ] ; [ HELPID <helpid> ] ; [ <break: BREAK> ] ; [ COLUMNSORT <columnsort> ] ; [ HEADERIMAGE <aImageHeader> ] ; [ <doublebuffer: PAINTDOUBLEBUFFER> ] ; [ <notabstop: NOTABSTOP> ] ; [ ON INIT <bInit> ] ; =>; _DefineBrowse ( <"name"> , ; <"parent"> , ; <col> , ; <row> , ; <w> , ; <h> , ; <headers> , ; <widths> , ; <Fields> , ; <value> , ; <fontname> , ; <fontsize> , ; <tooltip> , ; <{change}> , ; <{dblclick}> , ; <aHeadClick> , ; <{gotfocus}> , ; <{lostfocus}>, ; <"workarea"> , ; <.Delete.>, ; <.style.> , ; <aImage> , ; <aJust> , ; <helpid> , ; <.bold.> , ; <.italic.> , ; <.underline.> , ; <.strikeout.> , ; <.break.> , ; <backcolor> , ; <fontcolor> , ; <.lock.> , ; <.inplace.> , ; <.novscroll.> , ; <.append.> , ; <aReadOnly> , ; <aValidFields> , ; <aValidMessages> , ; <.edit.> , ; <dynamicforecolor> , ; <dynamicbackcolor> , ; <aWhenFields>, ; <nId>, ; <aImageHeader>, ; <.notabstop.> , ; <inputitems> , ; <displayitems> , ; <.doublebuffer.> , <columnsort> , <bInit> )
|
|
|
|
| Администратор
|
Пост N: 3913
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.20 21:19. Заголовок: можно так: #transla..
можно так: #translate <var> IN <values,...> => ASCAN({ <values> }, <var>) # 0 тогда конструкция if n1 IN 1,2,3 транслируется в оператор: if ASCAN({ 1,2,3 }, n1) # 0
|
|
|
|
| постоянный участник
|
Пост N: 3021
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.02.20 10:27. Заголовок: Можно чуть усилить, ..
Можно чуть усилить, получая номер позиции сразу #translate <var> IN <values,...> [ TO <var2> ] => ASCAN({<values>}, <var> ) # 0 ;; [ <var2> := ] ASCAN({<values>}, <var> ) тогда p := -1 b := 30 c := .F. a := {"111","222","333","444","555" } If b IN 10,20,30,40,50 c := .T. IF b IN 10,20,30,40,50 TO p ENDIF EndIf ? 'b =', c, p, iif( p > 0, a[ p ], "" )
|
|
|
|
| |
Пост N: 253
Зарегистрирован: 05.10.06
|
|
Отправлено: 06.02.20 13:04. Заголовок: SergKis пишет: ? ..
SergKis пишет: цитата: | ? 'b =', c, p, iif( p > 0, a[ p ], "" ) |
| Кстати, никогда не мог понять чем if() отличается от iif() ?
|
|
|
|
| |
Пост N: 7161
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.02.20 13:35. Заголовок: MIKHAIL пишет: Кста..
MIKHAIL пишет: цитата: | Кстати, никогда не мог понять чем if() отличается от iif() ? |
| это одно и тоже
|
|
|
|
| постоянный участник
|
Пост N: 3022
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.02.20 13:49. Заголовок: MIKHAIL пишет:Кстати..
MIKHAIL пишет: цитата: | Кстати, никогда не мог понять чем if() отличается от iif() ? |
| Использую iif(...) по привычке и т.к. используемые редакторы подсвечивают if и не подсвечивают iif.
|
|
|
|
| Администратор
|
Пост N: 3914
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.02.20 14:35. Заголовок: Отключаю FarColorer,..
Отключаю FarColorer, так как с ним редактор чуть подтормаживает, а это чуть некомфортно. Вбиваю if, так как на одну букву меньше вбивать. Тоже привычка
|
|
|
|
|
| постоянный участник
|
Пост N: 3025
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.02.20 14:55. Заголовок: Pasha пишет Отключаю..
Pasha пишет Тогда пропадает подсветка и возрастает нагрузка на глаза, надо выглядывать IF ... ELSEIF ... ... ENDIF и т.д. Akelpad, Notepad3 не тормозят с подсветкой, может, при большом тексте, hbedit подтормаживает чуть - это мелочь. IF .. IN ... можно расширить для массива и Hash #xtranslate <var> INA <val> [ TO <var2> ] => iif( ISHASH( <val> ), hb_HPos( <val>, <var> ), ASCAN( <val>, <var> ) ) # 0 ;; [ <var2> := ] iif( ISHASH( <val> ), hb_HPos( <val>, <var> ), ASCAN( <val>, <var> ) )
|
|
|
|
| |
Пост N: 254
Зарегистрирован: 05.10.06
|
|
Отправлено: 10.02.20 11:06. Заголовок: Pasha пишет: #trans..
Pasha пишет: цитата: | #translate <var> IN <values,...> [ TO <var2> ] => ASCAN({<values>}, <var> ) # 0 ;; [ <var2> := ] ASCAN({<values>}, <var> ) |
| вступает в конфликт с for each, нужно добавить If #translate if <var> IN <values,...> => if ASCAN({<values>}, <var> ) # 0
|
|
|
|