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

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

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

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

gfilatov2002: Andrey пишет: код перестал работать Заменил в примере строку hWnd := GetFormHandle(cForm) на hWnd := GetFormHandle(ThisWindow.Name) и стрелки заработали

Andrey: gfilatov2002 пишет: Заменил в примере строку Блин, точно забыл где правильное окно. Наверху окно MAIN а стрелки вызываются в MODAL. Спасибо !

SergKis: gfilatov2002 Поправил HbXlsXml[pre2] xmlxls_s.prg ... METHOD ExcelWriterXML_Sheet:writeNumber( row, column, xData, style ) ... IF HB_ISNUMERIC( xData ) ::writeData( "Number", row, column, hb_ntos( xData ), style ) // ::writeData( "Number", row, column, AllTrim( Str( xData, 18, 6 ) ), style ) ELSE ... [/pre2] Так же пример Tsb_Brw2xm: https://my-files.ru/ntptz7 Убрал неточности copy+paste, почистил и чуть добавил (до title, picture в numeric, ...)


gfilatov2002: SergKis пишет: Поправил Спасибо за исправления

SergKis: gfilatov2002 В методе :DeleteRow( lAll ) у себя обнаружил (может будет полезным)[pre2] METHOD DeleteRow( lAll ) CLASS TSBrowse ... If !( "SQL" $ ::cDriver ) If ! ( cAlias )->( RLock() ) MsgStop( ::aMsg[ 40 ] , ::aMsg[ 28 ] ) Return .f. EndIf EndIf If ::bDelBefore != Nil lEval := Eval( ::bDelBefore, nRecNo, Self ) If ValType( lEval ) == "L" .and. ! lEval if !("SQL" $ ::cDriver) ( cAlias )->( DbUnlock() ) EndIf Return .f. EndIf EndIf If ! ( cAlias )->( Deleted() ) ( cAlias )->( DbDelete() ) If ::bDelAfter != Nil Eval( ::bDelAfter, nRecNo, Self ) EndIf if !("SQL" $ ::cDriver) ( cAlias )->( DbUnlock() ) endif ... CLASS TSBrowse FROM TControl ... DATA bDelete // evaluated after user deletes a row with lCanDelete mode DATA bDelBefore // evaluated before user deletes. if RLock mode DATA bDelAfter // evaluated after user deletes. if RLock mode DATA bEvents // custom function for events processing ... [/pre2] действия до удаления и после при удачном блокировании записи

Haz: SergKis пишет: DATA bDelBefore // evaluated before user deletes. if RLock mode DATA bDelAfter Сергей, может и bAddBefore и After? Для заполнения ключей при добавлении в подчиненную базу. Сейчас пользуюсь самописной db_Append( cAlias ) и db_Delete( cAlias ). В них по имени алиаса' условно заполняются ключи при добавлении или при удалении записи в мастер таблице, удаляю соответствующие в подчиненных

SergKis: Haz пишет может и bAddBefore и After? Для заполнения ключей при добавлении в подчиненную базу Согласен, это лучше чем самопалис. По текстам только надо полазить

SergKis: PS есть одно но, не пользовался никогда "родным" встроенным dbAppend(). Это вроде по стрелке вниз при выходе на EOF ? Или еще что то есть ?

Haz: SergKis пишет: Или еще что то есть Вроде есть какой то блочек. Я дома без компа. Завтра с работы поищу. Я тоже не пользуюсь стрелкой вниз за eof(). Значит раз есть ::deleterow() то логично и ::appendrow()

SergKis: Haz пишет Значит раз есть ::deleterow() то логично и ::appendrow() Нет этого. Только есть[pre2] METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse ... bAddRec := If( ! Empty( ::bAddRec ), ::bAddRec, {|| ( cAlias )->( dbAppend() ), ! NetErr() } ) ... If ::lIsDbf If Eval( If( ! ::lAppendMode, bRecLock, bAddRec ), uTemp ) ::bDataEval( ::aColumns[ nCol ], uTemp, nCol ) SysRefresh() If lAppend If ! Empty( ::aDefault ) ASize( ::aDefault, Len( ::aColumns ) ) AEval( ::aDefault, { | e, n | If( e != Nil .and. n != nCol, If( Valtype( e ) == "B", ; ::bDataEval( ::aColumns[ n ], Eval( e, Self ), n ), ; ::bDataEval( ::aColumns[ n ], e, n ) ), Nil ) } ) ::DrawLine() EndIf ... [/pre2] :AppendRow() похоже строгать надо

Haz: SergKis пишет: AppendRow() похоже строгать надо Сегодня днем напишу

SergKis: Haz пишет Сегодня днем напишу Ok

Haz: SergKis пишет: :AppendRow() похоже строгать надо [pre2] DATA bAddBefore // evaluated before append DATA bAddAfter METHOD AppendRow() CLASS TSBrowse Local cAlias, bAddRec, lAdd If ::lIsDbf cAlias := ::cAlias EndIf if hb_isBlock( bAddBefore ) Eval( bAddBefore, Self ) end Do case case ::lIsDbf bAddRec := If( !Empty( ::bAddRec ), ::bAddRec, {|| ( cAlias )->( dbAppend() ), ! NetErr() } ) if Eval( bAddRec ) SysRefresh() ::nLen := ( cAlias )->( Eval( ::bLogicLen ) ) ::Upstable() ::Refresh(.T., .T.) lAdd := .T. end case ::lIsArr bAddRec := If( !Empty( ::bAddRec ), ::bAddRec, {|| aadd(::aArray, AClone( ::aDefValue ) ), .T. } ) if Eval( bAddRec ) SysRefresh() ::nLen := Len( ::aArray ) ::nAt := ::nLen ::nRowPos := ::nRowCount() ::Refresh(.T., .T.) lAdd := .T. EndIf end ::SetFocus() if lAdd if hb_isBlock( bAddAfter ) Eval( bAddAfter, Self ) end end Return nil [/pre2]-

