Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне
Кратко, что нового:
- исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).
Отправлено: 02.06.17 16:25. Заголовок: Петр 1. Не очень по..
Петр 1. Не очень понимаю, как это поможет решить задачу, установки таблицы- код нажатой клавиши и исп. блока кода В VO это решалось, в основном, через ресурсный редактор, но этого хотелось бы избежать. В Events нет WM_KEYDOWN (только WM_HOTKEY). Если на окне есть Tsb (несколько), и по hWnd получается объект тсб, то обработчик oBrw:HandleEvent, т.е. работают уст. клавиши на тсб, что нормально. Что мешает, вкл. обработчик на WN_KEYDOWN (тсб проскочил), схематично
IF IsInitMenuPopup .AND. wParam == VK_ESCAPE _CloseMenu() ELSE i := ascan( _HMG_aControlHandles, hWnd ) If i > 0 oWnd := _GetWindowObj( _HMG_aControlParentHandle[ i ] ) If HB_ISOBJECT(oWnd) /* в объект окна добавляем объект oKeyDown (похожий на TKeyData, для VK_клавиш) и выполняем блок кода (если установлен) с передачей Indexа контрола, который в фокусе, для вып. _DoControlEventprocedure(bBlock, i ), для обрамления переменными _HMG_This... Ведь в фокусе могут быть кнопка, GetBox, ..., т.е. ставим таблицу oWnd:KeyDown(VK_..., {|o...| ... }) Так же можем сделать и для WM_KEYUP, oKeyUp ... Что бы разъединить схемы работы wm_HotKey (сейчас в работе) и wm_KeyDown, в класс окна поставим :lHotKey := .T. - как сейчас. Что успел посмотреть, вроде склеивается (надо подправить возврат после UserKey, что то перепутал\недосмотрел), добавить в пример кнопки Button[ex], GetBox, др. окно и пробовать (это планы, вопрос только время найти. Машина сломалась, время нашлось. что то сделал, пока в ремонте). А Post\SendMsg по нажатиям\отпусканиям можем посылать др. окнам, с того, что в фокусе и получить с др. окна на текущее. */ RETURN 0 EndIf EndIf ENDIF exit
2. Уже писал, с С\WinApi не очень дружу, потому кто бы сделал (но не я)
Петр
постоянный участник
Пост N: 1500
Зарегистрирован: 09.10.06
Отправлено: 02.06.17 18:43. Заголовок: SergKis пишет: Не ..
SergKis пишет:
цитата:
Не очень понимаю, как это поможет решить задачу, установки таблицы- код нажатой клавиши и исп. блока кода
А в чем проблема? Я же написал - пример ограниченной поддержки, с минимальным изменением кода библиотеки. Полную интеграцию можно провести по разному - стандартный поиск в массивах никто не отменял.
SergKis пишет:
цитата:
В VO это решалось, в основном, через ресурсный редактор, но этого хотелось бы избежать.
Опять же пример с упором на работу с ресурсами. Таблицу акселераторов также можно и создавать и менять на лету. Но это тема другого примера.
SergKis пишет:
цитата:
Так же можем сделать и для WM_KEYUP
Да мы и теперь любое сообщение (причем без всяких дополнительных обьектов) можем обрабатывать (set events) - ничего не мешает.
SergKis
постоянный участник
Пост N: 1490
Зарегистрирован: 17.02.12
Отправлено: 02.06.17 20:00. Заголовок: Петр пишет можем об..
Петр пишет
цитата:
можем обрабатывать (set events) - ничего не мешает.
В версии 2.07 этого нет, да я писал, что такое решение на постоянной основе мне не по душе (как отладка какого то решения - можно использовать). Лучше привести код Evens к нужному решению, чем плодить set eventsы. В целом проблема решена (на нашей версии) работать без HotKey, но если переходить на тек. версию, все проблемы SET KEY ... ACTION ... опять вылезут. Потому я и поднимаю волну, но пока перехода не предвидится это не горит, а других все устраивает. Петр СПАСИБО за участие
gfilatov2002
moderator
Пост N: 1114
Зарегистрирован: 11.02.10
Отправлено: 02.06.17 20:52. Заголовок: Петр пишет: пример ..
Петр пишет:
цитата:
пример с упором на работу с ресурсами
Добавил такое описание в текущий файл changelog:
* New: Added possibility to load a Menu from a resource with the accelerators. It was a postponed user's request. Contributed by Petr Chornyj <myorg63@mail.ru> (see demo in folder \samples\Basic\MenuRES)
Благодарю за помощь
Петр
постоянный участник
Пост N: 1501
Зарегистрирован: 09.10.06
Отправлено: 02.06.17 21:17. Заголовок: MenuRES, я так понял..
MenuRES, я так понял, по аналогии с MenuDBF.
gfilatov2002 пишет:
цитата:
Благодарю за помощь
Да не за что, будет что-то интересное поделюсь еще
В часности, SergKis подбросил интересную идею, попробую реализовать что-то подобное
Отправлено: 03.06.17 05:06. Заголовок: Петр пишет попробую..
Петр пишет
цитата:
попробую реализовать что-то подобное ON APPEVENT [NAME] <evName> [ID <id>] | [AUTO] EVAL <{block}> [ONCE] EMIT <evName>
Как это поможет реализовать такую схему (из HwGui)
CLASS HCustomWindow содержит переменную для наращивания обработчика для своих нужд DATA bOther ... METHOD onEvent( msg, wParam, lParam ) CLASS HCustomWindow LOCAL i
RETURN - 1 от этого класса наследованы окна, контролы и следовательно задав :bOther, получаем работу своего обработчика как на окна, так и на контролах. В МиниГуи есть некоторве обработчики на контролы, что позволило расширить поведение их Function OLABELEVENTS( hWnd, nMsg, wParam, lParam ) ... ElseIf nMsg == WM_HMG_NOTIFY_LBL // BAA IF ValType( _HMG_aControlMiscData1 [ i ] [4] )=='B' _DoControlEventProcedure( _HMG_aControlMiscData1[ i ][4], i ) ELSE // быстрый refresh MoveWindow( _HMG_aControlHandles[ i ], ; // hWnd _HMG_aControlCol[ i ], ; // X _HMG_aControlRow[ i ], ; // Y _HMG_aControlWidth[ i ], ; // W _HMG_aControlHeight[ i ], .T. ) // H
SetWindowText( _HMG_aControlHandles[ i ], ; // hWnd _HMG_aControlCaption[ i ] ) // Text ENDIF EndIf
Отправлено: 03.06.17 07:16. Заголовок: Петр Чем Ваше решен..
Петр Чем Ваше решение будет лучше, к примеру, такого (схема) в класс вводим переменную :oEvens := TKeyData():New() :UserKeys(WM_..., {|o| ... }) :UserKeys(WM_KEYDOWN, {|o| o:OnKeyDownUp(...) }) :UserKeys(WM_KEYUP, {|o| o:OnKeyDownUp(...) }) ... :oKeyDownUp := TKeyDownUp():New() METHOD OnKeyDownUp(...) METHOD OnEvens( nMsg, wParam, Param ) функция Events по hWnd получает объект и выполняет :OnEvens такой же класс можно сделать для контролов и в _Define... таким образом получим обработчики на контролы, т.е. функция Events по hWnd получает объект и выполняет :OnEvens на контрол
SergKis
постоянный участник
Пост N: 1493
Зарегистрирован: 17.02.12
Отправлено: 03.06.17 07:19. Заголовок: PS. читать так тако..
PS. читать так такой же класс можно сделать для контролов и в _Define... кониролов заполнить ...
Петр
постоянный участник
Пост N: 1502
Зарегистрирован: 09.10.06
Отправлено: 03.06.17 11:22. Заголовок: SergKis пишет: В ве..
SergKis пишет:
цитата:
В версии 2.07 этого нет, да я писал, что такое решение на постоянной основе мне не по душе (как отладка какого то решения - можно использовать). Лучше привести код Evens к нужному решению, чем плодить set eventsы.
Я уже, вроде, обьяснял
2012/02/14: HMG Extended Edition 2.0.7 Published. 2007/02/15: Build 31 (HMG 1.3 Extended) Published. * New: SET EVENTS FUNCTION TO <funcname> command.
Это конечно, если ваша версия 2.07 и HMG Extended Edition 2.0.7 одно и тоже
В большинстве случаев функция - обработчик событий, устанавливаемая посредством set events func, является дополнением к Events и может использоваться в таких случаях 1) При обработке сообщений, которые неизвестны Events; 2) Для увеличения скорости реакции приложения на сообщение; 3) Для отладки; 4) Специальные случае (вроде отключение (изменение) реакции на действия пользователя в демо - версии)
Если вы посмотрите, те примеры с использованием set events func to, которые приводил я, то в большинстве случаев после каких то манипуляций вызывается стандартный обработчик Events. И использование set events func to не отменяет работу над улучшением качества Events.
Петр
постоянный участник
Пост N: 1503
Зарегистрирован: 09.10.06
Отправлено: 03.06.17 11:35. Заголовок: SergKis пишет: Как ..
SergKis пишет:
цитата:
Как это поможет реализовать такую схему (из HwGui)
SergKis пишет:
цитата:
Чем Ваше решение будет лучше, к примеру, такого (схема)
Это вообще, что называется "из другой оперы". Реализую и выложу здесь, тогда и вопросы можно будет по существу задавать.
P.S. Присмотритесь к TTaskDialog - уверен, что найдете для себя много интересного.
SergKis
постоянный участник
Пост N: 1504
Зарегистрирован: 17.02.12
Отправлено: 07.06.17 17:24. Заголовок: gfilatov2002 К :Use..
Изменения: ========== Функцию _GetWindowObj( FormName ) переименовал в _WindowObj ( FormName ) т.к. уже есть _WindowCargo( FormName ), _GetWindowObj вынес на #translate. Причина - в тек. версии есть функция _GetControlObject(...), чтобы не путаться.
If Pcount() > 1; _HMG_aFormMiscData2 [ i ] := xValue Else ; RETURN _HMG_aFormMiscData2 [ i ] Endif
RETURN NIL
*-----------------------------------------------------------------------------* FUNCTION _WindowEvent( FormName, nKey, bEvent, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISOBJECT ( FormName ), FormName:Index, ; iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) LOCAL o
IF i > 0 o := _HMG_aFormMiscData1 [ i ][ 1 ] IF HB_ISOBJECT( o ) If HB_ISBLOCK(bEvent); RETURN o:Event( nKey, bEvent ) EndIf RETURN o:Event( nKey, bEvent, p2, p3 ) ENDIF ENDIF
If Pcount() > 2; _HMG_aControlMiscData2 [ i ] := xValue Else ; RETURN _HMG_aControlMiscData2 [ i ] EndIf
RETURN NIL
*-----------------------------------------------------------------------------* FUNCTION _ControlEvent( ControlName, FormName, nKey, bEvent, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISNUMERIC( FormName ), FormName, ; iif( HB_ISOBJECT ( ControlName ), ControlName:Index, ; iif( HB_ISNUMERIC( ControlName ), ; AScan( _HMG_aControlHandles, ControlName ), ; GetControlIndex( ControlName , FormName ) ) ) ) LOCAL o
IF i > 0 .and. Len( _HMG_aControlMiscData0 [ i ] ) > 0 o := _HMG_aControlMiscData0 [ i ][ 1 ] If HB_ISOBJECT ( o ) If HB_ISBLOCK(bEvent); RETURN o:Event( nKey, bEvent ) EndIf RETURN o:Event( nKey, bEvent, p2, p3 ) EndIf ENDIF
RETURN NIL
Классы и вспом. функции такие: /////////////////////////////////////////////////////////////////////////////// Зарезервированы для работы два сообщения:
*-----------------------------------------------------------------------------* FUNCTION oKeyData( o ) *-----------------------------------------------------------------------------* RETURN TKeyData():New(o)
////////////////////////////////////////////////////////////////////////////////////////////// CLASS TKeyData
PROTECTED: VAR oObj VAR aKey INIT hb_Hash() VAR bBlk
EXPORTED: VAR Cargo
METHOD New( o ) INLINE ( ::Obj := o, Self ) CONSTRUCTOR
Подправил для совместимости и быстрого доступа через индекс контрола:
h_controlmisc.prg *-----------------------------------------------------------------------------* STATIC FUNCTION _GetCaption ( ControlName , ParentForm, nIndex ) *-----------------------------------------------------------------------------* LOCAL cRetVal LOCAL i := iif( Pcount() > 2, nIndex, GetControlIndex ( ControlName , ParentForm ) )
IF _HMG_aControlType [ i ] == 'TOOLBUTTON' cRetVal := _HMG_aControlCaption [ i ] ELSE cRetVal := GetWindowText ( _HMG_aControlHandles [ i ] ) ENDIF
RETURN cRetVal
h_windows.prg
Function _DoControlEventProcedure ( bBlock , i , cEventType , nParam ) ... if valtype( bBlock ) == 'B' .and. i > 0 ... Function _DoWindowEventProcedure ( bBlock , i , cEventType, nParam ) ... if valtype( bBlock ) == 'B' .and. i > 0 ...
Посмотрел, что править связанное с _HMG_aControlMiscData1, для расширения возможностей, трудоемко (много где) и стремно, то ввел новую переменную _HMG_aControlMiscData0
ставил значение на _HMG_aControlMiscData0 [k] там, где есть смысл от значений параметров, иначе ставил _HMG_aControlMiscData0 [k] := {}
Можно заполнить значением переменную у распространенных контролов, а в остальные пустышку и постепенно заполнять по возможности и нал. времени. Функции учитывают наличие пустышки в контролах.
В окнах поменял прямое создание объекта, на созд. через функцию, т.е. там где было TWndData():New(...) надо заменить с aAdd( _HMG_aFormMiscData1 [k], TWndData():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) на aAdd( _HMG_aFormMiscData1 [k], oWndData( k , ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; mVar ) )
В TWndData и TsBrowse добавил (у себя) методы, аналоги :UserKeys(...) с кортким названием :UsK(...), это на любителя.
Пример для тестирования будет приложен.
SergKis
постоянный участник
Пост N: 1505
Зарегистрирован: 17.02.12
Отправлено: 07.06.17 17:41. Заголовок: PS Надо подправить ..
PS Надо подправить i_var.ch ... #xtranslate _HMG_aScrollStep => _HMG_SYSDATA\[445\] #xtranslate _HMG_aFormMiscData1 => _HMG_SYSDATA\[446\] #xtranslate _HMG_aFormMiscData2 => _HMG_SYSDATA\[447\] #xtranslate _HMG_aControlMiscData0 => _HMG_SYSDATA\[448\] было (размножено и не исправлено) #xtranslate _HMG_aFormMiscData0 => _HMG_SYSDATA\[448\]
Softlog86
Пост N: 358
Зарегистрирован: 03.12.08
Отправлено: 09.06.17 12:29. Заголовок: Добрый день , форумч..
Добрый день , форумчане !
Что сделать чтоб можно было менять ширину контрола RADIOGROUP ?
Отбой тревоги .... WIDTH - это ширина одного элемента выбора , а не всего контрола .... Уже и забыл ху-из-ху :)
(*) Первый ( ) Второй ( ) Третий
После команды изменения ширины MyWindow.MyRADIO.WIDTH:=600 . ( Новое значение ширины гораздо больше исходного , всё должно влазить )
Отображается только первый элемент группы : (*) Первый
gfilatov2002 Довел до рабочей кондиции пример и тексты hmg по Post\SendMessage. Пример: http://my-files.ru/gbuo3t Комплект базовых функций, классы: Скрытый текст
If Pcount() > 1; _HMG_aFormMiscData2 [ i ] := xValue Else ; RETURN _HMG_aFormMiscData2 [ i ] Endif
RETURN NIL
*-----------------------------------------------------------------------------* FUNCTION _WindowEvent( FormName, nKey, bEvent, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL i := iif( HB_ISOBJECT ( FormName ), FormName:Index, ; iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) ) LOCAL o
IF i > 0 o := _HMG_aFormMiscData1 [ i ][ 1 ] IF HB_ISOBJECT( o ) If HB_ISBLOCK(bEvent); RETURN o:Event( nKey, bEvent ) EndIf RETURN o:Event( nKey, bEvent, p2, p3 ) ENDIF ENDIF
RETURN NIL
*-----------------------------------------------------------------------------* FUNCTION _WindowObj( FormName, nIndex ) *-----------------------------------------------------------------------------* LOCAL i := iif( Pcount() > 1, nIndex, iif( HB_ISNUMERIC( FormName ), ; AScan( _HMG_aFormHandles, FormName ), GetFormIndex( FormName ) ) )
IF i > 0 .and. HB_ISOBJECT( _HMG_aFormMiscData1 [ i ][ 1 ] ) RETURN _HMG_aFormMiscData1 [ i ][ 1 ] ENDIF
*-----------------------------------------------------------------------------* FUNCTION oWndData( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) *-----------------------------------------------------------------------------* LOCAL o
/////////////////////////////////////////////////////////////////////////////// CLASS TWndData PROTECTED: VAR cVar VAR cName VAR cType VAR nIndex VAR nHandle VAR nParent
METHOD GetListType() CLASS TWndData LOCAL oType := oKeyData() LOCAL aType := {}
::oName:Eval({|k,o,i| k := i, oType:Set(o:Type, o:Type) }) oType:Eval({|k,v,i| k := i, aAdd(aType, v) }) oType := Nil
RETURN aType
METHOD GetObj4Type( cType, lEque ) CLASS TWndData LOCAL aObj := {}, a, i, o
If ! empty(cType) lEque := hb_defaultValue(lEque, .T.) If ::Chr $ cType; lEque := .F. EndIf a := hb_ATokens(upper(cType), ::Chr) FOR EACH cType IN a For i := 1 To ::oName:Len o := ::oName:Value( i ) If lEque If cType == o:cType; aAdd( aObj, o ) EndIf ElseIf cType $ o:cType; aAdd( aObj, o ) EndIf Next NEXT EndIF
RETURN aObj
METHOD GetObj4Name( cName ) CLASS TWndData LOCAL aObj := {}, a, i, o
If ! empty(cName) a := hb_ATokens(cName, ::Chr) FOR EACH cName IN a For i := 1 To ::oName:Len o := ::oName:Value( i ) If cName $ o:cName; aAdd( aObj, o ) EndIf Next NEXT EndIF
RETURN aObj
METHOD DoEvent ( Key, nHandle, nParam, cEvent ) CLASS TWndData LOCAL o, lW := .T.
*-----------------------------------------------------------------------------* FUNCTION oKeyData( o ) *-----------------------------------------------------------------------------* RETURN TKeyData():New(o)
////////////////////////////////////////////////////////////////////////////////////////////// CLASS TKeyData PROTECTED: VAR oObj VAR aKey INIT hb_Hash() VAR bBlk
METHOD Eval( Block ) CLASS TKeyData LOCAL i, b := HB_ISBLOCK(Block) LOCAL a := iif( b, Nil, array(0) )
For i := 1 To ::Len If b; Eval( Block, hb_HKeyAt( ::aKey, i ), hb_HValueAt( ::aKey, i ), i ) Else; aAdd( a, { hb_HKeyAt( ::aKey, i ), hb_HValueAt( ::aKey, i ), i } ) EndIf Next
ставил значение на _HMG_aControlMiscData0 [k] там, где есть смысл от значений параметров, иначе ставил _HMG_aControlMiscData0 [k] := {}
Можно заполнить значением переменную у распространенных контролов, а в остальные пустышку и постепенно заполнять по возможности и нал. времени. Функции учитывают наличие пустышки в контролах.
В окнах поменял прямое создание объекта, на созд. через функцию, т.е. там где было TWndData():New(...) надо заменить с aAdd( _HMG_aFormMiscData1 [k], TWndData():New( k, ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; &mVar. ) ) на aAdd( _HMG_aFormMiscData1 [k], oWndData( k , ; _HMG_aFormNames [k], ; _HMG_aFormHandles [k], ; _HMG_aFormParentHandle [k], ; _HMG_aFormType [k], ; mVar ) )
В TWndData и TsBrowse добавил (у себя) методы, аналоги :UserKeys(...) с кортким названием :UsK(...), это на любителя.
Замечания, дополнения принимаются.
SergKis
постоянный участник
Пост N: 1507
Зарегистрирован: 17.02.12
Отправлено: 10.06.17 08:56. Заголовок: PS Еще *-----------..
ElseIf Pcount() == 4 // CONTROL WITH ARGUMENT OR TOOLBAR BUTTON OR (JK) HMG 1.0 Experimental Buid 6 GRID/BROWSE COLUMN - ColumnWidth ... Неточность в *-----------------------------------------------------------------------------* FUNCTION _EraseControl ( i, p ) *-----------------------------------------------------------------------------* LOCAL mVar, t, hWnd, x
If HB_ISOBJECT( _HMG_aControlMiscData0 [ i ][1] ) _HMG_aControlMiscData0 [ i ][1]:Del() EndIf ... пропустил [1]
SergKis
постоянный участник
Пост N: 1508
Зарегистрирован: 17.02.12
Отправлено: 10.06.17 09:35. Заголовок: PS У себя сделал *-..
PS У себя сделал
*-----------------------------------------------------------------------------* FUNCTION GetControlIndex ( ControlName, ParentForm ) *-----------------------------------------------------------------------------* LOCAL mVar
METHOD New( o ) INLINE ( ::Obj := o, Self ) CONSTRUCTOR
"and please remember that :NEW() will be class method so it should not be redefined as constructor in user class. Instead :INIT() method should be used as constructor. It's executed automatically when object is created from the :NEW() method."
цитата из xhb-diff
SergKis
постоянный участник
Пост N: 1509
Зарегистрирован: 17.02.12
Отправлено: 10.06.17 19:34. Заголовок: Петр Согласен. :sm..
Петр Согласен. METHOD New( o ) INLINE ( ::oObj := iif( HB_ISOBJECT(o), o, Self ), Self ) CONSTRUCTOR
SergKis
постоянный участник
Пост N: 1511
Зарегистрирован: 17.02.12
Отправлено: 10.06.17 21:55. Заголовок: SergKis пишет Неточ..
SergKis пишет
цитата:
Неточность в *-----------------------------------------------------------------------------* FUNCTION _EraseControl ( i, p ) *-----------------------------------------------------------------------------* LOCAL mVar, t, hWnd, x
If HB_ISOBJECT( _HMG_aControlMiscData0 [ i ][1] ) _HMG_aControlMiscData0 [ i ][1]:Del() EndIf
Надо усилить проверку
*-----------------------------------------------------------------------------* Function _EraseControl (i, p) *-----------------------------------------------------------------------------* Local mVar, t, hWnd, x
If Len( _HMG_aControlMiscData0 [ i ] ) > 0 If HB_ISOBJECT( _HMG_aControlMiscData0 [ i ][1] ) _HMG_aControlMiscData0 [ i ][1]:Del() EndIf EndIf
Т.е. _HMG_aControlMiscData0 [ i ] := {} - пустышка
gfilatov2002 Повторю предложение, иметь в GetControIndex( ControlName, ParentForm ) If empty(ControlName); ControlName := _HMG_ThisControlName EndIf If empty(ParentForm); ParantForm := _HMG_ThisFormName EndIf Тогда в control ACTION можно сравнивать одинаковые контролы на разных окнах так (быстрый способ): v1 := _GetValue( , , GetControlIndex()) v2 := _GetValue( , , GetControlIndex( , 'win_2')) If v1 > v1 ... ElseIf v1 < v2 ... Else ... EndIf GetControlIndex(...) Скрытый текст
*-----------------------------------------------------------------------------* FUNCTION GetControlIndex ( ControlName, ParentForm ) *-----------------------------------------------------------------------------* LOCAL mVar
Все даты в формате GMT
3 час. Хитов сегодня: 222
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет