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

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

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

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

gfilatov2002: SergKis пишет: Что сделано ОК, принято Пример demo3 работает нормально с учетом всех правок

SergKis: gfilatov2002 Правки в примере, упустил чуток[pre2] 1. INIT PROCEDURE Sets_ENV() ... (App.Object):IsError правильнее применять чем (App.Object):lError , т.е. можно оба варианта IF (App.Object):IsError // ошибка создания обработчика сообытий App.Object MsgStop( (App.Object):cError, "ERROR" ) QUIT ENDIF ... END WITH fErase( App.Cargo:cTimer1Log ) fErase( App.Cargo:cTimer2Log ) RETURN 2. для сортировки колонок по двойному клику STATIC FUNCTION TsbReport( oWnd, nEvent, aArray, cColName ) ... :UserKeys( VK_F6, {|ob| _wPost(/*2*/"Excel", ob) } ) :lNoChangeOrd := .F. AEval( :aColumns, {|oc,nc| oc:lFixLite := .T., ; oc:lIndexCol := nc > 1 }) :AdjColumns({3, 4, 5, 6}) // :AdjColumns() ... 3. сместить вложенные данные при выводе FUNCTION o2Log( o, nLen, cMsg ) ... IF HB_ISOBJECT( a[2] ) ; o2Log( a[2], nLen + 5 ) ELSE ; ?? a[2] ENDIF ... [/pre2]

gfilatov2002: SergKis пишет: Правки в примере Принято. Благодарю за помощь


SergKis: gfilatov2002 Еще небольшая правка (подумал, что информация о контроле в фокусе должна быть всегда)[pre2] FUNCTION _oThis( oThis, lSets ) // Snapshot of current data This or Sets ... o:FocusedForm := "" o:FocusedControl := "" o:FocusedControlIndex := 0 IF !Empty( c := GetFocus() ) IF ( k := AScan( _HMG_aControlHandles, c ) ) > 0 o:FocusedControlIndex := k o:FocusedControl := _HMG_aControlNames [ k ] ... ENDIF k := iif( Empty( _HMG_ThisControlName ), o:FocusedControlIndex, _HMG_ThisIndex ) IF !Empty( k ) o:ControlCargo := _HMG_aControlMiscData2 [ k ] o:ControlHandle := _HMG_aControlHandles [ k ] o:ControlParentHandle := _HMG_aControlParenthandles [ k ] o:ControlParentName := GetParentFormName ( k ) ENDIF IF _HMG_ThisFormIndex > 0 ... и в примере правка, обсчитался в max длине имени переменной FUNCTION myTimer_1( oThis ) ... o2Log(oThis, 19, "*** oThis =>") ... FUNCTION myTimer_2( oThis ) ... o2Log(oThis, 19, "*** oThis =>") ... [/pre2]

gfilatov2002: SergKis пишет: Еще небольшая правка OK

Andrey: Минигуи 23.09 Вот такая ошибка появляется:[pre2] Как это понять ? Может есть переключатель для вывода ошибок ТОЛЬКО на английском ?

SergKis: gfilatov2002 Предложение по _LogFile(...). 1-й параметр сделать не только Logical, а Array или Char, для того, что бы на таймерах можно было использовать для них свои имена файлов log [pre2] *-----------------------------------------------------------------------------* #ifndef __XHARBOUR__ FUNCTION _LogFile( lCrLf, ... ) #else FUNCTION _LogFile( ... ) #endif *-----------------------------------------------------------------------------* LOCAL hFile, i, xVal, cTp LOCAL aParams := hb_AParams() LOCAL nParams := Len( aParams ) LOCAL cFile := hb_defaultValue( _SetGetLogFile(), GetStartUpFolder() + hb_ps() + "_MsgLog.txt" ) #ifdef __XHARBOUR__ LOCAL lCrLf #endif IF nParams > 0 IF HB_ISCHAR( aParams[1] ) aParams[1] := { .T., aParams[1] } ENDIF IF HB_ISARRAY( aParams[1] ) IF Len( aParams[1] ) > 1 IF HB_ISLOGICAL( aParams[1][1] ) // { .T.\.F. , cFile } cTp := aParams[1][2] aParams[1] := aParams[1][1] ELSEIF HB_ISLOGICAL( aParams[1][2] ) // { cFile , .T.\.F. } cTp := aParams[1][1] aParams[1] := aParams[1][2] ELSE // errors aParams[1] := .T. ENDIF IF !Empty( cTp ) IF !hb_ps() $ cTp cTp := GetStartUpFolder() + hb_ps() + cTp ENDIF cFile := cTp ENDIF ELSE // errors aParams[1] := .T. ENDIF cTp := NIL lCrlf := aParams[1] ENDIF ENDIF IF !Empty( cFile ) ... В примере APP_OOPREPORT\demo3.prg можно сделать (для примера по одной строке, например) *-----------------------------------------------------------------------------* FUNCTION myTimer_1( oThis ) *-----------------------------------------------------------------------------* ... LOCAL cLog := "_timer_1.log" ... _LogFile({.T., cLog}, "@@@ Timer_1 - 1", HB_DATETIME(), ProcName(), nCnt) _LogFile(cLog, "@@@ Timer_1 - 2", HB_DATETIME(), ProcName(), nCnt) _LogFile({cLog, .T.}, "@@@ Timer_1 - 3", HB_DATETIME(), ProcName(), ProcLine(), nCnt) ? "@@@ Timer_1", HB_DATETIME(), ProcName(), nCnt ... *-----------------------------------------------------------------------------* FUNCTION myTimer_2( oThis ) *-----------------------------------------------------------------------------* ... LOCAL cLog := "_timer_2.log" ... _LogFile({.T., cLog}, "@@@ Timer_2 - 1", HB_DATETIME(), ProcName(), nCnt) _LogFile(cLog, "@@@ Timer_2 - 2", HB_DATETIME(), ProcName(), nCnt) _LogFile({cLog, .T.}, "@@@ Timer_2 - 3", HB_DATETIME(), ProcName(), ProcLine(), nCnt) ? "@@@ Timer_2", HB_DATETIME(), ProcName(), nCnt ... [/pre2]

SergKis: PS Возможно, для стека This переменных надо ставить правильный тип для child окна, т.к. в реале "W" типа нет, т.е[pre2] *-----------------------------------------------------------------------------* PROCEDURE _PushEventInfo *-----------------------------------------------------------------------------* AAdd ( _HMG_aEventInfo , { _HMG_ThisFormIndex , _HMG_ThisEventType , ; iif( _HMG_ThisType == "W", "C", _HMG_ThisType ) , ; _HMG_ThisIndex , _HMG_ThisFormName , _HMG_ThisControlName } ) RETURN *-----------------------------------------------------------------------------* PROCEDURE _PopEventInfo( n ) *-----------------------------------------------------------------------------* ... _HMG_ThisType := iif( _HMG_aEventInfo [l] [3] == "C", "W", _HMG_aEventInfo [l] [3] ) ... [/pre2] С этим правками не уверен, т.к. протокол (смотрим ниже пост) выдает[pre2] *** aForm => ARRAY[3] // это дает HMG_GetForms( , .T. ) 1. {1, "A", "wMainInit", 201590000, "Template of the finished program on MiniGui"} 2. {2, "S", "Forma_Main", 19072408, "STANDARD: Forma_Main (1280x720)"} 3. {3, "S", "Form_ListCD", 30868462, "Message log WM_COPYDATA"} *** _HMG_aEventInfo => ARRAY[3] // это стек This переменных 1. {0, "", "", 0, NIL, NIL} 2. {1, "", "W", 1, "wMainInit", ""} 3. {2, "", "W", 2, "Forma_Main", ""} [/pre2] такой подмены типов S -> W не было, была C -> W

