Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

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

Ответов - 283, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Andrey: Пропустил и не читал. Haz пишет: Серега , тебя забыли что ты тут вообще делаешь ? Я добавлял его копирайт, только он почему то старый пример выложил. Исправьте теперь сами, у меня уже пример устаревший. Haz пишет: Трогает трогает Половина кода в примерах твоя Да, без помощи Сергея я бы вообще в МиниГуи не продвинулся ! Большое спасибо тебе !

ММК: SergKis пишет: но у нас не FW. Если бы FW был unicode ... При желании можно попробовать вот так - FW_SetUnicode(.T.)

Haz: Andrey пишет: Я добавлял его копирайт, только он почему то старый пример выложил. Андрей, мне и похоже Сергею тоже просто фиолетово на все эти копирайты. Это скорее информирование разбирающегося с примером , кому задавать вопросу напрямую ( об ошибках доработках и пр.) Григорий при размещении примеров обычно указывает авторов и этого более чем достаточно. Использование @ означает "охраняемое авторское право" , этот знак был принят на Женевской конвенции ( и без всяких CopyRight by).


Andrey: Да мне тоже особо без разницы этот копирайт. Мне главное чтобы пример работал. И ориентироваться на него, как правильно писать код. Так какой последний вариант получился ? Где его скачать можно ?

Haz: Andrey пишет: Так какой последний вариант получился ? Где его скачать можно ? В последнем посте Сергея по теме , вроде Григорий его включил в сборку. ЗЫ и попробуй мой вариант RefreshRecord() с 1 секундой при нескольких запущенных копиях. потом оригинальный с 30 секундами. суть в том что удаляя записи в одном окне , рушится навигация в других. PS Dima Можешь это и другой флуд в "для флейма " перекинуть

Dima: Haz пишет: Можешь это и другой флуд в "для флейма " перекинуть Облом ковырять 10 страниц Пусть тут живет.

SergKis: ММК пишет При желании можно попробовать вот так - FW_SetUnicode(.T.) Все хорошо в свое время. Это надо было в 2005-6 годах, тогда товарищ перевел V0 на уникод. В 2009 вышел hb 2.0 с unicod, тогда и двинулись, сначала vwt, потом hwgui, завершилось hmg.

SergKis: Игорь, вспомнил про твой пример Tsb_filter, может по аналогии c :AppendRow, :DeleteRow сделать :FilterRow [pre2] METHOD FilterRow( cFilter, bFor, lFocus ) CLASS TSBrowse LOCAL nLen := 0, cAlias := ::cAlias IF ! Empty(cFilter) ( cAlias )->( DbSetFilter( &("{||" + cFilter + "}"), cFilter ) ) ELSE ( cAlias )->( DbClearFilter() ) END ( cAlias )->( DbEval({ || nLen++ }, bFor ) ) ( cAlias )->( DbGotop() ) ::bLogicLen := {|| nLen } ::Reset() If ! empty(lFocus) ::SetFocus() EndIf RETURN Nil В твоем примере поправить STATIC FUNCTION ScanSoft(cDbf) ... FOR EACH oItem IN oWmi:ExecQuery( "SELECT * FROM Win32_Product" ) ... If HB_ISCHAR(cSW_Version) (cAlias)->F3 := cSW_Version EndIf NEXT ... и заменить STATIC FUNCTION RefreshBrowse() LOCAL cSeek := Alltrim( Form_0.Text_1.Value ) LOCAL cExp := "'" + UPPER(cSeek) + "' $ UPPER(B1->F2)" LOCAL nLen := 0, bFor := { || !Deleted() } IF !Empty(cSeek) oBrw_1:FilterRow(cExp, bFor) ELSE oBrw_1:FilterRow( Nil, bFor) END RETURN Nil [/pre2]

SergKis: PS nLen := 0 убрать

Haz: SergKis пишет: FilterRow не помешает скорее не FilterRow a SetFilter тк относится не к одной строке. Но вроде такое есть, надо вспомнить почему я это не использую)) . В твоём коде не нравится наличие dbeval, в сети и при работе с ads по интернету будет жутко Тормозить при больших фильтра ( но это частности) А вот CloneRow напрямую востребован. Также просят CopyRowи и PasteRow но уже через клипборд. Из идей ещё - так это отключаемый кеш бровса, у себя сделал для справочных полей с автообновлением. Пока с закосом под ads и sql. Скорость в сети выроса в несколько раз. Но сама реализация сырая, не все ясно с логикой кеша. По дизайну есть идея - текст внутри ячейки с выделением участков заданным цветом. Уже рыл исходники но мыслей пока ноль.

SergKis: Haz пишет Но вроде такое есть, надо вспомнить почему я это не использую)) вариант фильтра по видимым, строковым полям тсб, может пойдет [pre2] METHOD FilterFTS( cFind, lUpper, lFocus ) CLASS TSBrowse LOCAL nLen := 0, cAlias := ::cAlias, ob := Self DEFAULT lUpper := .T. If lUpper .and. HB_ISCHAR( cFind ) cFind := Upper( cFind ) EndIf IF ! Empty( cFind ) ( cAlias )->( DbSetFilter( {|| ob:FilterFTS_Line( cFind, lUpper, ob) }, ; "ob:FilterFTS_Line( cFind, lUpper, ob)" ) ) ELSE ( cAlias )->( DbClearFilter() ) END ( cAlias )->( DbGotop() ) DO WHILE ( cAlias )->( !EOF() ) DO EVENTS nLen++ ( cAlias )->( DbSkip(1) ) ENDDO ( cAlias )->( DbGotop() ) DO EVENTS ::bLogicLen := {|| nLen } ::Reset() If ! empty(lFocus) ::SetFocus() EndIf RETURN Nil METHOD FilterFTS_Line( cFind, lUpper ) CLASS TSBrowse LOCAL nCol, oCol, xVal, lRet := .F. DEFAULT lUpper := .T. 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 HB_ISCHAR( xVal ) If lUpper lRet := cFind $ Upper( xVal ) Else lRet := cFind $ xVal EndIf If lRet EXIT EndIf EndIf NEXT RETURN lRet и в примере STATIC FUNCTION RefreshBrowse() LOCAL cSeek := Alltrim( Form_0.Text_1.Value ) IF ! Empty(cSeek) oBrw_1:FilterFTS(cSeek, .T.) ELSE oBrw_1:FilterFTS( Nil ) END RETURN Nil [/pre2]

SergKis: Haz пишет А вот CloneRow напрямую востребован. Также просят CopyRowи и PasteRow но уже через клипборд Тут надо указывать какие поля\колонки исп. в прцессе, т.к. ключевые и расчетные не участвуют

SergKis: PS CloneRow может захотеть иметь поля базы в большем объеме чем наличие колонок в тсб + данные проходят через :bData, т.е. исказиться относительно значения в поле. Copy\PasteRow - строка через chr(9), но опять значение из поля в строку или через :bData. Универсальной ситуевины не просматривается - все по месту Мне так видится

SergKis: Haz пишет скорее не FilterRow a SetFilter тк относится не к одной строке. Но вроде такое есть Метод :SetFilter есть, но что то там наворочено ... Не использую тоже исп. :FilterRow можно и со scope и небольшой вроде

Haz: SergKis пишет: Универсальной ситуевины не просматривается - все по месту Мне так видится Как правило Clone идёт в ту же таблицу, а коррекцию ключей можно предусмотреть в bPostClone например. Единственный затык это поля типа авто инкрементал. Фильтр FTS использую встроенный в ADS, он быстрее тк строит FTS индекс и позволяет искать по любым полям опционально, делая это на сервере

SergKis: Haz пишет Как правило Clone идёт в ту же таблицу Я исп. функции [pre2] *----------------------------------------------------------------------------* FUNC RecGet() *----------------------------------------------------------------------------* LOCAL oRec := oKeyData() AEval( Array( FCount() ), {|v,n| oRec:Set( FieldName( n ), FieldGet( n ) ) } ) RETURN oRec *----------------------------------------------------------------------------* FUNC RecPut( oRec ) *----------------------------------------------------------------------------* nCnt := 0 AEval( oRec:GetAll(.F.), {|a,n| n := FieldPos(a[1]), nCnt += n, ; iif( n > 0, FieldPut( n, a[2] ), ) } ) RETURN nCnt > 0 [/pre2] т.е. читаю в oRec := (cAlias)->( GetRec() ) заменяю значения в нужных полях на новые oRec:Set('FieldName5', 'abcde') ... (cAlias)->( dbAppend() ) (cAlias)->( RecPut(oRec) ) С :AppendRow ставим :bAddAfter := {|obr,ladd| iif( ladd, (ob:cAlias)->( PutRec(oRec) ) }

SergKis: PS AutoIncrement поле и др., просто удаляем из oRec oRec:Del('FieldName1') ...

SergKis: Haz пишет Как правило Clone идёт в ту же таблицу, а коррекцию ключей можно предусмотреть в bPostClone например. Единственный затык это поля типа авто инкрементал. На методе :AppendRow() не сложно получается в итоге [pre2] STATIC FUNCTION RecnoClone(oBrw) LOCAL oRec If empty(oBrw:bAddBefore) oBrw:bAddBefore := {|ob| oRec := (ob:cAlias)->( RecGet() ), ; oRec:Del('FieldName1'), ; oRec:Del('FieldName2'), ; oRec:Set('FieldName5', 'abcde'), ; oRec:Set('FieldName7', 12345) } oBrw:bAddAfter := {|ob,ladd| iif( ladd, (ob:cAlias)->( RecPut(oRec), ) } EndIf oBrw:AppendRow(.T.) (oBrw:cAlias)->(DbCommit()) RETURN Nil [/pre2]

Haz: SergKis пишет: На методе :AppendRow() не сложно Кстати да

Haz: SergKis пишет: oBrw:cAlias)->(DbCommit()) В сети вместо этого использую dbskip(0) Это гарантированно сбрасывает буфер записи. Commit у меня работал четез раз, может что то и поменялось но это многолетняя привычка эще с клиппера



полная версия страницы