| Автор | Сообщение |
|
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно  ).
|
 |

|
|
Ответов - 126
, стр:
1
2
3
4
5
6
7
All
[только новые]
|
|
|
|
| постоянный участник
|
Пост N: 4824
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.25 12:44. Заголовок: gfilatov2002 пишет п..
gfilatov2002 пишет | цитата: | | почему в функции _DoControlEventProcedure() использовано |
| Дело в том, что не все контролы имеют объект (например, CheckLabel не имеет, перекрылись по месту хранения handle), а усложнять код с объектами не оч. хотелось. Получить объект можно внутри блока кода, через объект окна, т.е. oc := ow:GetObj(cControlName), поэтому i := _ControlObj( _HMG_ThisControlName, _HMG_ThisFormName ) не использовал
|
 |

|
|
|
| moderator
|
Пост N: 2507
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.10.25 12:59. Заголовок: SergKis пишет: не в..
SergKis пишет: | цитата: | | не все контролы имеют объект |
| Понял, принято. Благодарю за пояснение. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4825
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.10.25 21:54. Заголовок: gfilatov2002 пишет п..
gfilatov2002 пишет С этой правкой получился простой анализ работы с фокусами контролов в блоке, т.е. проверяем на NIL ON GOTFOCUS {|p1,p2,cnm,ind| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... } ; ON LOSTFOCUS {|p1,p2,cnm,ind| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... } так же поступаем с фокусами окон ON GOTFOCUS {|cnm,ind,p1| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... } ; ON LOSTFOCUS {|cnm,ind,p1| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... }
|
 |

|
|
|
| постоянный участник
|
Пост N: 8052
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.10.25 15:09. Заголовок: Григорий, как из сво..
Григорий, как из своей программы изменить цвета Program error ? Я задаю свои функции Alert*() на базе твоих... 
|
 |

|
|
|
| moderator
|
Пост N: 2508
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.10.25 19:50. Заголовок: Andrey пишет: как и..
Andrey пишет: | цитата: | | как из своей программы изменить цвета Program error |
| Сейчас эти цвета задаются в ядре без возможности их изменения извне. Но, конечно, возможно добавить логику для их задания пользователем. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8053
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.10.25 22:14. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Но, конечно, возможно добавить логику для их задания пользователем. |
| Сделайте пожалуйста ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4828
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.10.25 23:46. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил ftp предложение по :FilterFTS(...) для массива
|
 |

|
|
|
| moderator
|
Пост N: 2509
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.10.25 10:11. Заголовок: SergKis пишет: пред..
SergKis пишет: | цитата: | | предложение по :FilterFTS(...) для массива |
| OK Благодарю за помощь 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4829
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.25 20:49. Заголовок: gfilatov2002 положи..
gfilatov2002 положил yf ftp предложение и пример по :FilterFTS(...)
|
 |

|
|
|
| постоянный участник
|
Пост N: 4830
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.25 21:10. Заголовок: gfilatov2002 Возьми..
gfilatov2002 Возьмите пример еще раз, забыл проверить его на фонты 12, 14, 16 размера
|
 |

|
|
|
| постоянный участник
|
Пост N: 4831
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.25 21:26. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение добавить в :FilterFTS() улучшить обработку логических полей METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse ... IF lAll .AND. ! HB_ISCHAR( xVal ) IF HB_ISLOGICAL( xVal ) xVal := iif( xVal, ".T.", ".F." ) ELSE xVal := cValToChar( xVal ) ENDIF ENDIF ... и соответственно в :CalcTotal() сделать так же IF lAll .AND. ! HB_ISCHAR( xVal ) IF HB_ISLOGICAL( xVal ) xVal := iif( xVal, ".T.", ".F." ) ELSE xVal := cValToChar( xVal ) ENDIF ENDIF тогда в примерах ловятся значения поля MARRIED на .t.\.f.
|
 |

|
|
|
|
|
| moderator
|
Пост N: 2510
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.10.25 21:36. Заголовок: SergKis пишет: Calc..
SergKis пишет: Увы, использование этого метода перемещает указатель на второй элемент массива при нажатии мышкой на пустой Getbox. Если, убрать вызов :CalcTotal(), то указатель остается на первом элементе массива после отработки метода FilterFTS() . Можно это поправить 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4832
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.25 22:15. Заголовок: gfilatov2002 пишет М..
gfilatov2002 пишет Заменить ::DrawFooters() на ::Refresh() METHOD CalcTotal(cTotal, cNoTotal, lDraw) CLASS TSBrowse ... NEXT //::DrawFooters() ::Refresh(.F.) DO EVENTS PS. Положил на ftp доработанные примеры
|
 |