SergKis: PS2 Если сделать изменения по _LogFile(), как выше, то ф-я o2Log(...) из примера APP_OOPREPORT\demo3.prg может быть такой (сделана модификация) [pre2] *----------------------------------------------------------------------------* FUNCTION o2Log( o, nLen, cMsg, lExt, cLog ) *----------------------------------------------------------------------------* LOCAL a, b, c, i, j, k := pCount() DEFAULT lExt := .F., cLog := _SetGetLogFile() IF HB_ISCHAR(o) IF ( i := At("*", o) ) > 0 c := o o := upper(o) b := subs(o+" ", i + 1) IF left(o, i) $ "FORM*,FORMS*,AFORM*,AFORMS*" DEFAULT nLen := 12 o := {} b := iif( Empty(b), "", upper(alltrim(b)) ) FOR EACH a IN HMG_GetForms( , .T. ) IF iif( Empty(b), .T., a:Type $ b ) AAdd(o, {hb_enumIndex(a), a:Type, a:Index, a:Name, a:Handle, a:Title}) ENDIF NEXT c := iif( Empty(b), "", "<"+c+">"+" " ) Default cMsg := "==> aForms: " + c k := 3 ELSEIF left(o, i) $ "P*,PROC*, PROCNL*" DEFAULT nLen := 25 b := Val( b ) i := 0 o := oHmgData() WHILE ( ++i < 100 ) IF Empty( j := procname(i) ) ; EXIT ENDIF o:Set(TR0(ProcFile(i), nLen-7)+str(procline(i), 7), j) IF b > 0 .and. i >= b ; EXIT ENDIF END b := i := Nil Default cMsg := "==> ProcNL: " k := 3 ENDIF ENDIF ENDIF DEFAULT nLen := 19 IF k > 2 .and. HB_ISCHAR(cMsg) ; _LogFile({.T., cLog}, cMsg) ELSEIF !Empty(cMsg) ; _LogFile({.T., cLog}, Nil) ENDIF IF HB_ISOBJECT( o ) _LogFile({.F., cLog}, "O:"+o:ClassName) IF o:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA,TINIDATA" _LogFile({.F., cLog}, o:GetAll()) FOR EACH a IN o:GetAll() i := hb_enumIndex( a ) b := iif( HB_ISCHAR( a[1] ), TR0(a[1], nLen), a[1] ) _LogFile({.T., cLog}, TR0(i, nLen-1)+".", b, "=") IF HB_ISOBJECT( a[2] ) IF lExt o2Log( a[2], nLen + 5, , , cLog ) ELSE _LogFile({.F., cLog}, "O:"+a[2]:ClassName) IF a[2]:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA,TINIDATA" _LogFile({.F., cLog}, a[2]:GetAll()) ELSEIF a[2]:ClassName == "TWNDDATA" _LogFile({.F., cLog}, a[2]:Name, a[2]:Type) ELSEIF a[2]:ClassName $ "TCNLDATA,TTSBDATA,TGETDATA,TSTBDATA" _LogFile({.F., cLog}, a[2]:Window, a[2]:Name, a[2]:Type) ELSEIF a[2]:ClassName == "TBROWSE" _LogFile({.F., cLog}, a[2]:cControlName, a[2]:cParentWnd) ENDIF ENDIF ELSEIF HB_ISARRAY( a[2] ) .and. lExt _LogFile({.F., cLog}, hb_valtoexp( a[2] )) ELSE _LogFile({.F., cLog}, a[2]) ENDIF NEXT ELSEIF o:ClassName == "TWNDDATA" _LogFile({.F., cLog}, o:Name, o:Type) ELSEIF o:ClassName $ "TCNLDATA,TTSBDATA,TGETDATA,TSTBDATA" _LogFile({.F., cLog}, o:Window, o:Name, o:Type) ELSEIF o:ClassName == "TBROWSE" _LogFile({.F., cLog}, o:cControlName, o:cParentWnd) ENDIF ELSEIF HB_ISARRAY( o ) _LogFile({.F., cLog}, o) FOR EACH a IN o i := hb_enumIndex( a ) IF HB_ISOBJECT( a ) o2Log( a, nLen, , , cLog ) ELSEIF HB_ISARRAY( a ) _LogFile({.T., cLog}, TR0(i, nLen-1)+".") IF lExt _LogFile({.F., cLog}, a) FOR EACH j IN a k := hb_enumIndex( j ) _LogFile({.T., cLog}, TR0(k, nLen-1+5)+".", hb_valtoexp( j )) NEXT ELSE _LogFile({.F., cLog}, hb_valtoexp( a )) ENDIF ELSE _LogFile({.F., cLog}, a) ENDIF NEXT ELSE _LogFile({.F., cLog}, o) ENDIF RETURN .T. *----------------------------------------------------------------------------* FUNCTION TR0( cTxt, nLen, cSim ) *----------------------------------------------------------------------------* IF !HB_ISCHAR(cTxt) ; cTxt := cValToChar(cTxt) ENDIF Default nLen := Len(cTxt) IF cSim == Nil; cSim := " " ENDIF RETURN PadL( AllTrim( cTxt ), nLen, cSim ) [/pre2] применение[pre2] // доп. ф-ии FUNCTION To2Log(lExt) // lExt = .T. - расширенная распечатка, массивы по вертикали, объекты по содержимому o2Log(_oThis(), 19, "*** oThis =>", lExt) o2Log(oGetForms(.F.), 12, "*** aForm =>", lExt) o2Log(_HMG_aEventInfo,12, "*** _HMG_aEventInfo =>", lExt) o2Log("procNL*") RETURN Nil FUNCTION oGetForms(lChar) LOCAL aForms := {}, cRet := "", ow, aw Default lChar := .T. FOR EACH ow IN HMG_GetForms( , .T. ) AAdd(aForms, {hb_enumIndex(), ow:Type, ow:Name, ow:Handle, ow:Title} ) NEXT IF lChar FOR EACH aw IN aForms cRet += hb_valtoexp(aw) + CRLF NEXT RETURN cRet ENDIF RETURN aForms [/pre2] вызовы (это для отладки) ? "*** TsbObjViewer() *** Start" ; To2Log() ; ? TsbObjViewer(oWin, oUse, oIndx, oMenu, oTsb, aEvent, bInitForm) ? "*** TsbObjViewer() *** Stop" ; To2Log() ; ? результат [pre2] *** TsbObjViewer() *** Start *** oThis => O:THMGDATA ARRAY[13] 1. FORMINDEX = 2 2. EVENTTYPE = '' 3. TYPE = S 4. INDEX = 2 5. FORMNAME = Forma_Main 6. CONTROLNAME = '' 7. FOCUSEDFORM = '' 8. FOCUSEDCONTROL = '' 9. FOCUSEDCONTROLINDEX = 0 10. FORMHANDLE = 19072408 11. FORMPARENTHANDLE = 0 12. FORMPARENTNAME = '' 13. FORMCARGO = O:THMGDATA ARRAY[5] *** aForm => ARRAY[3] 1. {1, "A", "wMainInit", 201590000, "Template of the finished program on MiniGui"} 2. {2, "S", "Forma_Main", 19072408, "STANDARD: Forma_Main (1280x720)"} 3. {3, "S", "Form_ListCD", 30868462, "Message log WM_COPYDATA"} *** _HMG_aEventInfo => ARRAY[3] 1. {0, "", "", 0, NIL, NIL} 2. {1, "", "W", 1, "wMainInit", ""} 3. {2, "", "W", 2, "Forma_Main", ""} ==> ProcNL: O:THMGDATA ARRAY[14] 1. UTIL_MISC.PRG 17 = TO2LOG 2. TABLE4.PRG 82 = MY_STANDARD4 3. MAINMENU_FORM.PRG 283 = MY_BTN 4. MAINMENU_FORM.PRG 238 = (b)FORM_MENU_MAIN 5. H_OBJMISC.PRG 82 = DO_WINDOWEVENTPROCEDURE 6. H_OBJECTS.PRG 1279 = TWNDDATA:DOEVENT 7. H_OBJMISC.PRG 483 = DO_ONWNDLAUNCH 8. H_INIT.PRG 126 = (b)INIT 9. H_EVENTS.PRG 1283 = EVENTS 10. WAITWINGIF.PRG 0 = DOMESSAGELOOP 11. H_WINDOWS.PRG 1597 = _ACTIVATEWINDOW 12. MAINMENU_FORM.PRG 252 = FORM_MENU_MAIN 13. MAIN.PRG 476 = (b)SETS_EVENT2MAINWINDOW 14. MAIN.PRG 170 = MAIN Call from: TSBVIEWER(80) --> TsbViewer.prg aWinPar= ARRAY[13] {"WAIT", "Button_4: 4 Sample 4", 0, 0, 1280, 680, .F., {0, 176, 240}, {"LblDown", 23, {255, 255, 255}, {0, 120, 215}, .T., "! you can write something here ...."}, .F., NIL, {|| ... }, {|| ... }} ... *** TsbObjViewer() *** Stop *** oThis => O:THMGDATA ARRAY[13] 1. FORMINDEX = 2 2. EVENTTYPE = '' 3. TYPE = S 4. INDEX = 2 5. FORMNAME = Forma_Main 6. CONTROLNAME = '' 7. FOCUSEDFORM = '' 8. FOCUSEDCONTROL = '' 9. FOCUSEDCONTROLINDEX = 0 10. FORMHANDLE = 19072408 11. FORMPARENTHANDLE = 0 12. FORMPARENTNAME = '' 13. FORMCARGO = O:THMGDATA ARRAY[5] *** aForm => ARRAY[3] 1. {1, "A", "wMainInit", 201590000, "Template of the finished program on MiniGui"} 2. {2, "S", "Forma_Main", 19072408, "STANDARD: Forma_Main (1280x720)"} 3. {3, "S", "Form_ListCD", 30868462, "Message log WM_COPYDATA"} *** _HMG_aEventInfo => ARRAY[3] 1. {0, "", "", 0, NIL, NIL} 2. {1, "", "W", 1, "wMainInit", ""} 3. {2, "", "W", 2, "Forma_Main", ""} ==> ProcNL: O:THMGDATA ARRAY[14] 1. UTIL_MISC.PRG 17 = TO2LOG 2. TABLE4.PRG 86 = MY_STANDARD4 3. MAINMENU_FORM.PRG 283 = MY_BTN 4. MAINMENU_FORM.PRG 238 = (b)FORM_MENU_MAIN 5. H_OBJMISC.PRG 82 = DO_WINDOWEVENTPROCEDURE 6. H_OBJECTS.PRG 1279 = TWNDDATA:DOEVENT 7. H_OBJMISC.PRG 483 = DO_ONWNDLAUNCH 8. H_INIT.PRG 126 = (b)INIT 9. H_EVENTS.PRG 1283 = EVENTS 10. WAITWINGIF.PRG 0 = DOMESSAGELOOP 11. H_WINDOWS.PRG 1597 = _ACTIVATEWINDOW 12. MAINMENU_FORM.PRG 252 = FORM_MENU_MAIN 13. MAIN.PRG 476 = (b)SETS_EVENT2MAINWINDOW 14. MAIN.PRG 170 = MAIN ... [/pre2] PS Заменил, текст ф-ии o2Log(...), т.к. потерял при перетаскивании часть строк, ее можно применять для App.Cargo, This.Object:Cargo, но она исп. правку для _LogFile(...) ф-ии из поста выше