SergKis: Haz немного поправил [pre2] METHOD AppendRow() CLASS TSBrowse LOCAL cAlias, bAddRec, xRet, lAdd := .F. If HB_ISBLOCK( ::bAddBefore ) xRet := Eval( ::bAddBefore, Self ) If HB_ISLOGICAL(xRet) .and. ! xRet RETURN lAdd EndIf EndIf Do case case ::lIsDbf cAlias := ::cAlias bAddRec := If( !Empty( ::bAddRec ), ::bAddRec, {|| ( cAlias )->( dbAppend() ), ! NetErr() } ) If Eval( bAddRec, Self ) SysRefresh() ::nLen := ( cAlias )->( Eval( ::bLogicLen ) ) ::Upstable() ::Refresh(.T., .T.) lAdd := .T. EndIf case ::lIsArr bAddRec := If( !Empty( ::bAddRec ), ::bAddRec, {|| aAdd(::aArray, AClone( ::aDefValue ) ), .T. } ) If Eval( bAddRec, Self ) SysRefresh() ::nLen := Len( ::aArray ) ::nAt := ::nLen ::nRowPos := ::nRowCount() ::Refresh(.T., .T.) lAdd := .T. EndIf end ::SetFocus() If HB_ISBLOCK( ::bAddAfter ) Eval( ::bAddAfter, Self, lAdd ) EndIf RETURN lAdd [/pre2]

Haz: SergKis пишет: немного поправил Да, так лучше

gfilatov2002: SergKis пишет: немного поправил Новый метод добавлен в класс TSBrowse. Благодарю за помощь

SergKis: Попробовал исп. :AppendRow(). Получилась странная штука. Тест. пример https://my-files.ru/sk8waj demo2.exe - соответствует demo.prg с комментариями в функ. RecnoInsert(oBrw) demo.exe - соответствует demo.prg со снятыми комментариями в функ. RecnoInsert(oBrw) Суть примера demo2.exe: из удаленных (если есть) запись восстанавливается в :bAddBefore, новая запись dbAppend() в :AppendRow() с перерисовкой. Суть примера demo.exe: из удаленных (если есть) запись восстанавливается в :bAddBefore, новая запись dbAppend() там же, :AppendRow() не используется, выход после блока :bAddBefore Делаем в примерах одно и то же, удаляем 5ую запись (-) и сразу добавляем запись (+) В demo2.exe вставка, перерисовка занимает до 10 сек. (внутр. upstable()) В demo.exe все оч. быстро Это только у меня так ? Или что то упущено ?

Haz: SergKis пишет: Тест. приме Рассмешило Author: Igor Nazarov + Verchenko Andrey <verchenkoag@gmail.com> #define COPYRIGHT "(c) Copyright by Andrey Verchenko. Dmitrov, 2018." Серега , тебя забыли что ты тут вообще делаешь ? Или всеже не Author а Publisher Если по примеру, то бровс рассинхронизирован после рекола, сейчас гляну как починитть или так в методе [pre2] If HB_ISLOGICAL(xRet) .and. ! xRet SysRefresh() ::nLen := ( cAlias )->( Eval( ::bLogicLen ) ) ::Upstable() ::SetFocus() ::Refresh(.T., .T.) RETURN lAdd EndIf [/pre2] или озаботиться этим в bAddBefore PS и кстати , по поводу проверки запусков программы. Мне больше нравится WMI - стандартный инструмент менеджмента винды. Незаслуженно неиспользуемый , но дающий куда больше информации. Да, он не супер быстрый , но если это разовый вызов то время приемлемо. К примеру консолька ( написанная прямо тут без теста ) в параметре указать часть Caption процесса и она покажет все [pre2] #include 'common.ch' FUNC Main( cCaption ) Local oObj, oWmi, oItem, x If cCaption == nil ? 'USAGE: ' ? 'demo.exe caption' return nil end oObj := Win_OleCreateObject( "wbemScripting.SwbemLocator" ) oWmi := oObj:ConnectServer('127.0.0.1','root\CIMV2',,) if Valtype( oWmi ) == "O" for each oItem IN oWmi:ExecQuery( "SELECT * FROM Win32_Process" ) if Upper(cCaption) $ Upper(oItem:Caption) ? ? 'Caption' ,oItem:Caption ? 'ExecutablePath' ,oItem:ExecutablePath ? 'ProcessID' , hb_ntoc(oItem:ProcessID) ? 'CSName' , oItem:CSName ? 'GetOwner' , VAltype(oItem:GetOwner(1)) ? end next end RETURN NIL [/pre2] например demo host выдаст все процессы со словом host

Haz: Haz пишет: If HB_ISLOGICAL(xRet) .and. ! xRet SysRefresh() ::nLen := ( cAlias )->( Eval( ::bLogicLen ) ) ::Upstable() ::SetFocus() ::Refresh(.T., .T.) RETURN lAdd EndIf Поправочка - это для ::isDbf не хватает этого условия

SergKis: Haz пишет Или всеже не Author а Publisher Меня это давно как то совсем не трогает. сейчас гляну как починитть Что то со сранья сам не сообразил. Возможно надо 1. перенести перепоказ после :bAddAfter 2. параметр надо добавить lUnLock и перед return делать unlock



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