|
|
|
| moderator
|
Пост N: 2511
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.25 09:23. Заголовок: SergKis пишет: Поло..
SergKis пишет: | цитата: | | Положил на ftp доработанные примеры |
| Большое спасибо за оперативность! Примеры работают нормально. 
|
 |

|
|
|
| moderator
|
Пост N: 2512
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.25 10:43. Заголовок: Всем, кому это интересно...
Выложил новую сборку 25.10 Стандартная версия click here ПРО-версия (архив под паролем) click here В эту сборку были добавлены все последние предложения Сергея вместе с поясняющими примерами. Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 206
Зарегистрирован: 15.09.05
|
|
Отправлено: 10.10.25 11:07. Заголовок: Вопрос по ООП
Как использовать свою версию метода FilterFTS_Line не трогая библиотеку? Я не силен в ООП. Хочу сделать поиск по несколькими словами. У себя я не запускаю фильтр при каждом нажатии клавиши, а при наличии SPACE в конце строки или при нажатии ENTER. Моя модификация такая: На примере Tsb_filter помоему работает многословный поиск со знаком .and. между словами. // ============================================================================ // METHOD TSBrowse:FilterFTS_Line() by SergKis // ============================================================================ METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse LOCAL nCol, oCol, xVal, lRet := .F., n, aFind, lFind DEFAULT lUpper := .T., lAll := .F. FOR nCol := 1 TO Len( ::aColumns ) oCol := ::aColumns[ nCol ] IF nCol == 1 .AND. ::lSelector ; LOOP ELSEIF ! oCol:lVisible ; LOOP ELSEIF oCol:lBitMap ; LOOP ENDIF xVal := ::bDataEval( oCol, , nCol ) IF lAll .AND. ! HB_ISCHAR( xVal ) xVal := cValToChar( xVal ) ENDIF IF HB_ISCHAR( xVal ) aFind := hb_ATokens(cFind) FOR n := 1 TO len(aFind) IF lUpper lFind := aFind[n] $ Upper( xVal ) ELSE lFind := aFind[n] $ xVal ENDIF lRet := lFind IF ! lFind EXIT ENDIF NEXT IF lRet EXIT ENDIF ENDIF NEXT RETURN lRet
|
 |

|
|
|
| постоянный участник
|
Пост N: 4833
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.10.25 13:15. Заголовок: sashaBG пишет работа..
sashaBG пишет | цитата: | | работает многословный поиск со знаком .and. между словами |
| Работает такой вариант, но он учтет и не нужный вариант, например cFind := "Краска белая" "Краска матовая белая" "Краска белая" "Краска ... белая" "Белая ... краска " т.е. выбор не совсем тот, что просили, нужно указание разделителя в первых байтах, например, в своих поисках использовал алгоритм, если в 1-ом байте " ", то поиск на вхождение, если нет, то на точное равенство слева заданного. В данном случае можно поступить так же, если 1-ый байт " ", то ваш алгоритм aFind := hb_ATokens( Upper( alltrim(cFind) ) ), иначе, как сейчас
|
 |