gfilatov2002: Выложил 1-е обновление сборки 23.09 по адресу Скачать Желаю всем хорошего дня!

Andrey: Собрал свою большую систему на новой версии - падает сразу при запуске. Вот такая ошибка: [pre2]Time from start: 0 days 0 hours 0 mins 0 secs Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA --------------------------------- Stack Trace --------------------------------- Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(158) in module: Source\main.prg [/pre2] Вот код: [pre2] SET EVENTS FUNCTION TO MyEventsHandler DEFINE WINDOW Form_Main ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT {|| DoEvents(), _wPost(0) } ; ON RELEASE {|| _LogFile(.T., CRLF + ">>> STOP <<< " + HMG_TimeMS(App.Cargo:tStart) ) } ; .... WITH OBJECT This.Object :Event( 0, {|ow| // запуск при инициализации окна Local hWnd, cWnd hWnd := ow:Handle cWnd := ow:Name ? REPL(".", 90 ) ? SPACE(5) + ":Event(0)", ProcNL(), hWnd, IsIconic( hWnd ), cWnd, _HMG_MainHandle myInitForm() DO EVENTS _wSend(1, ow) // запуск события 1 DO EVENTS _wSend(2, ow) // запуск события 2 DO EVENTS _wPost(3, ow) // запуск события 3 Return Nil MAIN(158) -->> })[/pre2]

Andrey: Заменил в новой версии МиниГуи Харбор на январский (из версии МиниГуи) [pre2]Version: 3.2.0dev (r2211251714) Built on: Dec 3 2022 Last ChangeLog entry: 2022-11-25 18:14 UTC+0100 Przemyslaw Czerpak ChangeLog ID: 179749ac31ef3a6665d109ba6d02563840596d21[/pre2] Прога моя собралась и работает нормально. Чего в Харборе намудрили ?

gfilatov2002: SergKis пишет: Предложение по _LogFile(...) Принято SergKis пишет: Если сделать изменения по _LogFile(), как выше, то ф-я o2Log(...) из примера APP_OOPREPORT\demo3.prg Возможно получить весь этот пример в крайней редакции? Заранее благодарен

SergKis: gfilatov2002 Пример тут https://TransFiles.ru/tqcd8 положил h_objmisc.prg, в нем ф-ия _o2Log() аналог o2Log() из примера, я положил для использования в lib и что бы не пересекались с примерами переименовал. Команды в o2Log() o2Log("Forms*" , , , , cLog) o2Log("procNL*", , , , cLog) имеют подкоманды o2Log("Forms*M" , , , , cLog) // только окна модал o2Log("Forms*MS" , , , , cLog) // только окна модал и standard, т.е. за * список типов окон o2Log("procNL*3", , , , cLog) o2Log("procNL*5", , , , cLog) // сколько строк из списка подать на вывод

gfilatov2002: SergKis пишет: положил h_objmisc.prg Спасибо, пример работает нормально

SergKis: gfilatov2002 В пример можно добавить работу с записями dbf в контейнере, функция oRecGet(). Правка [pre2] WITH OBJECT App.Object // set events App\Program begin :Event({ 1, "Timer_1"}, {|oa,ky,nn,cnam| // таймер 1 Local oMain := App.Cargo:oMain, cAls, oRec Local oThis, cFunc, xRet, cKey, nKey oMain:Enabler(cnam, .F.) // выкл.timer // --- для примера cKey := oa:oEvents:Get(ky, "???") // имя события от кода его nKey := oa:oEvents:Get(cKey, 0) // код события от его имени // ---- cFunc := "my" + cnam // имя ф-ии обработчика ? "#", "O:"+oa:ClassName,ky,nn,cnam, cKey, nKey, cFunc, oMain:Name oThis := _oThis() // снимок this среды oThis:cFunc := cFunc oThis:cKey := cKey oThis:nKey := nKey oThis:cLog := App.Cargo:cFileLog IF HB_ISOBJECT(oMain:Cargo:oBrw) cAls := (oMain:Cargo:oBrw:cAlias) oRec := (cAls)->( oRecGet() ) oRec:nRecNo := (cAls)->( RecNo() ) oThis:oRec := oRec ENDIF xRet := hb_ExecFromArray( cFunc, {oThis} ) oMain:Enabler(cnam, .T.) // вкл. timer nn := ky oThis := Nil Return Nil }) при перемещении по тсб, Timer_1 будет считывать тек. запись Записать в запись в dbf можно так (cAls)->(dbAppend()) IF (cAls)->(RLock()) (cAls)->(oRecPut(oRec)) // пишет в dbf только существующие и не защищенные поля из объекта ENDIF объединить записи из разных alias oRec := (cAls)->(oRecGet()) oRec := (cAls2)->(oRecGet(oRec)) _o2Log(oRec, 11, "*** oRec: ") [/pre2]

Andrey: SergKis пишет: o2Log("Forms*MS" , , , , cLog) // только окна модал и standard, т.е. за * список типов окон А можно получить другой список окон, чтобы было имя prg в котором находиться данное окно ? [pre2] aForms :={} FOR EACH ow IN HMG_GetForms( , .T. ) AAdd(aForms, {hb_enumIndex(), ow:Type, ow:Name, ow:Handle, ow:Title, ow:Prg} ) // примерно так NEXT cRet := "" FOR EACH aw IN aForms cRet += hb_valtoexp(aw) + CRLF NEXT ? cRet [/pre2]

SergKis: Andrey пишет AAdd(aForms, {hb_enumIndex(), ow:Type, ow:Name, ow:Handle, ow:Title, ow:Prg} ) // примерно так Таких данных нет, сам организуй[pre2] DEFINE WINDOW ... This.Cargo := oHmgData() This.Cargo:cFormName := ThisName This.Cargo:cFormPrg := ProcFile() ... [/pre2] o2log(This.Cargo, , "==> :Cargo: ") PS Можно поправить тексты hmg для получения данных ProcFile(), ProcName(), ProcLine() - они, правки не большие, тогда будет вывод добавлен AAdd(o, {hb_enumIndex(ow), ow:Type, ow:Index, ow:Name, ow:Handle, IsWindowVisible(ow:Handle), ow:Title, ow:cProcFile, ow:cProcName, ow:nProcLine}) для пробы сделал, положил на ftp, проверь, если Григорий даст добро на изменения, перекинь

gfilatov2002: SergKis пишет: Григорий даст добро на изменения Все изменения приняты Благодарю за помощь

SergKis: gfilatov2002 Небольшая добавка в h_objmisc.prg [pre2] FUNCTION _o2Log( o, nLen, cMsg, lExt, cLog ) ... IF HB_ISOBJECT( o ) _LogFile({.F., cLog}, "O:"+o:ClassName) IF o:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA,TINIDATA" _LogFile({.F., cLog}, o:GetAll()) IF o:ClassName == "TINIDATA" _LogFile({.F., cLog}, o:cIni) ENDIF FOR EACH a IN o:GetAll() ... IF a[2]:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA,TINIDATA" _LogFile({.F., cLog}, a[2]:GetAll()) IF a[2]:ClassName == "TINIDATA" _LogFile({.F., cLog}, a[2]:cIni) ENDIF ELSEIF a[2]:ClassName == "TWNDDATA" ... [/pre2] Пример проверка для ini https://TransFiles.ru/9yjqn



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