|
|
|
| постоянный участник
|
Пост N: 4834
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.10.25 18:17. Заголовок: gfilatov2002 Попроб..
gfilatov2002 Попробовал добавить вариант от sashaBG в :FilterFTS с вкл. его алгоритма от наличия первого пробела в cFind, работает. Сделал Скрытый текст
METHOD FilterFTS( cFind, lUpper, lBottom, lFocus, lAll ) CLASS TSBrowse LOCAL nLen := 0, cAlias := ::cAlias, ob := Self LOCAL aArray, aLine, nLine, nCol, oCol, xVal, lRet LOCAL nAtPos, nLastPos, aFind, nFind := 0 DEFAULT lUpper := .T., lAll := .F. IF !HB_ISCHAR( cFind ) .or. Len( cFind ) == 0 RETURN nFind ENDIF IF lUpper cFind := Upper( cFind ) ENDIF IF Left( cFind, 1 ) == " " aFind := hb_ATokens( substr( cFind, 2 ) ) ELSE aFind := { cFind } ENDIF IF ::lIsDbf IF ! Empty( cFind ) ( cAlias )->( dbSetFilter( {|| ob:FilterFTS_Line( cFind, lUpper, lAll, ob ) }, ; "ob:FilterFTS_Line( cFind, lUpper, lAll, ob)" ) ) ELSE ( cAlias )->( dbClearFilter() ) ENDIF ( cAlias )->( dbGoTop() ) DO While !( cAlias )->( Eof() ) SysRefresh() nLen++ ( cAlias )->( dbSkip( 1 ) ) ENDDO nFind := nLen ::bLogicLen := {|| nLen } ::lInitGoTop := .T. ::Reset( lBottom ) ELSEIF ::lIsArr .AND. ! Empty( cFind ) IF ::aArray_FTS == NIL ::aArray_FTS := ::aArray ELSE ::aArray := ::aArray_FTS ENDIF nAtPos := ::nAt nLastPos := ::nLastPos aArray := {} FOR EACH aLine IN ::aArray nLine := hb_enumindex( aLine ) ::nAt := nLine FOR EACH oCol IN ::aColumns nCol := hb_enumindex( oCol ) IF nCol == 1 .AND. ::lSelector ; LOOP ELSEIF ! oCol:lVisible ; LOOP ELSEIF oCol:lBitMap ; LOOP ENDIF xVal := ob:bDataEval( oCol, , nCol ) IF lAll .AND. ! HB_ISCHAR( xVal ) IF HB_ISLOGICAL( xVal ) xVal := iif( xVal, ".T.", ".F." ) ELSE xVal := cValToChar( xVal ) ENDIF ENDIF IF HB_ISCHAR( xVal ) FOR EACH cFind IN aFind IF lUpper lRet := cFind $ Upper( xVal ) ELSE lRet := cFind $ xVal ENDIF IF !lRet EXIT ENDIF NEXT IF lRet AAdd( aArray, aLine ) EXIT ENDIF ENDIF NEXT ::Skip() NEXT ::nAt := nAtPos ::nLastPos := nLastPos IF ( nFind := Len( aArray ) ) > 0 ::aArray := aArray ::Reset( lBottom ) ELSEIF IsArray( ::aArray_FTS ) ::aArray := { Array( Len( ::aArray_FTS[1] ) ) } ::Reset( lBottom ) ENDIF ELSEIF ::lIsArr .AND. Empty( cFind ) IF IsArray( ::aArray_FTS ) ::aArray := ::aArray_FTS ::aArray_FTS := NIL ENDIF nFind := Len( ::aArray ) ::Reset( lBottom ) ENDIF IF ! Empty( lFocus ) ::SetFocus() ENDIF RETURN nFind METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse LOCAL nCol, oCol, xVal, lRet := .F., aFind DEFAULT lUpper := .T., lAll := .F. IF Left( cFind, 1 ) == " " aFind := hb_ATokens( substr( cFind, 2 ) ) ELSE aFind := { cFind } ENDIF FOR nCol := 1 TO Len( ::aColumns ) oCol := ::aColumns[ nCol ] IF nCol == 1 .AND. ::lSelector ; LOOP ELSEIF ! oCol:lVisible ; LOOP ELSEIF oCol:lBitMap ; LOOP ENDIF xVal := ::bDataEval( oCol, , nCol ) IF lAll .AND. ! HB_ISCHAR( xVal ) IF HB_ISLOGICAL( xVal ) xVal := iif( xVal, ".T.", ".F." ) ELSE xVal := cValToChar( xVal ) ENDIF ENDIF IF HB_ISCHAR( xVal ) FOR EACH cFind IN aFind IF lUpper lRet := cFind $ Upper( xVal ) ELSE lRet := cFind $ xVal ENDIF IF !lRet EXIT ENDIF NEXT IF lRet EXIT ENDIF ENDIF NEXT RETURN lRet
| В примерах Advanced\Tsb_FilterFTS поправил demo.prg ... b2 := {|| Local cVal := Trim( This.Value ) ... demo2.prg ... oac:oBlk:b_2 := {|| Local cVal := Trim( This.Value ) ... Т.е. поиск в длинном тексте колонки с .and. работает в таком варианте
|
 |

|
|
|
| moderator
|
Пост N: 2513
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.10.25 18:54. Заголовок: SergKis пишет: от н..
SergKis пишет: | цитата: | | от наличия первого пробела в cFind, работает |
| OK У меня тоже работает. Но теперь надо объяснять пользователям насчет использования первого пробела для поиска в длинных строках. Это реально сделать 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4835
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.10.25 19:11. Заголовок: С Clipper87 такая фи..
С Summer87 такая фишка работала (как я писал выше про поиск $ или на ==) и всегда с новой версией все в один голос говорили, что бы это не менял. Так, что даже не знаю, что сказать  Но убирается режим легко (на уровне разработчика), в примере, вместо Trim(cVal), ставим AllTrim(cVal)
|
 |

|
|
Ответов - 126
, стр:
1
2
3
4
5
6
7
All
[только новые]
|
|