On-line: Andrey, гостей 2. Всего: 3 [подробнее..]
АвторСообщение
gfilatov
модератор




Пост N: 699
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)


Начало темы находится здесь, а теперь

АНОНС * АНОНС * АНОНС * АНОНС * АНОНС

Готовится к опубликованию новая сборка №48, которая выйдет в конце недели.
Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне

Кратко, что нового:

- исправление обнаруженных ошибок и неточностей кода;
- новый класс HEADERIMAGE для Grid и Browse;
- свойство Address в Hyperlink может теперь открывать папку или файл на диске;
- добавлен NOTABSTOP класс для Browse;
- поддержка пользовательских компонентов (заимствована из оффициального релиза);
- расширения и исправления в библиотеках TsBrowse и PropGrid;
- обновлены сборки Харбор и HMGS-IDE;
- новые и обновленные старые примеры (как обычно ).




Спасибо: 5 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


SergKis
постоянный участник




Пост N: 1874
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.06.18 16:16. Заголовок: gfilatov2002 Поправ..


gfilatov2002
Поправил в своей lib
 
*------------------------------------------------------------------------------*
FUNC Do_Obj( nHandle, bBlock, p1, p2, p3 )
*------------------------------------------------------------------------------*
LOCAL o

If empty (nHandle) ; nHandle := _HMG_ThisFormName
ElseIf HB_ISOBJECT(nHandle)
If nHandle:ClassName == 'TSBROWSE'; nHandle := nHandle:cParentWnd
Else ; nHandle := nHandle:Name
EndIf
EndIf

If HB_ISCHAR(nHandle) ; nHandle := GetFormHandle( nHandle )
EndIf

If hmg_IsWindowObject(nHandle)

o := hmg_GetWindowObject(nHandle)

If HB_ISCHAR(bBlock); bBlock := hb_macroblock( bBlock )
EndIf

If HB_ISBLOCK(bBlock)
IF o:IsWindow; RETURN Do_WindowEventProcedure ( bBlock, o:Index, o, p1, p2, p3 )
ELSE ; RETURN Do_ControlEventProcedure ( bBlock, o:Index, o, p1, p2, p3 )
ENDIF
EndIf

Endif

RETURN o

Для исп. в командах (короче писать), к прмеру
#translate doObj( <blk> ) => Do_Obj ( nil , <"blk"> )
#translate doObj( <blk> , <wnd> ) => Do_Obj ( <"wnd">, <"blk"> )
#translate _doObj( <blk> ) => Do_Obj ( nil , <"blk"> )
#translate _doObj( <blk> , <wnd> ) => Do_Obj ( <wnd> , <"blk"> )

#translate wObj( ) => _WindowObj ( _HMG_ThisFormName )
#translate wObj( <wnd> ) => _WindowObj ( <"wnd"> )
#translate _wObj( ) => _WindowObj ( _HMG_ThisFormName )
#translate _wObj( <wnd> ) => _WindowObj ( <wnd> )

#translate gObj( <ctl> ) => _ControlObj( <"ctl">, _HMG_ThisFormName )
#translate gObj( <ctl> , <wnd> ) => _ControlObj( <"ctl">, <wnd> )
#translate _gObj( <ctl> ) => _ControlObj( <ctl> , _HMG_ThisFormName )
#translate _gObj( <ctl> , <wnd> ) => _ControlObj( <ctl> , <wnd> )


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1302
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.06.18 20:53. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Поправил в своей lib


Благодарю за внимание!
Мы уже обсуждали, что подготовкой входных параметров в идеале должна заниматься вызывающая функция
Это позволяет делать функции в ядре компактными
По этой причине не принято...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1875
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.06.18 21:05. Заголовок: gfilatov2002 пишет Э..


gfilatov2002 пишет
 цитата:
Это позволяет делать функции в ядре компактными




 цитата:
Был не прав, вспылил.



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1303
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.06.18 11:28. Заголовок: Всем кому это интере..


Всем кому это интересно

Подготовил beta 3 для новой сборки библиотеки со следующим списком изменений
Скрытый текст


Благодарю за Ваше внимание
Особая благодарность Сергею Киселеву за неоценимую помощь в развитии библиотеки TsBrowse


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1876
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.06.18 15:34. Заголовок: gfilatov2002 Если м..


gfilatov2002
Если модальному окну добавить свойство lFocusBreack := [.F.]\.T.
Добавить в место, где обработка потери фокуса мод. окном с морганием, проверку lFocusBreack.
Если .T., не моргать, а завершать мод.окно (как по X), будет похоже на child поведение под модал родителем



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1877
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.06.18 16:05. Заголовок: PS В команду #comman..


PS
В команду
 
#command ADD [ COLUMN ] TO [ TBROWSE ] <oBrw> ;
...

надо добавить ALIAS, тогда в команде ADD COLUMN ... DATA hb_macroblock(...) ... ALIAS ...
поведение аналогично DEFINE COLUMN будет

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1304
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.06.18 16:35. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо добавить ALIAS, тогда в команде ADD COLUMN


Да, это было сделано сразу при модификации

 цитата:
аналогично DEFINE COLUMN



SergKis пишет:

 цитата:
Если модальному окну добавить свойство lFocusBreack


Предложение интересное, но требуется небольшой пример для проверки этого нового свойства

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1878
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.06.18 18:28. Заголовок: gfilatov2002 пишет т..


gfilatov2002 пишет
 цитата:
требуется небольшой пример


Свойство условное, имел ввиду такое
 
FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ;
...
NoAutoRelease, InteractiveCloseProcedure, MoveProcedure, DropProcedure, clientwidth, clientheight, lLostExit )
...
_HMG_aFormMiscData1 [ k ] := {lLostExit}
...

В обработчике, при потере фокуса на окне типа 'M' проверить разрешен выход или нет.


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1879
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.06.18 18:32. Заголовок: PS в команду #xcom..


PS
в команду #xcommand DEFINE WINDOW <w> ;
добавить
 
[ <helpbutton: HELPBUTTON> ] ;
[ <FocusExit: FOCUSEXIT>
=> ;
DECLARE WINDOW <w> ;;
...
к примеру


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1305
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.06.18 20:56. Заголовок: SergKis пишет: Свой..


SergKis пишет:

 цитата:
Свойство условное


Решил назвать это свойство модального окна FLASHEXIT и сохранять его в элементе массива _HMG_aFormFocused [ i ]

У меня уже работает следующий пример:

#include "Minigui.ch" 

*************
function MAIN
*************

DEFINE WINDOW cDlgMain AT 0 , 0 WIDTH 400 HEIGHT 300 TITLE "Main" MAIN

DEFINE BUTTONEX ButtonEX_1
ROW 225
COL 79
WIDTH 100
HEIGHT 30
CAPTION "Child&Modal"
ICON NIL
ACTION CHILD_MODAL()
END BUTTONEX

DEFINE BUTTONEX ButtonEX_2
ROW 225
COL 219
WIDTH 100
HEIGHT 30
CAPTION "&Quit"
ICON NIL
ACTION cDlgMain.release
END BUTTONEX

END window

cDlgMain.center
cDlgMain.activate

return NIL

*************************
static function CHILD_MODAL
*************************
IF iswindowdefined(cDlgChild1)
doMethod( "cDlgChild1", "SETFOCUS" )
return NIL
ENDIF

DEFINE WINDOW cDlgChild1 AT 0 , 0 WIDTH 400 HEIGHT 300 TITLE "Child" CHILD ;
ON GOTFOCUS iif((i := GetFormIndex( "cDlgModal1" )) > 0, _HMG_aFormFocused [ i ] := .T., THIS.TITLE := "GOTFOCUS")

END window

DEFINE WINDOW cDlgModal1 AT 0 , 0 WIDTH 100 HEIGHT 100 TITLE "Modal" MODAL ;
ON LOSTFOCUS cDlgChild1.TITLE := "FLASHEXIT"

END window

cDlgChild1.center

activate window cDlgModal1, cDlgChild1

return NIL

Прошу проверить и подтвердить, что я двигаюсь в правильном направлении

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1306
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.06.18 21:03. Заголовок: P.S. В файле h_event..


P.S.
В файле h_events.prg сделал такую вставку
... 
IF iswinnt() .OR. _HMG_aFormType [ i ] != 'M'
BringWindowToTop ( _HMG_ActiveModalHandle )

FOR x := 1 TO Len ( _HMG_aFormHandles )

IF _HMG_aFormHandles [x] == _HMG_ActiveModalHandle .AND. _HMG_aFormFocused [x]
PostMessage( _HMG_ActiveModalHandle, WM_CLOSE, 0, 0 )
ENDIF

NEXT x
ENDIF
...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1880
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.06.18 23:49. Заголовок: gfilatov2002 пишет П..


gfilatov2002 пишет
 цитата:
Прошу проверить


Более наглядный пример (по мне)Скрытый текст

С модал 1 фокус на маин окно и с маин 2 фокус на маин 1.
Если нажав на модал 1 кнопку Focus Main, переключить на far и обратно - срабатывает, модал 1 уходит.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1881
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.06.18 00:07. Заголовок: SergKis пишет С мода..


SergKis пишет
 цитата:
С модал 1 фокус на маин окно и с маин 2 фокус на маин 1.


читать
С модал 1 фокус на маин окно и с модал 2 фокус на модал 1.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1882
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.06.18 12:28. Заголовок: gfilatov2002 Такой ..


gfilatov2002
Такой манипуляцией, запустил child окно под modal
 
*************************
static function MODAL_2( oParent )
*************************
LOCAL y := App.Row+80
LOCAL x := App.Col+80
LOCAL m := _HMG_IsModalActive
LOCAL h := _HMG_ActiveModalHandle

_HMG_IsModalActive := .F.
_HMG_ActiveModalHandle := 0

DEFINE WINDOW cModal2 AT y, x WIDTH 400 HEIGHT 300 TITLE "Modal 2" CHILD
ON GOTFOCUS This.Release
...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1883
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.06.18 14:34. Заголовок: SergKis пишет Такой ..


SergKis пишет
 цитата:
Такой манипуляцией, запустил child окно под modal


Работающий вариант с modal окна запустить child окно (это против системы). Функция на замену к примеру выше
Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1884
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 11:55. Заголовок: gfilatov2002 Сделал..


gfilatov2002
Сделал в своей версии
 
CLASS TSColumn
...
DATA bSeek //

...
METHOD DrawLine( xRow ) CLASS TSBrowse
...
If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) )
uData := "" // append mode for arrays
Elseif cColAls != Nil
If Valtype( oColumn:bSeek ) == 'B'
( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) )
EndIf

uData := ( cColAls )->( Eval( oColumn:bData ) )
Else
If Valtype( oColumn:bSeek ) == 'B'
Eval( oColumn:bSeek, Self, nJ )
EndIf

uData := Eval( oColumn:bData )
EndIf
...
METHOD DrawSelect( xRow, lFoot ) CLASS TSBrowse
...
If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) )
uData := "" // append mode for arrays
Elseif cColAls != Nil
If Valtype( oColumn:bSeek ) == 'B'
( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) )
EndIf

uData := ( cColAls )->( Eval( oColumn:bData ) )
Else
If Valtype( oColumn:bSeek ) == 'B'
Eval( oColumn:bSeek, Self, nJ )
EndIf
uData := Eval( oColumn:bData )
EndIf
...

Может полезно будет. Без relation, сечас, в блоке :bData делаем подвод, с :bSeek можно разделить подвод и :bData :
oBrw:aColumns[5]:bSeek := {|obr| iif( obr:cAlias->FLD_3 == STAT, .T., dbSeek( obr:cAlias->FLD_3 ) ) }


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1307
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.06.18 13:22. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может полезно будет.


Добавил, поскольку Вы находите это полезным
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1885
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 16:06. Заголовок: Григорий, чем у Вас ..


Григорий, чем у Вас завершилось
 цитата:
свойство модального окна FLASHEXIT


У меня срабатывало, при уст. фокуса на внешнее приложении, к примеру Far.
На своих окнах hmg -> не срабатывало. Завершил костылем, modal -> child,
похожий костыль работает MDI child -> modal давно и стабильно.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1308
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.06.18 16:40. Заголовок: SergKis пишет: чем ..


SergKis пишет:

 цитата:
чем у Вас завершилось


Завершилось тем, что переписал этот кусок следующим образом:

 цитата:
... 
IF _HMG_IsModalActive .AND. Empty ( _HMG_InplaceParentHandle ) .AND. ;
( _HMG_aFormVirtualWidth [ i ] == 0 .OR. _HMG_aFormVirtualHeight [ i ] == 0 ) .AND. ;
_HMG_SplitLastControl != "TOOLBAR"

IF _HMG_aFormType [ i ] != 'M'

IF iswinnt()

IF ! _OnFlashExit ()
BringWindowToTop ( _HMG_ActiveModalHandle )
// Form's caption blinking if a top window is not Modal window
FlashWindowEx ( _HMG_ActiveModalHandle, 1, 5, 60 )
ENDIF

ELSE

IF ! _OnFlashExit ()
BringWindowToTop ( _HMG_ActiveModalHandle )
ENDIF

ENDIF

ENDIF

ENDIF
...
*-----------------------------------------------------------------------------*
STATIC FUNCTION _OnFlashExit ()
*-----------------------------------------------------------------------------*
LOCAL x, lExit := .F., nFormCount := Len ( _HMG_aFormNames )

FOR x := 1 TO nFormCount

IF _HMG_aFormHandles [x] == _HMG_ActiveModalHandle .AND. _HMG_aFormFocused [x]
PostMessage ( _HMG_ActiveModalHandle, WM_CLOSE, 0, 0 )
lExit := .T.
EXIT
ENDIF

NEXT x

RETURN lExit


Критика принимается...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1886
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 17:36. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
переписал этот кусок следующим образом


Не понял, как работает ?
Простой пример Скрытый текст

Два окна. wMain -> wModal, на modal ставлю _HMG_aFormFocused [ This.Index ] := .T.,
при потере фокуса по кнопке или клику по main окну, modal должна убраться.
Остается.


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1309
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.06.18 17:46. Заголовок: SergKis пишет: при ..


SergKis пишет:

 цитата:
при потере фокуса по кнопке или клику по main окну, modal должна убраться.


Работает немного по-другому:
модальное окно закрывается при вызове после него любого дочернего окна.
Если свойство FlashExit у модального окна не определено, то оно не даст переключиться на новое окно и будет "мигать"

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1887
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 18:09. Заголовок: gfilatov2002 пишет м..


gfilatov2002 пишет
 цитата:
модальное окно закрывается при вызове после него любого дочернего окна


Принимает только след. модальное wModal2 (wChild не проходит) и wModal не уходит, остается.

С FlashExit, думалось, будет работать, как костыль на modal -> child, т.е. modal -> modlal2,
при потере фокуса modal2 уходит, как child с ON LOSTFOCUS ThisWindow.Release.
Исп. это при замене COMBOBOX на окно с TsBROWSE

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1888
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 18:11. Заголовок: PS Не ту кнопку нажа..


PS
Не ту кнопку нажал. Текст примера Скрытый текст


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1310
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.06.18 20:04. Заголовок: SergKis пишет: Прин..


SergKis пишет:

 цитата:
Принимает только след. модальное wModal2 (wChild не проходит)


У меня работает с wChild такой пример (немного переработанный):

 цитата:
 #include "Minigui.ch"   

*************
function MAIN
*************

DEFINE WINDOW wMain AT 0 , 0 WIDTH 400 HEIGHT 300 TITLE "Main" MAIN

DEFINE BUTTONEX ButtonEX_1
ROW 225
COL 79
WIDTH 100
HEIGHT 30
CAPTION "Modal"
ICON NIL
ACTION MODAL()
END BUTTONEX

DEFINE BUTTONEX ButtonEX_2
ROW 225
COL 219
WIDTH 100
HEIGHT 30
CAPTION "&Quit"
ICON NIL
ACTION ThisWindow.release
END BUTTONEX

END window

wMain.center
wMain.activate

return NIL

*************************
static function MODAL()
*************************
DEFINE WINDOW wModal AT 0, 0 WIDTH 200 HEIGHT 200 TITLE "Modal" MODAL

_HMG_aFormFocused [ This.Index ] := .T.

DEFINE BUTTONEX ButtonEX_1
ROW 20
COL 40
WIDTH 100
HEIGHT 30
// CAPTION "Modal 2"
CAPTION "Child"
ICON NIL
// ACTION MODAL2()
ACTION CHILD()
END BUTTONEX

END window

wModal.center
wModal.activate

return NIL

*************************
static function MODAL2()
*************************
DEFINE WINDOW wModal2 AT 0 , 0 WIDTH 100 HEIGHT 100 TITLE "Modal 2" MODAL

END window

wModal2.center
wModal2.activate

return NIL

*************************
static function CHILD()
*************************

if IsWindowDefined(wChild)
doMethod("wChild", "HIDE")
doMethod("wChild", "SHOW")
doMethod("wChild", "SETFOCUS")
return NIL
endif

DEFINE WINDOW wChild AT 0 , 0 WIDTH 100 HEIGHT 100 TITLE "Child" CHILD ;
NOMAXIMIZE NOMINIMIZE

define timer t_1 interval 50 action doMethod("wChild", "SETFOCUS") once

END window

wChild.center
activate window wChild NOWAIT

DO MESSAGELOOP


return NIL



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1889
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 20:54. Заголовок: gfilatov2002 пишет р..


gfilatov2002 пишет
 цитата:
работает с wChild такой пример


Работает

Вот тот же пример с костылем (child окно на модал и на main) Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1890
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 21:09. Заголовок: PS в CHILD2 добавить..


PS
в CHILD2 добавить (обработка потери фокуса)
 
DEFINE WINDOW wChild AT 0 , 0 WIDTH 100 HEIGHT 100 TITLE "Child" CHILD ;
NOMAXIMIZE NOMINIMIZE ;
ON LOSTFOCUS do_Obj(This.Handle, {|ow| ow:Release() })



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1311
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.06.18 21:37. Заголовок: SergKis пишет: тот ..


SergKis пишет:

 цитата:
тот же пример с костылем


Так каков вердикт?
Нужен этот новый clause FlashExit или достаточно костыля

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1891
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 21:52. Заголовок: gfilatov2002 пишет Н..


gfilatov2002 пишет
 цитата:
Нужен этот новый clause FlashExit или достаточно костыля


Не понимаю, надо осознать . Народ подтянуть.
Если активировать в примере строку
 
DEFINE WINDOW wModal AT 0, 0 WIDTH 200 HEIGHT 200 TITLE "Modal" MODAL

// _HMG_aFormFocused [ This.Index ] := .T.


модальное окно уберется, с др. стороны есть др. способы убрать модал. Я

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5919
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.06.18 22:13. Заголовок: SergKis пишет: Не п..


SergKis пишет:

 цитата:
Не понимаю, надо осознать . Народ подтянуть.


Читаю как про инопланетян...
Для чего это хоть делаете ? На пальцах объясните, по простому, по русски...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1892
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 22:33. Заголовок: Andrey Работаем на ..


Andrey
Работаем на модальном окне, заменяем combobox модальным окном с тсб списком выбора (без заголовков, с Х).
Все работает, кроме клика за пределами окна-списка (только Х завершает).
Child окно из под модального - ку-ку. На нем можно делать lostfocus.
Вот вокруг запуска окна child из под модального и сыр-бор.
С FlashExit child запускается, модал убирается ВСЕГДА.
С костылем, child запускается, модал остается (сам убирай). Клик за пределами child и ON LOSTFOCUS окно child убирает.


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1893
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.06.18 22:58. Заголовок: PS в CHILD2 добавит..


PS
в CHILD2 добавить (блокировку X окна wModal), иначе валится при его нажатии и наличии окна child
 
*************************
static function CHILD2( cFocusName )
*************************
LOCAL oParent := ThisWindow.Object
LOCAL lM
LOCAL hM

oParent:Action := .F.

If oParent:Type == 'M'
...
Endif

oParent:Action := .T.

oParent:SetFocus(cFocusName)

return NIL
и в функцию добавить
*************************
static function MODAL()
*************************
DEFINE WINDOW wModal AT 0, 0 WIDTH 200 HEIGHT 200 TITLE "Modal" MODAL ;
ON INTERACTIVECLOSE (This.Object):Action

...



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1312
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.07.18 10:20. Заголовок: Выпущена новая сборк..


Выпущена новая сборка 18.06 для BCC 5.51 для компиляторов Harbour и xHarbour

Базовый дистрибутив-инсталлятор находится по адресу

http://hmgextended.com/files/CONTRIB/hmg-18.06-setup.exe

Рекомендуется к использованию

Также имеются в наличии готовые сборки для:

- MinGW 8.1.0 32-bit для Harbour 3.2.0dev;

- MinGW 8.1.0 64-bit для Harbour 3.4.0dev;

- MS VisualC 2017 32-bit для Harbour 3.2.0dev;

- Borland/Embarcadero C++ 7.3 (32-bit) для Harbour 3.2.0dev.

Благодарю за Ваше внимание и поддержку

P.S. Доступно зеркало домашней страницы по адресу

http://hmgextended.org

P.S. 2 Выпуск новых сборок приостановлен на неопределенное время
по материальным причинам

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1268
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.07.18 13:53. Заголовок: SergKis пишет: Рабо..


SergKis пишет:

 цитата:
Работаем на модальном окне, заменяем combobox модальным окном с тсб списком выбора


Сергей, я свой вариант на классе допиливаю потихоньку . У меня с заголовками, но без [X] все работает.
В своих проектах заменяю сомбик везде. Для вызова используется oCol:PrevEdit() где обрабатывается примерно такой код
 
CASE cCol == "ID_CURR"
SQL("T1", "SELECT * FROM CNT_CUR") // Это из под ADS , в стандарте тупо меняется на USE cBase ALIAS 'T1'
T1->(OrdSetFocus("NAME"))

xLbx := LBX():New() // Создать объект
xLbx:cAlias := "T1" // Какой алиас в нем показать
xLbx:cRetField := "ID" // какое поле вернуть
xLbx:aHeaders := {'A', 'B'} // как назвать заголовки
xLbx:aWidth := {35, 100} // ширина колонок
xLbx:aAlign := {DT_CENTER, DT_LEFT} // как выровнять
xLbx:aField := {'NAME', 'FULLNAME'} // какие поля показать
xLbx:nHeightCell := 20 // соответствующие размеры
xLbx:nHeightHead := 0
xLbx:nHeightFoot := 0
xLbx:bPostBlock := {|| NIL } // блок который выполнить после выбора
xLbx:bSearch := {|| NIL } // блок поиска в таблице объекта

xLbx:ListBox( oBrw, xVal ) // непосредственно показ

T1->(DBCloseArea()) // убирается за собой
lRet := FALSE // не пускаем в режим редактирования



click here

Предусмотрены футинги и их выравнивание , но пока не делал

Если интересно , могу сюда сбросить скомпилированный пример, как это выглядит и исходники разумеется.
PS. у дураков мысли сходятся , у меня точно такие же переменные для отлова модала lM и hM

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1905
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.07.18 16:20. Заголовок: Haz пишет Если интер..


Haz пишет
 цитата:
Если интересно , могу сюда сбросить скомпилированный пример, как это выглядит и исходники разумеется.


Конечно интересно. В итоге может стать заменителем родного ComboBox.

 цитата:
у дураков мысли сходятся , у меня точно такие же переменные для отлова модала lM и hM


Мне больше нравиться "краткость - сестра таланта" (c)
Свои переменные с именем > 4 символов напрягают. "Лень двигатель прогресса" (c)
Так что совпадения обоснованные

 цитата:
Для вызова используется oCol:PrevEdit() где обрабатывается примерно такой код


Аналогично поступаю, только через сообщение, тогда отрываемся от блока :bPrevEdit, имеем среду окна (можно контрола) This,
По мне более свободен в действиях, т.к. тсб "свободна" для приема др. сообщений.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1269
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.07.18 16:46. Заголовок: SergKis пишет: Коне..


SergKis пишет:

 цитата:
Конечно интересно


тут спрятал

PS. При сборке половина инклюдов в исходнике класса не нужна, просто дернул как есть из проекта

в поиске косячек с прорисовкой, только заметил. Сам использую ADS там другая логика. Но как предварительный пример как сделать поиск по справочнику сойдет, тем более что поиск скорее будет у каждого свой.
Для исправления достаточно в процедуре поиска добавить
  
oBrw:Reset()
oBrw:GoTop()
oBrw:Refresh(TRUE)


Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 796
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 04.07.18 20:54. Заголовок: Вызов справочников в..


Вызов справочников ввиде TsBrows давно применяю , как основной способ. Combox так же имеет право на существование, смотря по обстоятельствам.
Окно модальное немодальное есть некоторые проблемы. Мысль, изложенная выше,закрывать окно справочника при потери фокуса - можно попробовать, но лучше, чтобы
окно могло вести как модальное
(при установке соответствующего параметра).
Описание справочника делаю в текстовом файле, из которого считываются параметры создания окна.
В функционале вызов справочника из формы предельно лаконичный

 цитата:

..
if ControlName == 'BtnTxt_IM' .or. ControlName == 'BtnTxt_IM_O'
Select IM
if !empty(sValue)
Seek Upper(sValue)
if Found()
nR:=Recno()
endif
endif
if CreaTBrows('IM.UKS',nR)
EditLudi.&(ControlName).Value:=IM->IM
endif

...


Из Tbrows
через :bPrevEdit


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1920
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.07.18 20:23. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая правка
 
METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse
... line 6912
// uVal := Eval( ::aColumns[ nCol ]:bData )
uVal := ::bDataEval(::aColumns[ nCol ])

uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uVal, Self )
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1313
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.07.18 21:01. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшая правка


Принято.
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1921
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.07.18 13:30. Заголовок: gfilatov2002 Из это..


gfilatov2002
Из этой же темы
 
METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse
... line 7469
::nColSpecHd := 0
// If ValType( Eval( ::aColumns[ nCol ]:bData ) ) == "L" .and. ;
If ValType( ::bDataEval( ::aColumns[ nCol ] ) ) == "L" .and. ;

::aColumns[ nCol ]:lCheckBox // virtual checkbox
::PostMsg( WM_CHAR, VK_SPACE, 0 )
ElseIf ::aColumns[ nCol ]:oEdit != Nil
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1314
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 08.07.18 18:06. Заголовок: SergKis пишет: Из э..


SergKis пишет:

 цитата:
Из этой же темы




Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 797
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 09.07.18 10:52. Заголовок: Harbour MiniGUI Exte..


Harbour MiniGUI Extended Edition 18.06 (Release)
При сборке старого проекта требует

 цитата:
Unable to open file 'HBOLE.LIB'



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1316
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.07.18 10:59. Заголовок: Vlad04 пишет: При с..


Vlad04 пишет:

 цитата:
При сборке старого проекта требует


Поскольку, по-видимому, проект собирается с помощью Ide,
рекомендую обновить HMGS-IDE по ссылке

http://www.hmgextended.com/files/HMGS-IDE/ide.zip



Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 798
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 09.07.18 12:36. Заголовок: оК! Всё нормально. И..


оК!
Всё нормально.
И ещё об использовании TsBrows для вызова справочников. Если присвоить свойство окну TopMost,
то при потере фокуса окно всё равно остается перед глазами- т.е юзер видит, что сделал что-то не то ( из двух вариантов : выбрать или закрыть )

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3772
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.07.18 08:44. Заголовок: Григорий, там в harb..


Григорий, там в harbour users group вас один товарищ разыскивает

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1319
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.07.18 21:12. Заголовок: Pasha пишет: вас о..


Pasha пишет:

 цитата:
вас один товарищ разыскивает


Спасибо, вроде Esgici уже перечислил ему мои контакты

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1923
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.18 01:46. Заголовок: Haz пишет Если интер..


Haz пишет
 цитата:
Если интересно , могу сюда сбросить скомпилированный пример, как это выглядит и исходники разумеется.


Допилил свой пример на эту тему (красоты не наводил, подключил работу с базой колонок)
Пример тут https://my-files.ru/3poc1q
Собран на последней версии hmg 18.06 + сделаны предложенные изменения !

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1924
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.18 02:20. Заголовок: Упс. С ошибкой собра..


Упс. С ошибкой собрал.
Правка (заменить)
 
*----------------------------------------------------------------------------*
FUNC Base_Country ( oParent )
*----------------------------------------------------------------------------*
...
oParent:Action := .F.

// Init TBROWSE columns
AAdd( aCols, gCols( OrdKeyNo ) )
AAdd( aCols, gCols( Land.COUNTRYNO ) )
AAdd( aCols, gCols( Land.KOD ) )
AAdd( aCols, gCols( Land.NAME ) )
AAdd( aCols, gCols( Land.ISES ) )

hFontBold := GetFontHandle('FontBold')
...

Exe тут https://my-files.ru/inivvh


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1270
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.07.18 08:56. Заголовок: SergKis пишет: Допи..


SergKis пишет:

 цитата:
Допилил свой пример на эту тему


Интересно. Приеду на работу, гляну обязательно.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1271
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.07.18 10:54. Заголовок: Haz пишет: Упс. С о..


Haz пишет:

 цитата:
Упс. С ошибкой собрал.
Правка (заменить)


Сергей, а DBF и CDX где лежат ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1926
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.18 11:49. Заголовок: Haz пишет Сергей, а ..


Haz пишет
 цитата:
Сергей, а DBF и CDX где лежат ?


Все у exe. В пером архиве все с иходниками как есть (в demo.prg заменить из поста со вторым архивом с exe, им перекрыть пред. exe). У себя в SAMPLES создаю _Test каталог и в нем каталог проект APP_OOPTsbBox и в нем все лежит

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1927
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.18 12:26. Заголовок: SergKis пишет Упс. С..


SergKis пишет
 цитата:
Упс. С ошибкой собрал.
Правка (заменить)


Еще неточность demo.ch
 
#translate sColsPrivate() => __mvPrivate( BASE_COLUMNS ) ; _CrtCols( BASE_COLUMNS )


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1272
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.07.18 12:38. Заголовок: SergKis пишет: Все ..


SergKis пишет:

 цитата:
Все у exe. В пером архиве все с иходниками как есть


Все нашел , посмотрел , компактненько получилось.
Как и у меня один момент не допилен )
Мы оба ловим позицию по вертикали и открываем справочник сверху или снизу, а вот до горизонтали руки не доходят пока и справочник может открыться за пределами экрана .
Но это из разряда "красоты" которую позже можно допилить

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1928
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.18 13:01. Заголовок: Haz пишет посмотрел..


Haz пишет
 цитата:
посмотрел , компактненько получилось


Мысль завернуть в
DEFINE TSBBOX ...
...
END TSBBOX
надо обдумать немного, в примере больше возился с базой колонок, а по горизонтали сделаю, вчера просто забыл )


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1931
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.18 17:19. Заголовок: Опять упс, прогнать ..


Опять упс, прогнать забыл Compile.bat /e /w.
Исправленный вариант https://my-files.ru/l23x4s
Пора отвалить от компа.



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1321
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.18 11:23. Заголовок: Всем кому это интере..


Всем кому это интересно

Подготовил beta 3 для новой сборки библиотеки со следующим списком изменений
Скрытый текст

Благодарю за Ваше внимание
Особая благодарность за помощь Сергею Киселеву и Игорю Назарову

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6868
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.07.18 12:06. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Олегу Назарову


gfilatov2002 пишет:

 цитата:
Contributed by Igor Nazarov


Не стыковочка

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1322
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.18 12:10. Заголовок: Dima пишет: Не стык..


Dima пишет:

 цитата:
Не стыковочка


Спасибо, поправил...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1932
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.07.18 18:31. Заголовок: gfilatov2002 Поправ..


gfilatov2002
Поправьте в примере APP_OOPTSBBOX для полноты действий
 
demo.ch
...
#translate sColsPrivate() => __mvPrivate( BASE_COLUMNS ); _CrtCols( BASE_COLUMNS )
#translate sCols( <Key>, <oCol> ) => _SetCols( <"Key">, <oCol> )

#translate sCols( <Key>, <Name>, <xVal> ) => _SetCols( <"Key">, <"Name">, <xVal> )
#translate dCols( <Key> ) => _DelCols( <"Key"> )

#translate gCols( <Key> ) => _GetCols( <"Key"> )
#translate gCols() => _GetCols()

demo_misk.prg
...
*----------------------------------------------------------------------------*
FUNC InitBaseCols()
*----------------------------------------------------------------------------*
LOCAL oCol

...
sCols( Land.ISES , nWidth , TxtWidth('Входит') )

// Для проверки, потом можно в комментарии положить или удалить
oCol := gCols( Land.ISES )
oCol:cAlias := 'CUST'

sCols( Cust.ISES, oCol )

// AEval(gCols() , {|ao,no,oc| oc:=ao[2], _LogFile(.T.,no,ao[1],oc:cAlias,oc:cName,oc:cField,oc:cData,oc:cHeading) })
// AEval(gCols(Land.), {|ao,no,oc| oc:=ao[2], _LogFile(.T.,no,ao[1],oc:cAlias,oc:cName,oc:cField,oc:cData,oc:cHeading) })
// AEval(gCols(Cust.), {|ao,no,oc| oc:=ao[2], _LogFile(.T.,no,ao[1],oc:cAlias,oc:cName,oc:cField,oc:cData,oc:cHeading) })

? '------------------------ after Add column',
AEval(gCols(Cust.), {|ao,no,oc| oc:=ao[2], _LogFile(.T.,no,ao[1],oc:cAlias,oc:cName,oc:cField,oc:cData,oc:cHeading) })

dCols( Cust.ISES )

? '------------------------ after Del column',
AEval(gCols(Cust.), {|ao,no,oc| oc:=ao[2], _LogFile(.T.,no,ao[1],oc:cAlias,oc:cName,oc:cField,oc:cData,oc:cHeading) })

RETURN Nil
...
*-----------------------------------------------------------------------------*
FUNC _DelCols( cKey, cVarName )
*-----------------------------------------------------------------------------*
LOCAL oVar
Default cVarName := BASE_COLUMNS

IF !__mvExist(cVarName); RETURN .F.
ENDIF

IF ! HB_ISOBJECT( oVar := __mvGet(cVarName) ); RETURN .F.
ENDIF

oVar:Del(cKey)

RETURN .T.

*-----------------------------------------------------------------------------*
FUNC _SetCols( cKey, cName, xVal, cVarName )
*-----------------------------------------------------------------------------*
LOCAL oVar, oCol
Default cVarName := BASE_COLUMNS

IF !__mvExist(cVarName); RETURN .F.
ENDIF

IF ! HB_ISOBJECT( oVar := __mvGet(cVarName) ); RETURN .F.
ENDIF

IF pCount() < 3
If pCount() == 2 .and. HB_ISOBJECT(cName)
oVar:Set(cKey, cName)
EndIf
RETURN .F.
ENDIF

If ! HB_ISOBJECT( oCol := oVar:Get( cKey ) ); RETURN .F.
EndIf

oCol:SetProperty( cName, xVal )

RETURN .T.

*-----------------------------------------------------------------------------*
FUNC _GetCols( cKey, cVarName )
*-----------------------------------------------------------------------------*
LOCAL oVar, aCol := {}
Default cVarName := BASE_COLUMNS

IF !__mvExist(cVarName); RETURN NIL
ENDIF

IF ! HB_ISOBJECT( oVar := __mvGet(cVarName) ); RETURN NIL
ENDIF

IF pCount() > 0

If right(cKey, 1) == '*'; cKey := left(cKey, At('.', cKey))
EndIf

If right(cKey, 1) == '.'
AEval(oVar:GetAll(), {|ac| iif( cKey $ ac[1], AAdd(aCol, AClone(ac)), Nil ) })
RETURN aCol
EndIf

RETURN oVar:Get( cKey ):Clone()

ENDIF

RETURN oVar:GetAll()
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1325
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.18 20:48. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Поправьте в примере


Что-то эти изменения "не пошли" - препроцессор ругается
Давайте лучше рабочий пример

P.S. Сам разобрался - уже работает

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1933
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.07.18 21:22. Заголовок: gfilatov2002 пишет у..


gfilatov2002 пишет
 цитата:
уже работает


На всякий случай тут https://my-files.ru/9yo3yx

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1326
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.18 21:50. Заголовок: SergKis пишет: На в..


SergKis пишет:

 цитата:
На всякий случай


Благодарю за оперативную помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1935
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.07.18 09:45. Заголовок: gfilatov2002 Добави..


gfilatov2002
Добавил в CLASS TSColumn
 
DATA cField INIT "" // FieldName column
DATA cFieldTyp INIT "" // FieldType column
DATA nFieldLen INIT 0 // FieldLen column
DATA nFieldDec INIT 0 // FieldDec column

...

Помогает плясать от этих данных а не от :bData


Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 800
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 16.07.18 19:38. Заголовок: Что-то не понял идеи..


Что-то не понял идеи.
1) При открытии справочника и выборе нужной записи, по моим понятиям, должна происходить замена данных в основной таблице ?
А ничего не происходит
2)При открытии справочника, я обычно у себя в программах, позиционирую курсор на запись равной записи основной.
Если в основной таблице - это имя "ВАСИЛИЙ", то при открытии справочника устанавливаю курсор на имя "ВАСИЛИЙ", если не найдено, то на первую запись

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1938
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.07.18 21:41. Заголовок: Vlad04 пишет Что-то ..


Vlad04 пишет
 цитата:
Что-то не понял идеи.


В каком месте, если в примере, то позиционирование и не делалось, оставлено за скобками (техника),
Так же за скобками осталось убрать заголовки окна, добавить элементы запроса для поиска (как у Haz в примере)
В примере показана работа с базой колонок (baza 1, baza 2 содержат только поля ссылок на справочники), просмотр
по ссылкам (исп. переменная колонки новая :bSeek в 2х вариантах исполнения), т.е. :LoadFields(...) не очень
подходит надо доб. описания колонок. В примере исп. созданная база кол. и для работы с base1, base2 и справочн.

Добавка в объект доп. переменных, так это для уточнений при работ с колонками.
Так имеем :bData и от него пляшем -> :nWidth, :cPicture, :nAlign ставим интуитивно, примерно ...
Если отображение через функцию в :bData (к примеру выбрать CHARSET фонта для отображения колонки
для данных только типа C), то это опять интуитивное решение, т.к. :cField можент быть выражение с CRLF.
А так можно делать проверку только для C типа поля делать, для др. нет или для других.


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1939
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.07.18 21:51. Заголовок: PS В примере base 1,..


PS
В примере base 1, base 2 - Child окна (при этом ведут себя почти как модал Parent окно не реагирует на кнопки,
пока не выйдем из окна child base1\2). base 1, base 2 можно сделать modal, при этом вызовы спр. на колонках
будут работать, они child.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1276
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 16.07.18 21:54. Заголовок: Vlad04 пишет: Что-т..


Vlad04 пишет:

 цитата:
Что-то не понял идеи


Еще идею Сергей озвучил пару страниц назад. Это вызов справочников через сообщение, это дает возможность не замораживать обработчик событий tsb на блоке bPrevEdit. Вместо записи в таблицу при выборе из справочника, ведётся лог. Так что пример Сергея как бы и о событиях.
Мой пример это кусок из проекта, там запись из справочника есть. Но все через bPrevEdit. Предупредил что пример сырой в фазе вялой доработки. Сделаны блоки bPostblock для выполнения действий после выбора и bSearch для поиска. В плане как минимум bPreBlok для действий перед показом справочника. Используя блоки можно лочить таблицу только в момент записи или установить указатель куда угодно перед показом и пр.
Ps Основная претензия к комбо, так это предварительное чтение справочника в массив. При узком канале и длинном справочнике бровс помирает при прорисовке и навигации. Так же нет поиска фильтрации, чекбоксов и прочих прелестей. У себя полностью отказался от комбо в tsb.



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1327
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.07.18 21:57. Заголовок: SergKis пишет: Доба..


SergKis пишет:

 цитата:
Добавка в объект доп. переменных


Продублировал эти дополнения

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1940
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.07.18 20:49. Заголовок: gfilatov2002 Сделал..


gfilatov2002
Сделал след. изменения
 
CLASS TSColumn
...
DATA bSeek // Optional code block to seek a column data
DATA bDecode // Charset decode or other

...
METHOD SetProperty ( cName, xVal ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, '_'+cName, xVal ), Nil )
METHOD GetProperty ( cName ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, cName ), Nil )
METHOD AddProperty ( cName, xVal ) INLINE ( iif(!__objHasData( Self, cName ), __objAddData( Self, cName ), Nil ), ;
iif( __objHasData( Self, cName ), __objSendMsg( Self, '_'+cName, xVal ), Nil ) )

...

METHOD DrawLine( xRow ) CLASS TSBrowse
...
If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) )
uData := "" // append mode for arrays
ElseIf cColAls != Nil
If Valtype( oColumn:bSeek ) == 'B'
( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) )
EndIf
uData := ( cColAls )->( Eval( oColumn:bData ) )
If Valtype( oColumn:bDecode ) == 'B'
uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) )
EndIf

Else
If Valtype( oColumn:bSeek ) == 'B'
Eval( oColumn:bSeek, Self, nJ )
EndIf
uData := Eval( oColumn:bData )
If Valtype( oColumn:bDecode ) == 'B'
uData := Eval( oColumn:bDecode, uData, Self, nJ )
EndIf

EndIf
...
METHOD DrawSelect( xRow ) CLASS TSBrowse
...
If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) )
uData := "" // append mode for arrays
ElseIf cColAls != Nil
If Valtype( oColumn:bSeek ) == 'B'
( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) )
EndIf
uData := ( cColAls )->( Eval( oColumn:bData ) )
If Valtype( oColumn:bDecode ) == 'B'
uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) )
EndIf

Else
If Valtype( oColumn:bSeek ) == 'B'
Eval( oColumn:bSeek, Self, nJ )
EndIf
uData := Eval( oColumn:bData )
If Valtype( oColumn:bDecode ) == 'B'
uData := Eval( oColumn:bDecode, uData, Self, nJ )
EndIf

EndIf
...
METHOD LoadFields( lEditable ) CLASS TSBrowse
...
ATail( ::aColumns ):cData := ::cAlias + "->" + FieldName( nE )
ATail( ::aColumns ):cName := ( ::cAlias )->( FieldName( nE ) ) // 21.07.2015
ATail( ::aColumns ):cField := ( ::cAlias )->( FieldName( nE ) ) // 08.06.2018
ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ]
ATail( ::aColumns ):nFieldLen := aStru[ nE, 3 ]
ATail( ::aColumns ):nFieldDec := aStru[ nE, 4 ]

...

Пример по исп. CHARSET фонтов тут https://my-files.ru/dofcn3
Суть примера:
U04.dbf -в дос кодировке LV866 (языки EN, LV, RU)
bk8_c.lib содержит C функцию перекодировки
Dos4W5(cString, 1) - dos -> win ansi 1251 RUSIAN_CHARSET
Dos4W5(cString, 2) - dos -> win ansi 1257 BALTIC_CHARSET
...
TSB показывает колонки в разных фонтах


Спасибо: 1 
Профиль
SergKis
постоянный участник




Пост N: 1941
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.07.18 20:58. Заголовок: PS demo_ru.prg в OEM..


PS
demo_ru.prg в OEM кодировке (опр. русских букв в dos) !!!

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1329
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.07.18 21:26. Заголовок: SergKis пишет: Сдел..


SergKis пишет:

 цитата:
Сделал след. изменения


Принято. Благодарю за помощь

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1277
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.07.18 23:30. Заголовок: SergKis пишет: пока..


SergKis пишет:

 цитата:
показывает колонки в разных фонта


Сергей, а при записи в поле все ок будет?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1942
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.07.18 23:56. Заголовок: Игорь, Надо обратную..


Игорь, Надо обратную перекодировку делать, т.е.
в edit использовать hFont с нужным charset потом перед записью делать win ansi -> dos, для LV866:
Dos4W5(cString, 6) - win ansi rusian_charset -> LV866
Dos4W5(cString, 7) - win ansi baltic_charset -> LV866
В тек. версии не пробовал, пока потребности не было, но должно работать, в VO работает схема


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1278
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.07.18 08:49. Заголовок: SergKis пишет: Надо..


SergKis пишет:

 цитата:
Надо обратную перекодировку делать


Я делал. Но перекодировки и шрифты назначались в bData.
Если поле подстановочное через bSeek или bData и хранит ID, то перекодировка не нужна в общем случае.
У меня был авто пополняемый справочник в OEM, в поле хранил ID. Поле это было редактируемо с BTNBox и при нажатии на кнопку был выбор, при редакции - запись в справочник и в поле подстановка нового ID.
Ох и намучился я с этим BTN....идея оказалась не удобной для пользователя.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1943
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.07.18 09:34. Заголовок: Haz пишет Но перекод..


Haz пишет
 цитата:
Но перекодировки и шрифты назначались в bData


:bData с перегрузом была (все в ней делать ... мучение)
Мой товарищ по работе не выдерживал и переводил VO в уникод и hmg 2.07 перевел, на ней и работаем, голова не болит.
Сейчас решил использовать наработки Андрея tsb -> Excel\OO (много новых мелких отчетов как в примере APP_OOPREPORT).
Делать настройки на них в своей версии лениво, вот и полез в тек. версию hmg с charset. Хочу утилитку сделать и запускать

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1279
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.07.18 10:52. Заголовок: SergKis пишет: вот ..


SergKis пишет:

 цитата:
вот и полез в тек. версию hmg с charset


тогда уж логичнее обойтись одной проверкой перед TSDrawCell
 
If hb_isBlock( oColumn:bDecode )
uData := Eval( oColumn:bDecode, uData, Self, nJ )
EndIf

TsDrawCell( ...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1944
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.07.18 15:22. Заголовок: Haz пишет логичнее ..


Haz пишет
 цитата:
логичнее обойтись одной проверкой перед TSDrawCell


Я тоже так сначала подумал, но опять проверять cColAls != Nil ..., поставил по веткам там где есть.
А использовать HB_ISBLOCK логичнее, наверно копипастил


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1946
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.07.18 17:21. Заголовок: gfilatov2002 Поправ..


gfilatov2002
Поправил xmlxls.lib
 
CREATE CLASS ExcelWriterXML
...
VAR cCodePage INIT ''

...
METHOD ExcelWriterXML:writeData( target )
...
xml += '<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel" />' + hb_eol()
xml += "<Styles>" + hb_eol()

If empty( ::cCodePage )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , ::cCodePage )
EndIf
// xml := hb_StrToUTF8( xml , ::cCodePage )

FWrite( handle, xml )
xml := ""

FOR EACH style IN ::styles
xml += style:getStyleXML()
NEXT
xml += "</Styles>" + hb_eol()

If empty( ::cCodePage )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , ::cCodePage )
EndIf
// xml := hb_StrToUTF8( xml , ::cCodePage )

FWrite( handle, xml )
...
xml += "</Workbook>"

If empty( ::cCodePage )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , ::cCodePage )
EndIf

// xml := hb_StrToUTF8( xml , ::cCodePage )

FWrite( handle, xml )
...
xlsxml_s.prg
CREATE CLASS ExcelWriterXML_Sheet
...
LOCAL row, rowData, rowHeight, formula
LOCAL cCdp := GetExcelWriterXMLCodePage()

...
xml += " <Table>" + hb_eol()

If empty( cCdp )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , cCdp )
Endif

// xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() )

FWrite( handle, xml )
...
xml += ' <Column ss:Index="' + colIndex + '" ss:AutoFitWidth="0" ss:Width="' + colWidth + '"/>' + hb_eol()
NEXT

If empty( cCdp )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , cCdp )
Endif

// xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() )

FWrite( handle, xml )
...
xml += " </Row>" + hb_eol()

If empty( cCdp )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , cCdp )
Endif
// xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() )

FWrite( handle, xml )
xml := ""
NEXT

xml += " </Table>" + hb_eol()
xml += "</Worksheet>" + hb_eol()

If empty( cCdp )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , cCdp )
Endif
// xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() )

FWrite( handle, xml )
...

т.е. по умолчанию работает страница уст. в программе.


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1330
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 21.07.18 18:32. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Поправил xmlxls.lib


Спасибо

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1947
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.07.18 19:08. Заголовок: gfilatov2002 SergKi..


gfilatov2002
SergKis пишет
 цитата:

...
If empty( cCdp )
xml := hb_StrToUTF8( xml )
Else
xml := hb_StrToUTF8( xml , cCdp )
Endif
// xml := hb_StrToUTF8( xml , GetExcelWriterXMLCodePage() )
...


Все проще оказалось, достаточно сделать в первоначальном варианте
 цитата:

STATIC cCp := Nil // ""


REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_CODEPAGE_UTF8

CREATE CLASS ExcelWriterXML

VAR styles INIT {}
VAR formatErrors INIT { => }
VAR sheets INIT {}
VAR lShowErrorSheet INIT .F.
VAR overwriteFile INIT .F.
VAR cCodePage INIT Nil // 'RU1251'

...


тогда тоже все работает как надо

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1331
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 21.07.18 19:43. Заголовок: SergKis пишет: Все ..


SergKis пишет:

 цитата:
Все проще оказалось




Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5983
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.18 21:15. Заголовок: Всем привет ! А библ..


Всем привет !
А библу hbole совсем выкинули из версии 18.06 ?
Больше её не будет в Харборе ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1332
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.07.18 16:17. Заголовок: Andrey пишет: hbole..


Andrey пишет:

 цитата:
hbole совсем выкинули из версии 18.06


Да, верно

Andrey пишет:

 цитата:
Больше её не будет


Нет, не будет
Функционал этой устаревшей библиотеки полностью заменяется связкой contrib библиотек hbwin + xhb

Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 802
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 30.07.18 16:49. Заголовок: hbole совсем выкинул..



 цитата:
hbole совсем выкинули из версии 18.06



Собираю НОВЫЙ проект в дизайнере.
Программа не собирается, требует hbole.
Стараы проекты собираются

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1333
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.07.18 17:25. Заголовок: Vlad04 пишет: требу..


Vlad04 пишет:

 цитата:
требует hbole


Обнови локально HMGS-IDE до версии 1.4.3.4
или
дождись новой сборки 18.07, которая выйдет завтра

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1334
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 31.07.18 09:52. Заголовок: Выпущена новая сборк..


Выпущена новая сборка 18.07 для BCC 5.51 и компиляторов Harbour и xHarbour

Базовый дистрибутив-инсталлятор находится по адресу

http://hmgextended.com/files/CONTRIB/hmg-18.07-setup.exe

Рекомендуется к использованию

Также имеются в наличии готовые сборки для:

- MinGW 8.1.0 32-bit для Harbour 3.2.0dev;

- MinGW 8.1.0 64-bit для Harbour 3.4.0dev;

- MS VisualC 2017 32-bit для Harbour 3.2.0dev;

- Borland/Embarcadero C++ 7.3 (32-bit) для Harbour 3.4.0dev (НОВАЯ!).

Благодарю за Ваше внимание и поддержку

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1954
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.08.18 13:19. Заголовок: gfilatov2002 Добави..


gfilatov2002
Добавил в класс TsBrowse переменную для использования как контейнер handle фонтов
 
DATA aFontHandle AS ARRAY INIT {}

по мне это удобнее, чем внешние переменные, к примеру вместо STATIC a_Font
 
STATIC FUNCTION TsbFont( nAt, nCol, oBrw )
LOCAL hFont, lVal //, nVar
STATIC a_Font
Default nAt := 0

If a_Font == Nil .or. pCount() == 0
a_Font := {}

AAdd( a_Font, GetFontHandle( "Font_1" ) )
AAdd( a_Font, GetFontHandle( "Font_2" ) )
AAdd( a_Font, GetFontHandle( "Font_3" ) )
AAdd( a_Font, GetFontHandle( "Font_4" ) )
AAdd( a_Font, GetFontHandle( "Font_5" ) )
AAdd( a_Font, GetFontHandle( "Font_6" ) )
AAdd( a_Font, GetFontHandle( "Font_7" ) )
...

делать
AAdd( :aFontHandle, GetFontHandle( "Font_1" ) )
AAdd( :aFontHandle, GetFontHandle( "Font_2" ) )
AAdd( :aFontHandle, GetFontHandle( "Font_3" ) )
AAdd( :aFontHandle, GetFontHandle( "Font_4" ) )
AAdd( :aFontHandle, GetFontHandle( "Font_5" ) )
AAdd( :aFontHandle, GetFontHandle( "Font_6" ) )
AAdd( :aFontHandle, GetFontHandle( "Font_7" ) )
и использовать в блоке кода от ob:aFontHandle[...]
oCol:hFont := {|nr,nc,ob| TsbFont(nr, nc, ob)}


Спасибо: 0 
Профиль
sashaBG
постоянный участник




Пост N: 193
Зарегистрирован: 15.09.05
ссылка на сообщение  Отправлено: 10.08.18 16:18. Заголовок: Пример INET_CHECKER зависает


Пример INET_CHECKER зависает после длительной больше 8 часов работы
иконка исчезает и с меню тоже неизвестно что творится .

А у меня на базе етого примера управление LetoDB прицеплено . Пришлось откатится !

Windows 7 / 32bit, проверьте пожалуйста проявляется ли ето зависание на других версиях, т.к. у меня нет возможности сейчас !

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6903
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.08.18 21:12. Заголовок: sashaBG Скорее всег..


sashaBG
Скорее всего утечка памяти

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1337
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.08.18 11:43. Заголовок: sashaBG пишет: Прим..


sashaBG пишет:

 цитата:
Пример INET_CHECKER зависает


Благодарю за сообщение об ошибке

Dima пишет:

 цитата:
утечка памяти


Да, это утечка ресурсов

Я уже поправил код обработки изменения иконки в трее (для новой сборки).
Сейчас тестирую на длительность работы...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1958
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.08.18 22:17. Заголовок: gfilatov2002 Немног..


gfilatov2002
Немного изменил
 
CLASS TSBrowse
...
// METHOD SetGetValue( xCol, xVal )
METHOD SetGetValue( xCol, xVal ) INLINE ::bDataEval( ::GetColumn( hb_defaultValue( xCol, ::nCell ) ), xVal )

METHOD SetValue( xCol, xVal ) INLINE ::SetGetValue( xCol, xVal )
METHOD GetValue( xCol ) INLINE ::SetGetValue( xCol )

METHOD bDataEval( oCol, xVal )

// METHOD bDataEval( oCol ) INLINE iif(Empty(oCol:cAlias) .or. '->' $ oCol:cField, ;
// Eval( oCol:bData ), (oCol:cAlias)->( Eval( oCol:bData ) ))
...
METHOD bDataEval( oCol, xVal ) CLASS TSBrowse
LOCAL lNoAls := Empty(oCol:cAlias) .or. '->' $ oCol:cField

If xVal == Nil // FieldGet
If lNoAls; xVal := Eval( oCol:bData )
Else ; xVal := (oCol:cAlias)->( Eval( oCol:bData ) )
EndIf
Else // FieldPut
If lNoAls; Eval( oCol:bData, xVal )
Else ; (oCol:cAlias)->( Eval( oCol:bData, xVal ) )
EndIf
EndIf

RETURN xVal

...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1338
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.08.18 09:35. Заголовок: SergKis пишет: Немн..


SergKis пишет:

 цитата:
Немного изменил


OK

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1959
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.18 09:46. Заголовок: gfilatov2002 Продол..


gfilatov2002
ПродолжениеСкрытый текст



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1960
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.18 11:29. Заголовок: gfilatov2002 И еще,..


gfilatov2002
И еще, если добавить в TsColumn
 
DATA bDecode // Charset decode or other
DATA bEncode // Charset encode or other

...
изменить
METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse
LOCAL cAlias := oCol:cAlias
LOCAL lNoAls := Empty(cAlias) .or. '->' $ oCol:cField

If xVal == Nil // FieldGet
If lNoAls; xVal := Eval( oCol:bData )
Else ; xVal := (cAlias)->( Eval( oCol:bData ) )
EndIf
Else // FieldPut
If HB_ISBLOCK(oCol:bEncode)
nCol := hb_defaultValue( nCol, ::nCell )
If lNoAls
xVal := Eval( oCol:bEncode, xVal, Self, nCol )
Else
xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol ) )
EndIf
EndIf
If lNoAls; Eval( oCol:bData, xVal )
Else ; (cAlias)->( Eval( oCol:bData, xVal ) )
EndIf
EndIf

RETURN xVal

...
METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse
...
If Eval( If( ! ::lAppendMode, bRecLock, bAddRec ), uTemp )

// Eval( ::aColumns[ nCol ]:bData, uTemp, Self )
::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 ) } )

// Eval( ::aColumns[ n ]:bData, Eval( e, Self ) ), ;
// Eval( ::aColumns[ n ]:bData, e ) ), Nil ) } )
::DrawLine()
EndIf
...
EndIf

// Eval( ::aColumns[ nCol ]:bData, uTemp )
::bDataEval( ::aColumns[ nCol ], uTemp, nCol )

SysRefresh()

If ::aColumns[ nCol ]:bPostEdit != Nil
Eval( ::aColumns[ nCol ]:bPostEdit, uTemp, Self, lAppend )
EndIf
...
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 ) } )

// Eval( ::aColumns[ n ]:bData, Eval( e, Self ) ), Eval( ::aColumns[ n ]:bData, e ) ), Nil ) } )
EndIf
::DrawLine()
EndIf
...
запись в таблицу будет проще решать при работе с CHARSET


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1961
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.18 12:07. Заголовок: PS Можно перенести в..


PS
Можно перенести в :bDataEval и :bDecode, тогда изменения такие
 
METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse
LOCAL cAlias := oCol:cAlias
LOCAL lNoAls := Empty(cAlias) .or. '->' $ oCol:cField

If xVal == Nil // FieldGet
If lNoAls; xVal := Eval( oCol:bData )
Else ; xVal := (cAlias)->( Eval( oCol:bData ) )
EndIf
If HB_ISBLOCK(oCol:bDecode) .and. nCol != Nil
If lNoAls; xVal := Eval( oCol:bDecode, xVal, Self, nCol )
Else ; xVal := (cAlias)->( Eval( oCol:bDecode, xVal, Self, nCol ) )
EndIf
EndIf

Else // FieldPut
If HB_ISBLOCK(oCol:bEncode)
nCol := hb_defaultValue( nCol, ::nCell )
If lNoAls
xVal := Eval( oCol:bEncode, xVal, Self, nCol )
Else
xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol ) )
EndIf
EndIf
If lNoAls; Eval( oCol:bData, xVal )
Else ; (cAlias)->( Eval( oCol:bData, xVal ) )
EndIf
EndIf

RETURN xVal
...
METHOD DrawLine( xRow ) CLASS TSBrowse
...
ElseIf cColAls != Nil
If HB_ISBLOCK( oColumn:bSeek )
( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) )
EndIf
uData := ::bDataEval( oColumn, , nJ )

// uData := ( cColAls )->( Eval( oColumn:bData ) )
// If Valtype( oColumn:bDecode ) == 'B'
// uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) )
// EndIf
Else
If HB_ISBLOCK( oColumn:bSeek )
Eval( oColumn:bSeek, Self, nJ )
EndIf
uData := ::bDataEval( oColumn, , nJ )

// uData := Eval( oColumn:bData )
// If Valtype( oColumn:bDecode ) == 'B'
// uData := Eval( oColumn:bDecode, uData, Self, nJ )
// EndIf
EndIf
...
METHOD DrawSelect( xRow ) CLASS TSBrowse
...
ElseIf cColAls != Nil
If HB_ISBLOCK( oColumn:bSeek )
( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) )
EndIf
uData := ::bDataEval( oColumn, , nJ )

// uData := ( cColAls )->( Eval( oColumn:bData ) )
// If HB_ISBLOCK( oColumn:bDecode )
// uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) )
// EndIf
Else
If HB_ISBLOCK( oColumn:bSeek )
Eval( oColumn:bSeek, Self, nJ )
EndIf
uData := ::bDataEval( oColumn, , nJ )

// uData := Eval( oColumn:bData )
// If HB_ISBLOCK( oColumn:bDecode )
// uData := Eval( oColumn:bDecode, uData, Self, nJ )
// EndIf
EndIf
...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1962
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.18 12:14. Заголовок: PS Пример из поста 1..


PS
Пример из поста 1940 этой темы, работает нормально https://my-files.ru/dofcn3

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1339
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.08.18 15:32. Заголовок: SergKis пишет: Можн..


SergKis пишет:

 цитата:
Можно перенести в :bDataEval и :bDecode


Выполнил предложенные изменения.
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1963
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.08.18 18:15. Заголовок: gfilatov2002 Еще не..


gfilatov2002
Еще немного поправил
 
METHOD SetGetValue( xCol, xVal ) INLINE ::bDataEval ( xCol, xVal )

METHOD SetValue( xCol, xVal ) INLINE ::SetGetValue( xCol, xVal )
METHOD GetValue( xCol ) INLINE ::SetGetValue( xCol )
...
METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse
LOCAL cAlias, lNoAls

If ! HB_ISOBJECT( oCol )
nCol := iif( HB_ISCHAR( oCol ), ::nColumn( oCol ), oCol )
oCol := ::aColumns[ nCol ]
EndIf

cAlias := oCol:cAlias
lNoAls := Empty(cAlias) .or. '->' $ oCol:cField

If xVal == Nil // FieldGet
If lNoAls; xVal := Eval( oCol:bData )
Else ; xVal := (cAlias)->( Eval( oCol:bData ) )
EndIf
If HB_ISBLOCK(oCol:bDecode) .and. nCol != Nil
If lNoAls; xVal := Eval( oCol:bDecode, xVal, Self, nCol )
Else ; xVal := (cAlias)->( Eval( oCol:bDecode, xVal, Self, nCol ) )
EndIf
EndIf
Else // FieldPut
If HB_ISBLOCK(oCol:bEncode) .and. nCol != Nil
If lNoAls; xVal := Eval( oCol:bEncode, xVal, Self, nCol )
Else ; xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol ) )
EndIf

EndIf
If lNoAls; Eval( oCol:bData, xVal )
Else ; (cAlias)->( Eval( oCol:bData, xVal ) )
EndIf
EndIf

RETURN xVal


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1340
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.08.18 20:28. Заголовок: SergKis пишет: немн..


SergKis пишет:

 цитата:
немного поправил


Принято с благодарностью

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1341
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 17.08.18 12:16. Заголовок: Всем кому это интере..


Всем кому это интересно

Подготовил первый релиз-кандидат для новой сборки библиотеки со следующим списком изменений
Скрытый текст

Благодарю за Ваше внимание

P.S. И немного о грустном:

Кузьме Скрябину сегодня исполнилось бы 50 лет...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1965
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.08.18 22:35. Заголовок: gfilatov2002 Возмож..


gfilatov2002
Возможно будет интересно (альтернатива :bData). Ввел в TsColumns DATA bValue.
Скрытый текст

Использование
 
oColum:cName := 'MET'
oColum:lChecBox := .T.
oColum:Cargo := oKeyData() // контейнер\список для recno отмеченных записей
oColum:bValue := {|xval,obrw,ncol,ocol| ;
xval := ocol:Cargo:Get((obrw:cAlias)->( RecNo() )), ;
ncol := ! empty(xval) } // .T. - при наличии в контейнере
...
oBrw:UserKeys( VK_SPACE, {|obr|
Local oCol := obr:aColumns[obr:nCell]
Local nRec
If oCol:cName == 'MET'
nRec := (obr:cAlias)->( RecNo() )
If empty(oCol:Cargo:Get(nRec)) // добавим в список
oCol:Cargo:Set(nRec, nRec)
Else
oCol:Cargo:Del(nRec) // уберем из списка
EndIf
EndIf
Return Nil
} )


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6006
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.08.18 12:23. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Подготовил первый релиз-кандидат для новой сборки библиотеки со следующим списком изменений



Что то не увидел свой пример CallDll2 ?
Старался его сделать для других, чтобы было понятно как загружать чужие и свои DLL-ки.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1342
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.08.18 17:23. Заголовок: Andrey пишет: не у..


Andrey пишет:

 цитата:
не увидел свой пример CallDll2


Верно.

Andrey пишет:

 цитата:
как загружать чужие и свои DLL-ки


В этом примере есть Харбор, Си, DLL, но очень мало собственно МиниГУИ.
Поэтому пример не вошел в следующую сборку.
Если будет интерес в использовании DLL у пользователей, то, конечно, добавлю Ваш пример

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1343
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.08.18 17:27. Заголовок: SergKis пишет: Ввел..


SergKis пишет:

 цитата:
Ввел в TsColumns DATA bValue


Принято, конечно.
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1966
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.08.18 18:15. Заголовок: SergKis пишет Испол..


SergKis пишет
 цитата:

Использование

oColum:cName := 'MET'
oColum:lChecBox := .T.
oColum:Cargo := oKeyData() // контейнер\список для recno отмеченных записей
oColum:bValue := {|xval,obrw,ncol,ocol| ;
xval := ocol:Cargo:Get((obrw:cAlias)->( RecNo() )), ;
ncol := ! empty(xval) } // .T. - при наличии в контейнере
...
oBrw:UserKeys( VK_SPACE, {|obr|
Local oCol := obr:aColumns[obr:nCell]
Local nRec
If oCol:cName == 'MET'
nRec := (obr:cAlias)->( RecNo() )
If empty(oCol:Cargo:Get(nRec)) // добавим в список
oCol:Cargo:Set(nRec, nRec)
Else
oCol:Cargo:Del(nRec) // уберем из списка
EndIf
EndIf
Return Nil
} )


все проще (по привычке смешал в кучу старое, новое)
:UserKeys не надо, достаточно :bValue
 
oCol:cAlias := "BASE"
oCol:lCheckBox := .T.
oCol:lEdit := .T.
oCol:Cargo := oKeyData()
oCol:bValue := {|xv,ob,nc,oc|
Local nRec := RecNo()
If xv == Nil
xv := ! empty(oc:Cargo:Get(nRec))
ElseIf xv
oc:Cargo:Set(nRec, nRec)
Else
oc:Cargo:Del(nRec)
EndIf
Return xv
}



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1967
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.08.18 18:35. Заголовок: gfilatov2002 пишет П..


gfilatov2002 пишет
 цитата:
Принято


Для однотипного вызова, наверно. надо поправить
 
METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse
...
If lNoAls; xVal := Eval( oCol:bDecode, xVal, Self, nCol, oCol )
Else ; xVal := (cAlias)->( Eval( oCol:bDecode, xVal, Self, nCol, oCol ) )
EndIf
...
If lNoAls; xVal := Eval( oCol:bEncode, xVal, Self, nCol, oCol )
Else ; xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol, oCol ) )
EndIf
...


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1968
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.08.18 14:07. Заголовок: Упс. Пропало, что вы..


Упс. Пропало, что выкладывал. Повторю.
gfilatov2002
У себя сделал изменения :Скрытый текст

Пример Tsb_Brw2Xml с исп. new методов (tsb4xml.prg) и hb_tsbrowse.prg тут https://my-files.ru/6fmntp


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1972
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.08.18 16:06. Заголовок: PS Правка tsb4xml.pr..


PS
Правка tsb4xml.prg
 
METHOD StyleFooter() CLASS Tsb2Xml2Xls
...
// If empty( ::nClrHead )
If empty( ::nClrFoot )
nColor := :nColorGet( oCol:nClrFootBack, i )

// nColor := :nColorGet( oCol:nClrFootBack, i )
nColor := ::StyleColor( nColor )
Else
// nColor := ::nClrHead
nColor := ::nClrFoot

EndIf
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1344
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.08.18 16:48. Заголовок: SergKis пишет: Проп..


SergKis пишет:

 цитата:
Пропало, что выкладывал. Повторю.


Благодарю за настойчивость
Изменения приняты

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6009
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.08.18 19:16. Заголовок: Если будет интерес в..


Если будет интерес в использовании DLL у пользователей, то, конечно, добавлю Ваш пример

У меня есть интерес, да думаю и другим будет интересен пример:
Как собрать свои отдельные модули в отдельной dll-ке и вызов их из главной программы ?
Причём как туда в dll-ку можно передать параметры (массив и другие) ?
Попытался сам сделать это и не смог.
Хочу свой большой проект разделить на части.
Вынести готовые (которые не подвегаются правке) модули в отделные DLL-ки.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1973
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.08.18 20:19. Заголовок: Andrey Помнится, ты..


Andrey
Помнится, ты даже одну собственную либу не хотел делать, боясь запутаться в версиях.
А тут несколько dll да еще разных версий hb, hmg, свои, ... ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6010
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.08.18 23:53. Заголовок: А тут несколько dll ..


А тут несколько dll да еще разных версий hb, hmg, свои, ... ?

Чуток разобрался с МиниГуи. Понравились отдельные dll-ки.
Вот и хочу свои dll-ки пока на МиниГуи попробовать.
Другие языки пока не нужны.
Хотелось бы в МиниГуи иметь отдельную папку с таким примером, типа CallDll3 !

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1974
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.08.18 06:13. Заголовок: Andrey пишет Другие ..


Andrey пишет
 цитата:
Другие языки пока не нужны.


Иди по пути hrb, т.е. собери exe, включив все нужные компоненты (lib + request).
Окна и алгоритмы получай в hrb. Hrb можешь включать в ресурсные dll, иметь как файлы или как в foxpro, prg и hrb с одним именем, меняем prg, запускается получение hrb и потом он выполняется.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1975
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.08.18 06:23. Заголовок: PS hrb можешь держат..


PS
hrb можешь держать в zip с паролем или без.
Собранный, полный exe можно будет менять достаточно редко.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1296
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.08.18 10:59. Заголовок: SergKis пишет: полн..


SergKis пишет:

 цитата:
полный exe можно будет менять достаточно редко.


Я не вижу принципиальной разницы что менять, exe dll hbr prg.
Все кроме prg будет лочиться системой на момент выполнения, а prg требует дополнительной компиляции.
То есть все кроме prg требует либо автоматом рубить всех пользователей либо с матами индивидуально.
Я в итоге пришёл к решению следующему. Компилируется два exe. Первый просто лончер, который запускает второй.
Первый exe имеет настройки, с каким именем запускать второй. У второго от версии к версии инкрементируется расширение.
mod.000 mod.001 и так далее. После сборки основного мода его надо закинуть в папку программы и изменить конфигурацию лончер. Всё юзеря могут работать по прежнему, могут получить уведомление о доступности нового. Для обновления потребуется перезапуск лончер и он запустит новый мод. В качестве мода можно подсунуть сервисную программу. Которая к примеру поменяет структуру баз, пересчитатает историю и много чего., а потом пропишет новый мод.
Да, лончер запустив мод, сам заканчивает работу

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1976
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.08.18 13:32. Заголовок: Haz пишет Я не вижу ..


Haz пишет
 цитата:
Я не вижу принципиальной разницы что менять, exe dll hbr prg.


Я не имел ввиду замену версии. В технике с hrb меняются в основном ресурсные dll общие или частные для конкр. клиента.
Exe один, не надо следить где какая версия dll hb, hmg и т.д. следить (лежат в тек. каталоге, у exe, в windows,...).
Кто и по какой причине (из "добрых" побуждений) подменил\ записал старую версию, перекрыв нужную ...
"Добрых" людей много как оказалось. Этого наелся с VO. В итоге оставил минимум dll один exe и все остальное в VO script и ресурсная dll, правда причина такой работы и плохая работа репозитария VO, даже в VO 2.7 такое случалось, т.е. пересобиря exe нельзя быть уверенным (не проверив), что все режимы работают.

 цитата:
Первый просто лончер, который запускает второй. Первый exe имеет настройки, с каким именем запускать второй.


Инсталяторы тоже так делают, устанавливают и запускают, что укажешь для доинсталяции.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6011
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.08.18 14:21. Заголовок: В итоге оставил мини..


В итоге оставил минимум dll один exe
Вот я и не смог сделать свою dll-ку на МиниГуи вообще .... Не получается...
Хотелось бы в МиниГуи иметь отдельную папку с таким примером, типа CallDll3 !

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1977
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.08.18 15:03. Заголовок: Andrey пишет Вот я и..


Andrey пишет
 цитата:
Вот я и не смог сделать свою dll-ку на МиниГуи вообще


В VO dll в поставке, а ты хочешь выделить принудительно, а оно надо ?
По мне - не надо. Лучше на технологию hrb потрать время - это будет аналог dll

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1978
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.08.18 10:28. Заголовок: gfilatov2002 Делал ..


gfilatov2002
Делал для себя константы цветов.
Цветовая гамма на сайта https://colorscheme.ru/html-colors.html
Может пригодятся Скрытый текст


Спасибо: 0 
Профиль
ММК
постоянный участник


Пост N: 338
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 26.08.18 11:40. Заголовок: Andrey пишет: Вот я..


Andrey пишет:

 цитата:
Вот я и не смог сделать свою dll-ку на МиниГуи вообще .... Не получается...



А зачем? Что это дает?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6012
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.18 13:13. Заголовок: А зачем? Что это дае..


А зачем? Что это дает?
1) Чтобы уметь так же делать.
2) Разбить свой проект на части и неизменяемые программы держать в dll-ке.
У некоторых юзеров слабый инет, качать приходиться много, ехе-ник весит 18 мб.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6013
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.18 13:17. Заголовок: 3) Для других проект..


3) Для других проектов, где лазят шустрые ручки юзеров, лончер сделать через ехе-ник, а основную прогу через dll-ку.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6014
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.18 13:27. Заголовок: Вот сделал пробный п..


Вот сделал пробный проект - https://cloud.mail.ru/public/4X4S/v4CZmKyru
dll-ка собирается (Григорий давно давал ключи сборки), а вызов из demo.exe не получается.
Что не так делаю ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1979
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.08.18 15:34. Заголовок: Andrey пишет У некот..


Andrey пишет
 цитата:
У некоторых юзеров слабый инет, качать приходиться много, ехе-ник весит 18 мб.


Dll также будет грузиться на клиента, быстрее не будет чем с exeшником. а с hrb скорее всего будет, т.к это внешний файл\ресурс, ты сам читаешь только тот кусок, который надо выполнить.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1980
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.08.18 15:40. Заголовок: PS А.КресинИ еще оди..


PS
А.Кресин
 цитата:
И еще один интересный момент. Я уже отмечал, что hrb файлы очень похожи по функциональности на p-code dll. И действительно, функция hb_hrbLoad() загружает p-code в пространство вашего приложения так же, как функция hb_libLoad() подгружает динамическую библиотеку. А значит, функции из hrb файла можно вызывать таким же образом, т.е. напрямую, без всяких hb_hrbGetFunsym() и Do(). Для этого, как и в случае с использованием p-code dll, надо предварительно объявить эти функции в вашем приложении как DYNAMIC:

?
1
2
3
4
5
6
7
8
DYNAMIC HRBFUNC1
FUNCTION Main()
Local x, handle := hb_hrbLoad( "my.hrb" )

x := hrbFunc1() // hrbFunc1 - функция из my.hrb

hb_hrbUnload( handle )
Return Nil



Спасибо: 0 
Профиль
PSP
постоянный участник


Пост N: 1472
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.08.18 17:10. Заголовок: + за hrb еще в том, ..


+ за hrb еще в том, что этот формат зависит только от компилятора harbour и больше ни от чего. Компилятор С не имеет значения.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6015
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.18 17:41. Заголовок: Dll также будет груз..


Dll также будет грузиться на клиента, быстрее не будет чем с exeшником
Не буду грузить Dll-ку при обновлении, она будет постоянной. Один раз загружу и всё.
Насчет hrb - согласен, интересное решение.
Но до перехода к нему хотелось бы научиться делать свои dll-ки на МиниГуи.

Спасибо: 0 
Профиль
ММК
постоянный участник


Пост N: 339
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 26.08.18 19:54. Заголовок: Andrey пишет: А зач..


Andrey пишет:

 цитата:
А зачем? Что это дает?
1) Чтобы уметь так же делать.


Похвально ...
Andrey пишет:

 цитата:
2) Разбить свой проект на части и неизменяемые программы держать в dll-ке.
У некоторых юзеров слабый инет, качать приходиться много, ехе-ник весит 18 мб.



В такой ситуации удобнее держать в dll все то , что может отличаться для разных пользователей т.к не требует перестроения (пересылки) и может меняться прямо на месте ( картинки, экраны, формы... )

Andrey пишет:

 цитата:
3) Для других проектов, где лазят шустрые ручки юзеров, лончер сделать через ехе-ник, а основную прогу через dll-ку.



удивлен

Andrey пишет:

 цитата:
dll-ка собирается (Григорий давно давал ключи сборки), а вызов из demo.exe не получается.
Что не так делаю ?



Вот Вам примерчик на FW , может поможет. Как dll собирается Вы еже знаете - пропустим.

Вот эту пр-му "грузим" в Dll -

#include "FiveWin.ch"

static hDLL

function Main()

local hItem1 := ItemNew( "Hello world!" )
local hItem2 := ItemNew( "From a Harbour DLL" )

hDLL = LoadLibrary( "babudll.dll" )

MsgInfo( ExecuteAll() )

HbDllEntry( "TEST" )

HbDLLEntry2( "TEST2", hItem1, hItem2 )

ItemRelease( hItem1 )
ItemRelease( hItem2 )

MsgInfo( "back from EXE" )

FreeLibrary( hDLL )

return nil

DLL FUNCTION HBDLLENTRY( cProc AS LPSTR ) AS LONG PASCAL LIB hDLL

DLL FUNCTION HBDLLENTRY2( cProc AS LPSTR, pItem1 AS LONG, pItem2 AS LONG ) AS LONG PASCAL LIB hDLL

DLL FUNCTION ExecuteAll() AS BOOL PASCAL LIB hDLL

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbapiitm.h>

HB_FUNC( ITEMNEW )
{
hb_retnl( ( unsigned long ) hb_itemNew( hb_param( 1, HB_IT_ANY ) ) );
}

HB_FUNC( ITEMRELEASE )
{
hb_retl( hb_itemRelease( ( PHB_ITEM ) hb_parnl( 1 ) ) );
}


*******************************************
А вот та , которая работает с этой Dll
*********************************************
function Test()

MsgInfo( "Hello from inside the DLL!" )

return .T.

function Test2( cMsg1, cMsg2 )

MsgInfo( cMsg1, cMsg2 )

return nil

function CheckPassword()

MsgInfo( "Inside CheckPassword()" )

return .T.

#pragma BEGINDUMP

#include <windows.h>
#include <hbvm.h>
#include <hbapiitm.h>

BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved )
{
HB_SYMBOL_UNUSED( hinstDLL );
HB_SYMBOL_UNUSED( fdwReason );
HB_SYMBOL_UNUSED( lpvReserved );

switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
MessageBox( 0, "DLL properly loaded", "DLL entry", 0 );
hb_vmInit( FALSE );
break;

case DLL_PROCESS_DETACH:
MessageBox( 0, "DLL unloaded", "DLL exit", 0 );
break;
}

return TRUE;
}

void pascal __export HBDLLENTRY( char * cProcName )
{
hb_itemDoC( cProcName, 0 );
}

void pascal __export HBDLLENTRY2( char * cProcName, PHB_ITEM pParam1, PHB_ITEM pParam2 )
{
hb_itemDoC( cProcName, 2, pParam1, pParam2 );
}

BOOL __stdcall __export ExecuteAll( void )
{
PHB_ITEM pResult = hb_itemDoC( "CHECKPASSWORD", 0 );

return pResult->item.asLogical.value;
}

Спасибо: 0 
Профиль
ММК
постоянный участник


Пост N: 340
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 26.08.18 20:07. Заголовок: Прошу прощения. Пер..


Прошу прощения. Первая Exe , вторая в Dll :) Жарко ....

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6017
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.18 14:31. Заголовок: Привет всем ! Оказыв..


Привет всем !
Оказывается сейчас в МиниГуи нельзя собрать отдельную DLL-ку.
Григорий мне ответил что:
из-за изменений в ядре библиотеки, проведенных за последние 3 года, это не работает.
Поскольку интереса к этой теме не было, замечаний от пользователей тоже не поступало.

То есть я один такой желающий...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1983
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.08.18 10:15. Заголовок: gfilatov2002 Добавь..


gfilatov2002
Добавьте, пожалуйста, метод
 
CLASS TKeyData
...
METHOD Del( Key ) INLINE ( iif( ::Len > 0, hb_HDel ( ::aKey, Key ), ), ::lKey := Len( ::aKey ) > 0 )
METHOD Pos( Key ) INLINE hb_HPos( ::aKey, Key )

...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1345
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 29.08.18 12:41. Заголовок: SergKis пишет: Доба..


SergKis пишет:

 цитата:
Добавьте, пожалуйста, метод


Сделал.

Кстати.
Завершена подготовка финальной версии сборки 18.08, которая будет опубликована завтра.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1346
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.08.18 10:14. Заголовок: Выпущена новая сборк..


Выпущена новая сборка 18.08 для BCC 5.51 и компиляторов Harbour и xHarbour

Базовый дистрибутив-инсталлятор находится по адресу

http://hmgextended.com/files/CONTRIB/hmg-18.08-setup.exe

Рекомендуется к использованию

Также имеются в наличии готовые сборки для:

- MinGW 8.1.0 32-bit для Harbour 3.2.0dev;

- MinGW 8.1.0 64-bit для Harbour 3.4.0dev;

- MS VisualC 2017 32-bit для Harbour 3.2.0dev;

- Borland/Embarcadero C++ 7.3 (32-bit) для Harbour 3.4.0dev.

Они доступны для тех, кто поддержал материально сопровождение библиотеки

Выпуск новых сборок в ближайшее время НЕ планируется...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1984
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.08.18 10:48. Заголовок: Может пригодится ком..


Может пригодится кому.
Немного модифицировал пример Tsb_brw2Xml, добавил обработку цвета фонта в меню "Export to Excel (xml-files) 2"
Пример тут (hmg 18.08) https://my-files.ru/o226gf

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1347
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.08.18 11:11. Заголовок: SergKis пишет: Немн..


SergKis пишет:

 цитата:
Немного модифицировал пример Tsb_brw2Xml


Спасибо
Очень качественная модификация

P.S. Я сделал "тихое" обновление сборки 18.08, чтобы включить в нее Вашу модификацию и дополнения Aндрея для примера эспорта данных из TSBrowse

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1348
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 31.08.18 11:48. Заголовок: Выложил 1-й апдейт с..


Выложил 1-й апдейт сборки 18.08 со следующим списком изменений:

 цитата:
2018/08/31: HMG Extended Edition version 18.08 (Update 1). 
* Fixed: A problem with defining of the columns in a TBROWSE control
(introduced in the build 18.06).
Bug was reported by Henry Herrera.
Contributed by Grigory Filatov <gfilatov@inbox.ru>
* Updated: 'TSBrowse Export data to a XLS/XML file' sample:
- added a color's management in the class Tsb2Xml2Xls.
Contributed by Sergej Kiselev
(see Tsb4xml.prg in folder \samples\Advanced\Tsb_Brw2xml)
* Updated: 'TSBrowse Export data to XLS/XML/DOC/DBF files' sample:
- added an export of a logo picture and subtitle of a table
for XLS and DOC formats.
Contributed by Verchenko Andrey <verchenkoag@gmail.com>
(see in folder \samples\Advanced\Tsb_Export)


Так что тихого обновления не вышло...

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1300
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.09.18 16:33. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Выпущена новая сборка 18.08 для BCC 5.51 и компиляторов Harbour и xHarbour


Не собрался текущий проект ругается на библиотеки SSL ( не находит половину вызовов )
Если libeay32.lib и ssleay32.lib взять с предыдущей версии , то все собирается
PS к Минигуи проблема скорее не относится, это скорее к харбору , НО в поставке МиниГуи

вот пример ( собирается с библиотеками из прошлой поставки и не собирается с новой )

TEST.PRG
 
#require "hbssl"
#require "hbtip"

REQUEST __HBEXTERN__HBSSL__

#include "simpleio.ch"

PROCEDURE Main( cFrom, cPassword, cTo )

IF ! tip_SSL()
? "Error: Requires SSL support"
wait
RETURN
ENDIF

hb_default( @cFrom , "test@yandex.ru" )
hb_default( @cPassword, "parol" )
hb_default( @cTo , "mail@mail.ru" )

? hb_SendMail( ;
"smtp.yandex.ru", ;
465, ;
cFrom, ;
cTo, ;
NIL /* CC */, ;
{} /* BCC */, ;
"It is a test message", ;
"It is a test subject", ;
NIL /* attachment */, ;
cFrom, ;
cPassword, ;
"", ;
NIL /* nPriority */, ;
NIL /* lRead */, ;
.T. /* lTrace */, ;
.F., ;
NIL /* lNoAuth */, ;
NIL /* nTimeOut */, ;
NIL /* cReplyTo */, ;
.T. )
wait
RETURN


BUILD.BAT
 
echo off
if not defined MG_ROOT set MG_ROOT=C:\MiniGui
if not defined MG_BCC set MG_BCC=c:\borland\bcc55
set PATH=%MG_BCC%\bin;%MG_ROOT%\harbour\bin;%PATH%

C:\MiniGui\Harbour\bin\hbmk2 -lhbtip -lhbssl -llibeay32 -lssleay32 test.prg


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1349
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.09.18 19:54. Заголовок: Haz пишет: Если lib..


Haz пишет:

 цитата:
Если libeay32.lib и ssleay32.lib взять с предыдущей версии , то все собирается


Благодарю за сообщение
Забыл обновить эти библиотеки вручную - доверился сборке Харбора
Завтра поправлю эту бяку в архиве на сайте минигуи...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1350
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.09.18 09:54. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Завтра поправлю эту бяку


Поправил установщик и архив на сайте

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1301
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.09.18 10:26. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Поправил установщик и архив на сайте


Спасибо, все нормально собирается

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6024
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.09.18 22:36. Заголовок: Привет ! Что то слом..


Привет !
Что то сломалось в новой версии. Вот код перестал работать:
 
hWnd := GetFormHandle('Win_2')
ON KEY PRIOR ACTION SendMessage( hWnd, WM_VSCROLL, SB_PAGEUP, 0 )
ON KEY NEXT ACTION SendMessage( hWnd, WM_VSCROLL, SB_PAGEDOWN, 0 )
ON KEY UP ACTION SendMessage( hWnd, WM_VSCROLL, SB_LINEUP, 0 )
ON KEY DOWN ACTION SendMessage( hWnd, WM_VSCROLL, SB_LINEDOWN, 0 )

Т.е. по мышке движения есть, а по клавишам нет.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1351
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.09.18 18:57. Заголовок: Andrey пишет: код п..


Andrey пишет:

 цитата:
код перестал работать


Заменил в примере строку

 цитата:
hWnd := GetFormHandle(cForm)


на

 цитата:
hWnd := GetFormHandle(ThisWindow.Name)


и стрелки заработали

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6025
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.18 20:22. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Заменил в примере строку


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1989
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.09.18 11:14. Заголовок: gfilatov2002 Поправ..


gfilatov2002
Поправил HbXlsXml
 
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
...

Так же пример Tsb_Brw2xm: https://my-files.ru/ntptz7
Убрал неточности copy+paste, почистил и чуть добавил (до title, picture в numeric, ...)

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1352
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.09.18 13:27. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Поправил


Спасибо за исправления

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2020
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.18 16:49. Заголовок: gfilatov2002 В мето..


gfilatov2002
В методе :DeleteRow( lAll ) у себя обнаружил (может будет полезным)
 
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
...

действия до удаления и после при удачном блокировании записи

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1315
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.09.18 20:58. Заголовок: SergKis пишет: DATA..


SergKis пишет:

 цитата:
DATA bDelBefore // evaluated before user deletes. if RLock mode
DATA bDelAfter


Сергей, может и bAddBefore и After? Для заполнения ключей при добавлении в подчиненную базу.
Сейчас пользуюсь самописной db_Append( cAlias ) и db_Delete( cAlias ). В них по имени алиаса' условно заполняются ключи при добавлении или при удалении записи в мастер таблице, удаляю соответствующие в подчиненных

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2021
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.18 21:11. Заголовок: Haz пишет может и bA..


Haz пишет
 цитата:
может и bAddBefore и After? Для заполнения ключей при добавлении в подчиненную базу


Согласен, это лучше чем самопалис.
По текстам только надо полазить

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2022
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.18 21:28. Заголовок: PS есть одно но, не ..


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

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1316
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.09.18 22:11. Заголовок: SergKis пишет: Или ..


SergKis пишет:

 цитата:
Или еще что то есть


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2023
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.18 22:45. Заголовок: Haz пишет Значит ра..


Haz пишет
 цитата:
Значит раз есть ::deleterow() то логично и ::appendrow()


Нет этого. Только есть
 
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
...

:AppendRow() похоже строгать надо

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1317
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.09.18 08:04. Заголовок: SergKis пишет: Appe..


SergKis пишет:

 цитата:
AppendRow() похоже строгать надо


Сегодня днем напишу

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2024
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.09.18 08:46. Заголовок: Haz пишет Сегодня дн..


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


Ok

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1318
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.09.18 12:52. Заголовок: -SergKis пишет: :App..


SergKis пишет:

 цитата:
:AppendRow() похоже строгать надо




 
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

-

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2025
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.09.18 15:32. Заголовок: Haz немного поправи..


Haz
немного поправил Скрытый текст


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1320
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.09.18 17:17. Заголовок: SergKis пишет: немн..


SergKis пишет:

 цитата:
немного поправил


Да, так лучше

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1353
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.09.18 17:53. Заголовок: SergKis пишет: немн..


SergKis пишет:

 цитата:
немного поправил


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2027
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 06:54. Заголовок: Попробовал исп. :App..


Попробовал исп. :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 все оч. быстро
Это только у меня так ?
Или что то упущено ?

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1321
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 10:14. Заголовок: SergKis пишет: Тест..


SergKis пишет:

 цитата:
Тест. приме


Рассмешило

Author: Igor Nazarov + Verchenko Andrey <verchenkoag@gmail.com>
#define COPYRIGHT "(c) Copyright by Andrey Verchenko. Dmitrov, 2018."

Серега , тебя забыли что ты тут вообще делаешь ?
Или всеже не Author а Publisher



Если по примеру, то бровс рассинхронизирован после рекола, сейчас гляну как починитть
или так в методе
 
If HB_ISLOGICAL(xRet) .and. ! xRet
SysRefresh()
::nLen := ( cAlias )->( Eval( ::bLogicLen ) )
::Upstable()
::SetFocus()
::Refresh(.T., .T.)

RETURN lAdd
EndIf


или озаботиться этим в bAddBefore

PS и кстати , по поводу проверки запусков программы.
Мне больше нравится WMI - стандартный инструмент менеджмента винды. Незаслуженно неиспользуемый , но дающий куда больше информации.
Да, он не супер быстрый , но если это разовый вызов то время приемлемо.
К примеру консолька ( написанная прямо тут без теста ) в параметре указать часть Caption процесса и она покажет все
 
#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



например demo host выдаст все процессы со словом host

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1322
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 10:47. Заголовок: Haz пишет: If HB_I..


Haz пишет:

 цитата:
If HB_ISLOGICAL(xRet) .and. ! xRet
SysRefresh()
::nLen := ( cAlias )->( Eval( ::bLogicLen ) )
::Upstable()
::SetFocus()
::Refresh(.T., .T.)
RETURN lAdd
EndIf


Поправочка - это для ::isDbf не хватает этого условия

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2028
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 10:50. Заголовок: Haz пишет Или всеже ..


Haz пишет
 цитата:
Или всеже не Author а Publisher


Меня это давно как то совсем не трогает.

 цитата:
сейчас гляну как починитть


Что то со сранья сам не сообразил.
Возможно надо
1. перенести перепоказ после :bAddAfter
2. параметр надо добавить lUnLock и перед return делать unlock

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1323
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 10:53. Заголовок: SergKis пишет: Меня..


SergKis пишет:

 цитата:
Меня это давно как то совсем не трогает.


Трогает трогает Половина кода в примерах твоя

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1354
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.09.18 11:31. Заголовок: Всем кому это интере..


Всем кому это интересно

Подготовил второй релиз-кандидат для новой сборки библиотеки со следующим списком изменений
Скрытый текст

Вероятно, это будет последняя сборка для компилятора BCC 5.51,
поскольку поддержка Win 98 уже никому не интересна

Сейчас выбираю другой компилятор из

- бесплатного Embarcadero C++ 10.1 (32-bit)
- платного Embarcadero C++ 7.3 (32-bit)
- всем известного MinGW 8.1.0

и склоняюсь ко второму варианту

Ваше мнение

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2029
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 11:37. Заголовок: Вот поправил вариант..


Вот поправил вариант :AppendRow() Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2030
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 11:49. Заголовок: PS правка If HB..


PS правка
 
If HB_ISBLOCK( ::bAddBefore )
xRet := Eval( ::bAddBefore, Self )
If HB_ISLOGICAL(xRet) .and. ! xRet
If ::lIsDbf
cAlias := ::cAlias
EndIf

lUps := .T.
// RETURN lAdd
EndIf
EndIf


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1324
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 12:27. Заголовок: SergKis пишет: If ..


SergKis пишет:

 цитата:
If lUps

If ::lIsDbf
SysRefresh()
::nLen := ( cAlias )->( Eval( ::bLogicLen ) )
::Upstable()
::Refresh(.T., .T.)
ElseIf ::lIsArr
SysRefresh()
::nLen := Len( ::aArray )
::nAt := ::nLen
::nRowPos := ::nRowCount()
::Refresh(.T., .T.)
EndIf

EndIf




Тогда так
 

If lUps
SysRefresh()
If ::lIsDbf
::nLen := ( cAlias )->( Eval( ::bLogicLen ) )
::Upstable()
ElseIf ::lIsArr
::nLen := Len( ::aArray )
::nAt := ::nLen
::nRowPos := ::nRowCount()
EndIf
::Refresh(.T., .T.)
End


Но это уже так - перестановка слагаемых ...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2031
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 12:28. Заголовок: PPS Как бы работает,..


PPS
Как бы работает, но при :nLen < :nRowCount() перепоказ передергивает курсор через 1ый :nRowPos
Моргание наблюдается

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2032
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 12:31. Заголовок: Haz пишет перестанов..


Haz пишет
 цитата:
перестановка слагаемых ...


Оптимизация всегда приветствуется

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1325
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 13:32. Заголовок: SergKis пишет: Как ..


SergKis пишет:

 цитата:
Как бы работает, но при :nLen < :nRowCount() перепоказ передергивает курсор через 1ый :nRowPos
Моргание наблюдается


Это Upstable() .... можно с цветами поиграть

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2033
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 13:49. Заголовок: Haz пишет Это рефреш..


Haz пишет
 цитата:
Это рефреш .... можно с цверами поиграть


Это понятно, откуда ноги растут.
Играть получается надо для фокуса и не в фокусе, оба возможны.
Сохранять, ставить CLR_PANE для них, потом восстанавливать ...
Словом еще побороться надо. Я пока отваливаюсь, у клиента бяка вылезла - разбираться надо.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1326
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 13:52. Заголовок: SergKis пишет: Это ..


SergKis пишет:

 цитата:
Это понятно, откуда ноги растут.


Закоменти UPstable() ВРОДЕ ОН ЛИШНИЙ

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2034
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 13:59. Заголовок: Игорь Пробнул, без н..


Игорь
Пробнул, без него (+) 11 строка становится 5 дальше пол экрана тсб пусто
Все убежал. нет времени

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1327
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 14:01. Заголовок: STATIC FUNCTION Recn..


STATIC FUNCTION RecnoRefresh(oBrw) Полная шляпа , при удалении записи в одной из запущеных копий - начинаются чудеса в других

на вскидку предлагаю так
 
STATIC FUNCTION RecnoRefresh(oBrw)
LOCAL nRecno, nRowPos
LOCAL lEdit := .F.
LOCAL nSkip := 0

AEVAL( oBrw:aColumns, { |o| if( !Empty(o:oEdit), lEdit := .T., NIL ) })

If !lEdit .and. oBrw:nLen <> Eval(oBrw:bLogicLen)
nRowPos := oBrw:nRowPos
nRecno := (oBrw:cAlias)->(RecNo())
oBrw:SetFocus()
oBrw:Reset()
(oBrw:cAlias)->(dbGoTo(nRecNo))
nSkip := 1-nRowPos
oBrw:Skip(nSkip)
oBrw:Refresh(.t., .t.)
oBrw:nRowPos := nRowPos
DO EVENTS
EndIf

RETURN Nil



и таймер установить на секунду
DEFINE TIMER Timer_1 INTERVAL 1000 ACTION RecnoRefresh(oBr)

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6053
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.09.18 17:24. Заголовок: Haz пишет: и таймер..


Haz пишет:

 цитата:
и таймер установить на секунду


Это круто на секунду. Каждую секунду проверят ?
Хотябы 15 секунд и то хоть легче компу и сети.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2035
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.18 17:24. Заголовок: SergKis пишет Сохран..


SergKis пишет
 цитата:
Сохранять, ставить CLR_PANE для них, потом восстанавливать ...


Сделал вариант с цветами, вроде не мелькает Скрытый текст

Пример на этом варианте https://my-files.ru/u2zy55
Haz пишет
 цитата:
STATIC FUNCTION RecnoRefresh(oBrw) Полная шляпа


Андрей хотел его временно, на время отладки, потом убрать.
В примере заменил, на вскидку по быстрому.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1328
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.09.18 17:31. Заголовок: Andrey пишет: Это к..


Andrey пишет:

 цитата:
Это круто на секунду. Каждую секунду проверят ?


Исходник глянь. Как там сделано

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2036
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.09.18 07:14. Заголовок: SergKis пишет Сделал..


SergKis пишет
 цитата:
Сделал вариант с цветами, вроде не мелькает


Попробовал в :AppendRow() оставить только строки для :lNoGray - оказалось этого достаточно убрать мелькание.
Так что строки сохранения\восстановления цветов убрал

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2037
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.09.18 07:34. Заголовок: gfilatov2002 пишет и..


gfilatov2002 пишет
 цитата:
и склоняюсь ко второму варианту
Ваше мнение


Думаю это конец hmg, за плату лучше FW.
У нас:
- печать своя
- работа с excel своя
- почта своя
- pdf свое
- letodb
- hmg 2.07 от 2012 unicode
все на vc8
Тек. версию исп. для информации и предложений (проба, отладка) из своей версии иногда из тек. в свою.
В основном это тсб, т.к. у себя еще 90% работа на переделанном browse.
Новое делается с исп. тсб, т.к. уверенность в тсб стабильной работе появилась не так давно.
Использование "платного Embarcadero C++ 7.3 (32-bit)" не интересно.
MinGw то же под вопросом.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1329
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.09.18 10:27. Заголовок: SergKis пишет: Испо..


SergKis пишет:

 цитата:
Использование "платного Embarcadero C++ 7.3 (32-bit)" не интересно.
MinGw то же под вопросом.


Тоже склоняюсь к тому ,что переход на платный компилятор не убъет но убавит интерес к hmg, тем более что кардинальных преимуществ с переходом с 5 на 7 нет.

Среди коммерческих продуктов тогда уж точно выбор перетянет FW или менее известный Xailer

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1355
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 21.09.18 11:13. Заголовок: Haz пишет: переход ..


Haz пишет:

 цитата:
переход на платный компилятор не убъет но убавит интерес к hmg


Благодарю за Ваши комментарии.

SergKis пишет:

 цитата:
Использование "платного Embarcadero C++ 7.3 (32-bit)" не интересно.


Я забыл уточнить, что речь идет об усеченной версии для командной строки,
которая сейчас активно используется пользователями FW.
Она доступна для всех по адресу:
http://xharbour.org/index.asp?page=download/windows/required_win

SergKis пишет:

 цитата:
MinGw то же под вопросом.


Если возможно, просветите, какие вопросы есть к MinGW, ведь он достаточно стабилен и постоянно развивается

SergKis пишет:

 цитата:
все на vc8


У меня готово решение для бесплатного Microsoft Visual C++ 2017 Community Edition,
но никак не удается подружить его с библиотекой BosTaurus.
Возможно, Вы сможете помочь в этом?
Тогда можно будет рассмотреть вариант перехода на VC

Благодарю за Ваше внимание и последние доработки метода AppendRow()

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2038
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.09.18 12:38. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
просветите, какие вопросы есть к MinGW


Да только один, не сталкивался с ним по жизни, т.е. продукт с 0.
Т.е. если надо на него идти, то должна быть веская причина, к примеру, hmg unicod.

 цитата:
речь идет об усеченной версии для командной строки,
которая сейчас активно используется пользователями FW


Делает это ее и продукты из нее free в использовании. А то что работают пользователи FW ...,
но у нас не FW. Если бы FW был unicode ...

 цитата:
но никак не удается подружить его с библиотекой BosTaurus


Помочь не смогу, т.к. не использую и смотрел чисто поверхностно для понимания "для чего", если что.
Hmg подходит из за небольшого числа gui контролов для работы в unicod.
Переход на тек. версии затруднителен, т.к. больше контролов и нет mdi и нет времени и сил на новый "поход" в unicod.
А того, что есть в hmg 2.07 (gui контролов) вполне достаточно для работы с табличной базой.
"От добра добра не ищут"

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6054
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.09.18 13:20. Заголовок: Пропустил и не читал..


Пропустил и не читал.
Haz пишет:

 цитата:
Серега , тебя забыли что ты тут вообще делаешь ?


Я добавлял его копирайт, только он почему то старый пример выложил.
Исправьте теперь сами, у меня уже пример устаревший.

Haz пишет:

 цитата:
Трогает трогает Половина кода в примерах твоя


Да, без помощи Сергея я бы вообще в МиниГуи не продвинулся !
Большое спасибо тебе !

Спасибо: 0 
Профиль
ММК
постоянный участник


Пост N: 344
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 21.09.18 16:11. Заголовок: SergKis пишет: но у..


SergKis пишет:

 цитата:
но у нас не FW. Если бы FW был unicode ...


При желании можно попробовать вот так -

FW_SetUnicode(.T.)

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1330
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.09.18 17:00. Заголовок: Andrey пишет: Я доб..


Andrey пишет:

 цитата:
Я добавлял его копирайт, только он почему то старый пример выложил.


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

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6055
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.09.18 17:06. Заголовок: Да мне тоже особо бе..


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

Так какой последний вариант получился ?
Где его скачать можно ?

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1331
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.09.18 17:14. Заголовок: Andrey пишет: Так к..


Andrey пишет:

 цитата:
Так какой последний вариант получился ?
Где его скачать можно ?

В последнем посте Сергея по теме , вроде Григорий его включил в сборку.
ЗЫ и попробуй мой вариант RefreshRecord() с 1 секундой при нескольких запущенных копиях. потом оригинальный с 30 секундами.
суть в том что удаляя записи в одном окне , рушится навигация в других.

PS Dima
Можешь это и другой флуд в "для флейма " перекинуть

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6928
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.09.18 17:48. Заголовок: Haz пишет: Можешь э..


Haz пишет:

 цитата:
Можешь это и другой флуд в "для флейма " перекинуть


Облом ковырять 10 страниц
Пусть тут живет.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2039
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.09.18 18:08. Заголовок: ММК пишет При желани..


ММК пишет
 цитата:
При желании можно попробовать вот так -
FW_SetUnicode(.T.)


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2040
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 07:05. Заголовок: Игорь, вспомнил про ..


Игорь, вспомнил про твой пример Tsb_filter, может по аналогии c :AppendRow, :DeleteRow сделать :FilterRow
 
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


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2041
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 07:07. Заголовок: PS nLen := 0 убрать..


PS
nLen := 0 убрать

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1332
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 08:04. Заголовок: SergKis пишет: Filt..


SergKis пишет:

 цитата:
FilterRow

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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2042
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 09:07. Заголовок: Haz пишет Но вроде т..


Haz пишет
 цитата:
Но вроде такое есть, надо вспомнить почему я это не использую))


вариант фильтра по видимым, строковым полям тсб, может пойдет Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2043
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 09:15. Заголовок: Haz пишет А вот Clon..


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


Тут надо указывать какие поля\колонки исп. в прцессе, т.к. ключевые и расчетные не участвуют

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2044
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 09:50. Заголовок: PS CloneRow может за..


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2045
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 09:57. Заголовок: Haz пишет скорее не..


Haz пишет
 цитата:
скорее не FilterRow a SetFilter тк относится не к одной строке. Но вроде такое есть


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

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1333
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 10:02. Заголовок: SergKis пишет: Унив..


SergKis пишет:

 цитата:
Универсальной ситуевины не просматривается - все по месту
Мне так видится


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2046
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 10:21. Заголовок: Haz пишет Как правил..


Haz пишет
 цитата:
Как правило Clone идёт в ту же таблицу


Я исп. функции Скрытый текст

т.е. читаю в oRec := (cAlias)->( GetRec() )
заменяю значения в нужных полях на новые
oRec:Set('FieldName5', 'abcde')
...
(cAlias)->( dbAppend() )
(cAlias)->( RecPut(oRec) )
С :AppendRow ставим :bAddAfter := {|obr,ladd| iif( ladd, (ob:cAlias)->( PutRec(oRec) ) }

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2047
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 10:26. Заголовок: PS AutoIncrement пол..


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

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2048
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 12:05. Заголовок: Haz пишет Как правил..


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


На методе :AppendRow() не сложно получается в итоге Скрытый текст


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1334
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 12:42. Заголовок: SergKis пишет: На м..


SergKis пишет:

 цитата:
На методе :AppendRow() не сложно


Кстати да

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1335
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 12:46. Заголовок: SergKis пишет: oBrw..


SergKis пишет:

 цитата:
oBrw:cAlias)->(DbCommit())


В сети вместо этого использую dbskip(0)
Это гарантированно сбрасывает буфер записи. Commit у меня работал четез раз, может что то и поменялось но это многолетняя привычка эще с клиппера

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2049
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 12:56. Заголовок: Haz Haz пишет Кстати..


Haz Haz пишет
 цитата:
Кстати да


Та же схема и для Clipboard
oRec := GetRec()
System.Clipboard := hb_valtoexp(oRec:GetAll(.F.))
aRec := &( System.Clipboard ) // перед возможна проверка на формат { }
oRec := oKeyData()
AEval(aRec, {|a| oRec:Set(a[1], a[2]) })

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2050
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 13:00. Заголовок: Haz пишет В сети вме..


Haz пишет
 цитата:
В сети вместо этого использую dbskip(0)


Это уже нюансы, в letodb skip(0) не работает, надо dbGoto(RecNo()) или leto_commit() или dbcommit()

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2051
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 13:12. Заголовок: SergKis пишет Та же ..


SergKis пишет
 цитата:
Та же схема и для Clipboard


Можно использовать ф-ии AtoC и CtoA
System.Clipboard := AtoC(oRec:GetAll(.F.))
aRec := CtoA(System.Clipboard)

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1336
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 13:47. Заголовок: SergKis пишет: Syst..


SergKis пишет:

 цитата:
System.Clipboard


Возможно лучше и не клипбоард, а внутреннюю переменную.
Тк вставка возможна в эту или такую же таблицу, но не в Word Excel paint и пр.
И это даст возможность держать в клипбоард какую-то другую нужную информацию

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2052
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 14:11. Заголовок: Haz пишет Возможно л..


Haz пишет
 цитата:
Возможно лучше и не клипбоард, а внутреннюю переменную.


Я, думал, у тебя между разными своими приложениями передача.
Главное в начало строки идентификатор лепить (к примеру id. таблицы)
для проверки правильности переносимости, т.е. запись таблицы T123 можно перенести в T123,T105, ...
что бы не сломать данные пересекающихся структур

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1337
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 16:26. Заголовок: SergKis пишет: межд..


SergKis пишет:

 цитата:
между разными своими приложениями передача.


Нет. Все в рамках одной системы, но как правило одна строка таблицы имеет несколько подчинённых таблиц.
Можно использовать bAddAfter чтоб сохранить структуру подчиненности.
Тут я рассуждал в общем что метод Clone может пригодиться. Ты его компактно нарисовал на основе AppendRow.
Копирование в буфер и вставка из него, тоже... К примеру.
Есть данные прогноза чего либо на текущий период, потом делается копия для следующего периода и актуализируется. Таким образом в системе живут временные среза по периодами, которые описывают что хотели, как все менялось и тд.
Это я все о планах продаж. Иногда нужно руками перенести данные из прошлого в актуальный период. Во тут копи-пасте и годится. Системный клипбоард можно использовать. Но мне кажется внутренний буфер надёжнее, а может это параноя

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2053
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 21:09. Заголовок: Haz пишет Иногда ну..


Haz пишет
 цитата:
Иногда нужно руками перенести данные из прошлого в актуальный период


Такое проделывал, давая отметить все или выборочно (строки тсб) в переменной (по кнопке\space,dblclick,...)
Схема по памяти
 
oMetka := oKeyData()
...
:UserKeys ( VK_SPACE, {|ob| (ob:cAlias)->( oMetka:Set( RecNo(), RecGet() ) ) })
:bLDblClick := {|p1,p2,p3,ob| ob:PostMsg( WM_KEYDOWN, VK_SPACE, 0 ) }

oCol := :GetColumn('METKA')
oCol:lCheckBox := .T.
oCol:cAlias := :cAlias
oCol:bData := {|| RecNo() }
oCol:bDecode := {|nr| ! Empty(oMetka:Get(nr)) }

Таким образом в oMetka накопятся на ключ recno объект записи. Для вставки в др. место (alias) делаем
(alias)->( AEval(oMetka:GetAll(.T.)/*только объекты записи*/, {|or| dbAppend(), PutRec(or) } ) )
Сейчас с :AppendRow() можно ее проделывать в AEval (др. тсб) вместо dbAppend(), PutRec(or), но еще не пробовал.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1338
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 21:29. Заголовок: SergKis пишет: Сейч..


SergKis пишет:

 цитата:
Сейчас с :AppendRow() можно ее проделывать в AEval (др. тсб) вместо dbAppend(), PutRec(or), но еще не пробовал.


Пока никто не пробовал
Я раньше это через sql делал т. к. это было проще.
Сейчас простые перебросы можно на новом методе опробовать. Сложные все же на sql оставлю, там скорость в разы выше за счёт 100% выполнения на серваке

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2054
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 21:31. Заголовок: PS память подвела :U..


PS
память подвела
 
:UserKeys ( VK_SPACE, {|ob,nr,lr| nr := (ob:cAlias)->( RecNo() ), lr := Empty(oMetka:Get(nr)), ;
iif( lr,(ob:cAlias)->( oMetka:Set( nr, RecGet() ) ), oMetka:Del(nr) ) }


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2055
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 21:40. Заголовок: Haz пишет Сложные вс..


Haz пишет
 цитата:
Сложные все же на sql оставлю


Здесь тоже можно убыстрить, в oMetka:Set( RecNo(), RecNo() ), а потом или через BM Filter выборку делать или передать массив записей на сервер и там сделать выборку из одной и вставку в др. таблицу.
С :AppendRow() будет с прорисовкой, для небольших объемов скорость не так критична

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1339
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.09.18 10:21. Заголовок: SergKis пишет: Здес..


SergKis пишет:

 цитата:
Здесь тоже можно убыстрить


Да, можно. В лето очень не хватает sql движка. Получился бы уникальный продукт.
Все что ниже НЕ РЕКЛАМА Много из того что приходится делать для оптимизации уже есть в sql. Именно поэтому я уже давно перескочил на ads.
Особенно удобно делать выборку для отчёта, таблицы можно клеить между собой вдоль и поперёк. В качестве примера который давно приводил Диме:
Есть таблица с платежами
-дата
-контрагент (ID)
-сумма выплаты
-сумма поступлений
-статья бюджета(ID)
Так вот, за произвольный период от и до по дате это разворачивается в график движения денег с произвольный шагом от дня до квартала или полугодия итд ( это колонки) с подстановкой значения из справочников вместо ID и с группировкой по контрику или статье за миллисекунды. Остаётся только плюнуть этим в Excel.
Что касается простых выборов данных, то делаю их на клиенте и тут чем больше возможностей tsb тем проще и понятнее делать. AppendRow уже использую, но пока как пользовательский метод. Появится в сборке - переключусь на него. В пятницу написал аналог метода GotoRec() только с сохранением RowPos на которой стояли. Помню пользователи жаловались что оригинальный прыгает на начало таблицы. Так что tsb становится все функциональнеё и стабильнее.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2056
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.09.18 17:10. Заголовок: Haz пишет Именно поэ..


Haz пишет
 цитата:
Именно поэтому я уже давно перескочил на ads.


Осмелюсь спросить, лицензионный. Лучше не говори, можешь только подмигнуть. :)

 цитата:
В пятницу написал аналог метода GotoRec() только с сохранением RowPos на которой стояли


Перепрыг на 1ую тоже происходит, но иногда. понять причину не удалось, но сама нужная запись держится.
Если твой new аналог фурычит, делись пожалуйста. "Моя твоя осень, осень плагодарна будет"

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1340
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.09.18 17:34. Заголовок: SergKis пишет: може..


SergKis пишет:

 цитата:
можешь только подмигнуть. :)


Ну подмигнуть не вопрос

 цитата:
Если твой new аналог фурычит, делись пожалуйста.


В понедельник скину в виде функции. Пока думаю надо ли оно и методом не оформил

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1341
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.09.18 10:45. Заголовок: Haz пишет: В понеде..


Haz пишет:

 цитата:
В понедельник скину в виде функции.


Примерно так

 
STATIC FUNCTION GoRec(oBrw, nRec)
LOCAL nRecno, nRowPos
LOCAL nSkip := 0
LOCAL lMore := .T.
LOCAL lSkip :=.F.

if oBrw:lIsDbf
oBrw:SetFocus()
oBrw:nLastPos := (oBrw:cAlias)->(RecNo())
nRowPos := oBrw:nRowPos
(oBrw:cAlias)->(dbGoto(nRec))
oBrw:nRowPos := 1



//подсчет числа скипов чтобы остаться на той же строке ( если возможно )
while lMore
(oBrw:cAlias)->(dbSkip(-1))
nSkip ++
lMore := !(oBrw:cAlias)->(bof()) .and. nSkip < (nRowPos)
lSkip := !(oBrw:cAlias)->(bof())
end
oBrw:Refresh(.t., .t.)

if lSkip
oBrw:Skip(nSkip)
end
oBrw:nRowPos := nSkip
oBrw:nAt := oBrw:nLogicPos()

oBrw:ResetVScroll()

If oBrw:bChange != Nil
Eval( oBrw:bChange, oBrw, 0 )
EndIf

oBrw:lHitTop := oBrw:lHitBottom := .F.

do events

end

RETURN Nil



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2057
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.18 18:16. Заголовок: Игорь, спасибо. Покр..


Игорь, спасибо.
Покручу, заменив :GotoRec()

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1342
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.09.18 21:50. Заголовок: SergKis пишет: Покр..


SergKis пишет:

 цитата:
Покручу, заменив :GotoRec()

можно допилить и вторым параметром передавать желаемый RowPos, а по умолчанию пытаемся сохранить текущий. Так можно задавать первый, последний и вообще любой.
У меня работает без замечаний. Ещё потестирую и вклею в проект.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2058
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.18 22:29. Заголовок: Haz пишет У меня раб..


Haz пишет
 цитата:
У меня работает без замечаний.


У меня рабочая версия hmg 2.07, tsb по коду местами отличается (исторически) и приходится "привязываться к местности". :GotoRec мой сильно отличается от кода в hmg тек. версии. Так что, покрутить придется. Параметры и new возможности - это хорошо

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1343
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.09.18 10:28. Заголовок: SergKis пишет: Пара..


SergKis пишет:

 цитата:
Параметры и new возможности - это хорошо


Тем более когда это не просто, а очень просто
 
STATIC FUNCTION GoRec(oBrw, nRec, nRowPos )
LOCAL nRecno, nRowPos
LOCAL nSkip := 0
LOCAL lMore := .T.
LOCAL lSkip :=.F.

if oBrw:lIsDbf
oBrw:SetFocus()
oBrw:nLastPos := (oBrw:cAlias)->(RecNo())
nRowPos := oBrw:nRowPos
hb_default( @nRowPos, oBrw:nRowPos )
(oBrw:cAlias)->(dbGoto(nRec))
oBrw:nRowPos := 1
...


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1344
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.09.18 16:03. Заголовок: Примерчик как работает GoRec


SergKis
Примерчик как работает GoRec. там два бровса по одной DBF . При движении по MASTER отрабатывает SLAVE при этом строки через GoRec()
тута

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2059
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 19:28. Заголовок: Haz пишет Примерчик ..


Haz пишет
 цитата:
Примерчик как работает GoRec


Примерчик работает и в моей версии
Заменил у себя метод :GotoRec на предложенный, погонял на реальной задаче - полет нормальный.
Получился такой метод
 
METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse
LOCAL nRecno, cAlias
LOCAL nSkip := 0
LOCAL lMore := .T.
LOCAL lSkip := .F.
LOCAL lRet := .F.

If ::lIsDbf

lRet := .T.
cAlias := ::cAlias
::SetFocus()
::nLastPos := (cAlias)->( RecNo() )
hb_default( @nRowPos, ::nRowPos )
(cAlias)->( dbGoto(nRec) )
::nRowPos := 1

DO WHILE lMore
(cAlias)->( dbSkip(-1) )
nSkip ++
lMore := !(cAlias)->(BOF()) .and. nSkip < (nRowPos)
lSkip := !(cAlias)->(BOF())
ENDDO

::Refresh(.F., .F.)

If lSkip
::Skip(nSkip)
EndIf

::nRowPos := nSkip
::nAt := ::nLogicPos()

::ResetVScroll()

If ::bChange != Nil
Eval( ::bChange, Self, 0 )
EndIf

::lHitTop := ::lHitBottom := .F.

EndIf

RETURN lRet


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2060
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 20:04. Заголовок: Игорь, перенес метод..


Игорь, перенес метод в тек. версию и собрал твой пример - получилось не как в твоем примере.
Двигаемся вниз курсором, не выходя за 1ый экран идем назад к 1ой записи slave передергивает записи.
Глянул и у себя это место, поведение похоже. На родном примере такого нет.
Что я потерял ?
Пример с методом https://my-files.ru/21e5ya

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2061
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 20:08. Заголовок: PS Отбой, потерял DO..


PS
Отбой, потерял DO EVENTS, пока думал как записать в метод командой или функцией.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2062
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 20:16. Заголовок: PPS ::lHitTop..


PPS
 
::lHitTop := ::lHitBottom := .F.

DO EVENTS

EndIf

RETURN lRet

все исправило во всех версиях и примерах

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1356
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.09.18 21:39. Заголовок: SergKis пишет: все ..


SergKis пишет:

 цитата:
все исправило во всех версиях и примерах


Это означает, что Вы рекомендуете использовать новую редакцию этого метода в следующей сборке
Я правильно понял

Кстати, уже добавил новый метод FilterFTS() в текущую сборку.
Благодарю за помощь

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2063
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 22:02. Заголовок: gfilatov2002 пишет Э..


gfilatov2002 пишет
 цитата:
Это означает, что Вы рекомендуете использовать новую редакцию этого метода в следующей сборке


В своей версии метод заменил, собрал только один проект. В нем все поиски\подводы по запросам работают как надо, т.е. одинаково с предыдущим вариантом. При случае передам новую версию в работу клиенту и понаблюдаю.
Если Игорь применит у себя метод в проекте, будет больше информации.
Впечатление у меня положительное.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1357
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.09.18 22:21. Заголовок: SergKis пишет: буд..


SergKis пишет:

 цитата:
будет больше информации


Тогда откладываем эти изменения для будущих сборок.

Я тестировал новую редакцию этого метода на примере Tsb_seek_2 и при перемещении на начало таблицы, а затем добавлении записи по клавише F2 на экране появляется "мусор" после последней строки в базе. У текущего метода этой проблемы нет, хотя он и не сохраняет точное значение :nRowPos, как указывал Игорь.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1345
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.09.18 22:26. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Это означает, что Вы рекомендуете использовать новую редакцию этого метода в следующей сборке


По коду эта редакция должна быть пошустрее предыдущей плюс управляемая позиция RowPos.
У себя заменил в проекте но не методом а функцией. Пока никто не жалился.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1348
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.09.18 22:44. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
при перемещении на начало таблицы, а затем добавлении записи по клавише F2 на экране появляется "мусор"


Дома только с телефона читаю. Скорее связано с тем что после добавления бровс разбалансирован. т. е. ::nLen не пересчитан. Хотя могу и ошибаться. Завтра на работе посмотрю.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2064
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 23:37. Заголовок: Haz пишет т. е. ::nL..


Haz пишет
 цитата:
т. е. ::nLen не пересчитан.


Это тоже присутствует, но не главное:
:nRowPos -> 1
:nRow факт -> от 1 до 14 и 14 + 1 -> EOF()
:nRowCount() -> 25
вот мусор и остался 25 - 14 = 11 строк

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2065
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 23:44. Заголовок: PS :nLen -> 502..


PS
:nLen -> 502

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1349
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.09.18 23:46. Заголовок: SergKis пишет: вот ..


SergKis пишет:

 цитата:
вот мусор и остался 25 - 14 = 11 строк


Значит вопрос в двух параметрах Refresh( p1, p2)
Возможно следует добавить проверку сколько сколько строк после RowPos и сколько записей после nRec.
Или просто заменить на Refresh(.T.,.T.) но это даст моргание.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2066
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 00:01. Заголовок: Haz пишет но это дас..


Haz пишет
 цитата:
но это даст моргание


В данной ситуации 14 стр. должна стать 25 и :nRowPos -> 12, т.е перепрыг курсора неизбежен
Пост. моргания не хотелось бы

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1350
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.09.18 09:04. Заголовок: SergKis пишет: Пост..


SergKis пишет:

 цитата:
Пост. моргания не хотелось бы


Сегодня добавлю проверку и пререрисовку только когда последняя запись не на RowCount()

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2067
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 10:08. Заголовок: gfilatov2002 пишет К..


gfilatov2002 пишет
 цитата:
Кстати, уже добавил новый метод FilterFTS() в текущую сборку


По мне, в сборку надо вкл. и упрощенный фильтр :FilterRow(), т.к. это др. алгоритм, нежели в :SetFilter(...) с автоматическими scope внутри. У себя я включил такой вариант (scope вполне ставится до такого фильтра)
 
METHOD FilterRow( cFilter, lFocus ) CLASS TSBrowse
LOCAL nLen := 0, cAlias := ::cAlias

IF ! Empty(cFilter)
( cAlias )->( DbSetFilter( &("{||" + cFilter + "}"), cFilter ) )
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


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1358
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.09.18 10:35. Заголовок: SergKis пишет: в сб..


SergKis пишет:

 цитата:
в сборку надо вкл. и упрощенный фильтр


Буду рассматривать Ваше предложение для будущих сборок, поскольку подготовка новой сборки уже завершена.

Возник вопрос:
почему Вы не используете для подсчета количества строк в фильтре функцию DbEval() с условием For
вместо устаревшего перебора по всем строкам

 цитата:
... 
( cAlias )->( DbGotop() )
DO WHILE ( cAlias )->( !EOF() )
DO EVENTS
nLen++
( cAlias )->( DbSkip(1) )
ENDDO
( cAlias )->( DbGotop() )
DO EVENTS



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2068
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 10:43. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
почему Вы не используете для подсчета количества строк в фильтре функцию DbEval() с условием For
вместо устаревшего перебора по всем строкам


1. Для небольших баз "по быстрому" иногда использую, но в блок кода принудительно вставляю DoEvents().
2. В localhost база (реальная) ~70 000 записей DbEval работает на 2-5 сек дольше, зависит еще от ширины базы

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2069
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 10:48. Заголовок: PS Перебор можно опт..


PS
Перебор можно оптимизировать, к примеру имея массив блоков кода, вместо длинного, сложного выражения фильтра:
 
DO WHILE ...
FOR EACH b IN aBlock
If Eval(b)
EXIT
EndIf
NEXT
SKIP
ENDDO


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1351
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.09.18 11:10. Заголовок: Haz пишет: Сегодня ..


Haz пишет:

 цитата:
Сегодня добавлю проверку и перерерисовку только когда последняя запись не на RowCount()


Добавил проверку на полную перерисовку
 
METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse
LOCAL cAlias
LOCAL nSkip := 0
LOCAL lMore := .T.
LOCAL lSkip := .F.
LOCAL lRet := .F.
LOCAL lReCount := .F.

If ::lIsDbf

lRet := .T.
cAlias := ::cAlias
::SetFocus()
::nLastPos := (cAlias)->( RecNo() )
hb_default( @nRowPos, ::nRowPos )
(cAlias)->( dbGoto(nRec) )

while !(cAlias)->(eof()) .and. nSkip < ( ::nRowCount() - nRowPos )
(cAlias)->( dbSkip(1) )
nSkip ++
end
if (cAlias)->(Eof())
lReCount := .T.
end


(cAlias)->( dbGoto(nRec) )
nSkip := 0
::nRowPos := 1

DO WHILE lMore
(cAlias)->( dbSkip(-1) )
nSkip ++
lMore := !(cAlias)->(BOF()) .and. nSkip < nRowPos
lSkip := !(cAlias)->(BOF())
ENDDO

::Refresh(lReCount, lReCount )



If lSkip
::Skip(nSkip)
EndIf

::nRowPos := nSkip
::nAt := ::nLogicPos()

::ResetVScroll()

If ::bChange != Nil
Eval( ::bChange, Self, 0 )
EndIf

::lHitTop := ::lHitBottom := .F.

do events
EndIf

RETURN lRet


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2070
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 12:14. Заголовок: Игорь, в целом работ..


Игорь, в целом работает, но есть отличия, в твоем варианте удерживается :nRowPos и нижняя часть тсб остается пустой.
Это видно если в примере tsb_seek__2 сделать
(oBrw:cAlias)->( FieldPut( 1, 'Y_'+ProcName()+": "+strzero(nRec, 7) ) )
:nRowPos -> 1 + F2 ==> :nRowPos -> 1 и чисто после введенной строки.

У меня в проекте подвод на последнем экране (там найдена позиция) происх. тоже самое.
Это будет смущать и в первую очередь не меня.
С последним экраном, режим передергивания должен был бы быть разрешенным, т.е. полное заполнение тсб

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1352
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.09.18 12:20. Заголовок: SergKis пишет: Это ..


SergKis пишет:

 цитата:
Это будет смущать и в первую очередь не меня.
С последним экраном, режим передергивания должен был бы быть разрешенным, т.е. полное заполнение тсб


Давай какой нить флажок добавим для этого ?

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1353
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.09.18 12:26. Заголовок: Haz пишет: Давай ка..


Haz пишет:

 цитата:
Давай какой нить флажок добавим для этого ?


сделать то легко , нужно оговорить логику . Где-то удобнее сохранять RowPos , где-то нужно перескочить на RowCount()

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2071
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 13:09. Заголовок: Haz пишет: Давай как..


Haz пишет:
 цитата:
Давай какой нить флажок добавим для этого ?


Трудно сказать.
От ввода\корректировки на самом тсб практически отказался (полей много и осталось в некоторых справочниках и по мелочи) в основном с диалог. окна, тсб в качестве индикатора перерисовывает (с окна вводим много строк сразу не выходя, да прямой GetBox побогаче с рюшечками). Даже для удаления исп. тоже окно но с readonly GetBox-ами, показывая значения их.

 цитата:
сделать то легко , нужно оговорить логику


По идее, по умолчанию, работать как раньше со сменой позиции, где нельзя удержать nRowPos, но полное заполнение тсб.
При жестком удержании :nRowPos - иметь флаг.
Или просто иметь два метода :GotoRow и :GoRow, если трудности с выше сказанным

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1354
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.09.18 13:48. Заголовок: SergKis пишет: По и..


SergKis пишет:

 цитата:
По идее, по умолчанию, работать как раньше со сменой позиции, где нельзя удержать nRowPos, но полное заполнение тсб.
При жестком удержании :nRowPos - иметь флаг.


Надо осмыслить. Иногда записи в силу индекса или сортировки добавляются сверху тогда нужно перескакивать на первую строку. Это вроде реализуемо вторым параметром метода.
Полное заполнение последней страницы сделаю сегодня чуть позже.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1355
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.09.18 13:54. Заголовок: Haz пишет: Полное з..


Haz пишет:

 цитата:
Полное заполнение последней страницы сделаю сегодня чуть позже.


уже
if (cAlias)->(Eof())
lReCount := .T.
nRowPos := ::nRowCount()
end

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2072
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 13:58. Заголовок: Haz пишет Иногда зап..


Haz пишет
 цитата:
Иногда записи в силу индекса или сортировки добавляются сверху тогда нужно перескакивать на первую строку.


Tsb_sek__2 имеет индекс и поведение нового метода по жесткому удержанию nRowPos вполне хорошее,
кроме последнего экрана, на позицию выше он может перескакивать только на 1ом экране и не возможности
удержать nRowPos

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1356
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.09.18 14:08. Заголовок: в итоге 2 варианта п..


в итоге 2 варианта по последней странице
первый
 
if (cAlias)->(Eof())
lReCount := .T.
nRowPos := ::nRowCount()
end


второй
 
if (cAlias)->(Eof())
lReCount := .T.
nRowPos := ::nRowCount() -nSkip + 1
end


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2073
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 14:11. Заголовок: Haz пишет уже не то...


Haz пишет
 цитата:
уже


не то. nRowPos становится просто последней, а должно было быть
 цитата:
В данной ситуации 14 стр. должна стать 25 и :nRowPos -> 12, т.е перепрыг курсора неизбежен


т.е. последняя строка -> :nRowCount(), :nRowPos та что нашлась\ввелась выше последней

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2074
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 19:38. Заголовок: Haz пишет второй ..


Haz пишет
 цитата:
второй

if (cAlias)->(Eof())
lReCount := .T.
nRowPos := ::nRowCount() - nSkip + 1
end


Этот вариант работает, жестко держит запись и последний лист.
Немного не привычно по первому листу или вставке выше - подтягивает инф. к курсору (но так и хотелось).
Гонял пример tsb_seek__2 с разными вариантами вставки F2
(oBrw:cAlias)->( FieldPut( 1, ProcName()+": "+strzero(nRec, 7) ) )
(oBrw:cAlias)->( FieldPut( 1, 'AL_'+ProcName()+": "+strzero(nRec, 7) ) )
(oBrw:cAlias)->( FieldPut( 1, 'W_'+ProcName()+": "+strzero(nRec, 7) ) )
(oBrw:cAlias)->( FieldPut( 1, 'Y_'+ProcName()+": "+strzero(nRec, 7) ) )
...
все ok
На всякий случай, что вышло по методу Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2075
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.18 19:58. Заголовок: PS Пересобрал свой п..


PS
Пересобрал свой проект - все аналогично работает

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1359
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.09.18 20:04. Заголовок: SergKis пишет: Этот..


SergKis пишет:

 цитата:
Этот вариант работает


Да, у меня 2-й вариант тоже отработал нормально
Думаю, что в следующей сборке он заменит старый метод GotoRec()

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1360
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.09.18 09:34. Заголовок: Выпущена новая сборк..


Выпущена новая сборка 18.09 для BCC 5.51 и компиляторов Harbour и xHarbour

Базовый дистрибутив-инсталлятор находится по адресу

http://hmgextended.com/files/CONTRIB/hmg-18.09-setup.exe

Рекомендуется к использованию

Также имеются следующие сборки для Си-компиляторов:

- MinGW 8.1.0 32-bit для Harbour 3.2.0dev; (есть в наличии)

- MinGW 8.1.0 64-bit для Harbour 3.4.0dev; (есть в наличии)

- MS VisualC 2017 32-bit для Harbour 3.2.0dev; (под заказ)

- Borland/Embarcadero C++ 7.3 (32-bit) для Harbour 3.4.0dev. (под заказ)


Спасибо: 1 
Профиль
SergKis
постоянный участник




Пост N: 2080
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.10.18 23:33. Заголовок: SergKis пишет Такое ..


SergKis пишет
 цитата:
Такое проделывал, давая отметить все или выборочно (строки тсб) в переменной (по кнопке\space,dblclick,...)
Схема по памяти


Порихтовал пример Tsb_Basic (demo.prg -> demo3.prg) на предмет RecnoClone с учетом установленных меток, что бы была не схема, а пример.
Пример тут https://my-files.ru/u10mq0

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1361
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.10.18 10:03. Заголовок: SergKis пишет: Пори..


SergKis пишет:

 цитата:
Порихтовал пример Tsb_Basic


Благодарю за помощь
Уже добавил этот пример в новую бету для следующей сборки.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2081
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.10.18 15:58. Заголовок: gfilatov2002 пишет У..


gfilatov2002 пишет
 цитата:
Уже добавил этот пример


Может имеет смысл такая правка в пример (цветом выделены строки для генерации ошибки) Скрытый текст


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1362
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.10.18 16:59. Заголовок: SergKis пишет: така..


SergKis пишет:

 цитата:
такая правка в пример


Принято с благодарностью

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2082
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.10.18 17:57. Заголовок: gfilatov2002 пишет П..


gfilatov2002 пишет
 цитата:
Принято


Код, выделенный цветом, наверно, не надо в пример, он показывает, что метки и :AppendRow() работают и при сбое, отработав возврат из метода

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1363
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.10.18 19:59. Заголовок: SergKis пишет: Код,..


SergKis пишет:

 цитата:
Код, выделенный цветом, наверно, не надо в пример


OK

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2083
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.10.18 14:07. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая правка
 
METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse
...
::nColSpecHd := 0
If ValType( ::bDataEval( ::aColumns[ nCol ] ) ) == "L" .and. ;
::aColumns[ nCol ]:lCheckBox .and. ! ::lNoKeyChar // virtual checkbox
::PostMsg( WM_CHAR, VK_SPACE, 0 )
...


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1364
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.10.18 15:34. Заголовок: SergKis пишет: Небо..


SergKis пишет:

 цитата:
Небольшая правка


Добавил
Благодарю за внимание

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1365
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.10.18 10:48. Заголовок: Подготовил перед отп..


Подготовил перед отпуском уже 5-ю бету для новой сборки библиотеки
Ключевые изменения в этой сборке следующие
Скрытый текст

Для этой сборки оставил компилятор BCC 5.51 с учетом мнения заинтересованных лиц

Для последующих сборок выбираю бесплатный компилятор из

- Embarcadero C++ 10.1 (32-bit)
- MS Visual C++ 2017 compiler (32-bit и 64-bit)

но все же склоняюсь к первому варианту

Что посоветуете - есть ли смысл в изменении компилятора
или "старое болото" лучше

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6942
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.18 11:42. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Что посоветуете - есть ли смысл в изменении компилятора


Какие плюсы/минусы от смены ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1366
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.10.18 12:12. Заголовок: Dima пишет: Какие п..


Dima пишет:

 цитата:
Какие плюсы/минусы от смены ?


Благодарю за отклик

Плюсы:
- нормальная поддержка новых фич, которые появились, начиная с Висты (это классы MARQUE, CUEBANNER и новые элементы управления CLBUTTON, SPLITBUTTON и др.)
- скорость работы компилированного кода выше, чем у BCC 5.5 за счет использования новых возможностей LLVM компилятора
- полная совместимость со старым кодом

Минусы:
- поддержка операционок, начиная с Висты (XP остается за бортом)
- незначительное увеличение размера кода приложений (порядка 200 кБайт)


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6066
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.10.18 12:26. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Что посоветуете - есть ли смысл в изменении компилятора



Нужен лучше - MS Visual C++ 2017 compiler (32-bit и 64-bit)
Под него поддержка лучше, и доки больше !
Я под него собираюсь переходить.

При использовании других библиотек (а я использую другие - HASP) библиотеки ТОЛЬКО под BCC и MSVC.
ХР можно оставлять за бортом. Пускай юзера на 7-ку переходят.
Я со следующего года всех ХР-ников "обрежу".

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6943
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.18 13:07. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Минусы:
- поддержка операционок, начиная с Висты (XP остается за бортом)


А вот это плохо....(но не смертельно)

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2085
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.10.18 14:49. Заголовок: gfilatov2002 пишет:Ч..


gfilatov2002 пишет:
 цитата:
Что посоветуете - есть ли смысл в изменении компилятора


Vc 2017 ближе.
Сами потихоньку подготавливаемся к переползанию.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1357
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.10.18 15:17. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
XP остается за бортом)


так вроде уже давно там. я и не помню уже когда видел в последний раз

Спасибо: 0 
Профиль
ММК
постоянный участник


Пост N: 345
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 10.10.18 16:05. Заголовок: Dima пишет: А вот э..


Dima пишет:

 цитата:
А вот это плохо....(но не смертельно)


Здравствуй ,Дима :)) Действительно не смертельно.
Разработчик винды прекращает поддержку ХР и т.д. ( или прекратил) , но ХР как работала , так и будет работать.
Задачи собранные на ВСС работали на ХР и работают на 10 - ке. На наш "трудовой век" хватит...
Андрей , как не писал на си, так и не будет писать...
На самом деле вопрос в том будет ли работать минигуи ( и на чем ) :)
Интерес есть для тех , кто пишет на конкретном компиляторе, поэтому лучше использовать несколько.
К примеру ВСС делает файлики меньше, сам удобен для флэшки. Кто-то хочет работать только дома и с
соответствующей оболочкой. Например Visual Studio.
Скорость работы? В теории наверное- Да, на практике не существенно ( мне так кажется).
Поэтому наверное удобнее собирать и выкладывать библиотеки на разных компиляторах.

Вот так комплектуются библиотеки для FW который под Харбор

FWH - FiveWin for Harbour

* Borland BCC 7.0 version: fiveh.lib, fivehc.lib

* Microsoft Visual C++ version: fivehm.lib, fivehcm.lib

* Libraries FiveH32.lib and FiveHC32.lib are to be used with Microsoft
Visual Studio Community 2015.
FiveHCM.lib and FiveHMX.lib are to be used with xHarbour commercial

* MinGW gcc: fivehg.lib, fivehgc.lib

FWHX - FiveWin for xHarbour

* Borland BCC 5.82 version: fivehx.lib, fivehc.lib

* Microsoft Visual C++ version: fivehmx.lib, fivehcm.lib


FWH64 - FiveWin 64 for Harbour/xHarbour 64 bits

* Harbour and Microsoft C 64 version: fiveh64.lib, fivehc64.lib

* Harbour and Borland 7.1 64 bits: five64.a, fivec64.a

XHB - Fivewin for xHarbour commercial

* xfw.lib

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6944
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.18 16:15. Заголовок: ММК Привет ! Я не к..


ММК
Привет !
Я не к этому вел. Просто есть еще старое оборудование: кассы , некоторые модели весов и тд и тп
которое пашет только на XP , выше не работают , поэтому и ось там менять ни кто не хочет.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1367
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.10.18 16:31. Заголовок: ММК пишет: На самом..


ММК пишет:

 цитата:
На самом деле вопрос в том будет ли работать минигуи


Согласен

ММК пишет:

 цитата:
Скорость работы? В теории наверное- Да, на практике не существенно


Снова согласен

ММК пишет:

 цитата:
удобнее собирать и выкладывать библиотеки на разных компиляторах


Я, собственно, так и делаю (для разных Си-компиляторов собираю готовую рабочую среду - Си-компилятор+Харбор+Минигуи).
Но, кроме 64-бит MinGW сборки, интереса к таким решениям не наблюдается

P.S. Однако уже два голоса за Visual C

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1368
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.10.18 16:33. Заголовок: Dima пишет: которое..


Dima пишет:

 цитата:
которое пашет только на XP


Да, есть такая проблема, поэтому BCC 5.5 до сих пор жив (18 лет ему стукнуло, как и Харбору)

Спасибо: 0 
Профиль
SkyNET





Пост N: 108
Зарегистрирован: 23.06.08
ссылка на сообщение  Отправлено: 10.10.18 23:10. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Для последующих сборок выбираю бесплатный компилятор из

- Embarcadero C++ 10.1 (32-bit)
- MS Visual C++ 2017 compiler (32-bit и 64-bit)

но все же склоняюсь к первому варианту


А что мешает пойти по пути ядра Harbour и оставить выбор компилятора за программистом?
С конфликтами компиляции под него пускай борются те, кто в нём разбираются.


Кстати, а в Embarcadero C++ Compiler доступна ли Clang версия компилятора (BCC32C)?
Если нет, то это крайне существенный недостаток.
Я недавно игрался с Embarcadero C++ Builder Community Edition, так там по умолчанию (с BCC32 компилятором) даже поддержка C++ стандарта 2011 года хромает.
Например, полностью отсутствует nullptr, что очень странно для 2018 года.


ММК пишет:

 цитата:
Задачи собранные на ВСС работали на ХР и работают на 10 - ке. На наш "трудовой век" хватит...


У меня собранные приложения в Visual Studio 2017 прекрасно работают и на XP.
Достаточно одной галочки в проекте: Скрытый текст

С компиляцией из консоли для XP правда скорее всего придётся немного помучаться.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1369
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.10.18 09:45. Заголовок: SkyNET пишет: что м..


SkyNET пишет:

 цитата:
что мешает пойти по пути ядра Harbour и оставить выбор компилятора за программистом?
С конфликтами компиляции под него пускай борются те, кто в нём разбираются.


Мешает лень прикладных программистов, которые не хотят разбираться с этими проблемами,
оставляя их решение "системщикам"

SkyNET пишет:

 цитата:
в Embarcadero C++ Compiler доступна ли Clang версия компилятора (BCC32C)?


Да, Embarcadero’s free C++ compiler использует именно bcc32c.exe
При этом Харбор определяет этот компилятор как
LLVM/Clang C 3.3.1 (35832.6139226.5cda94d) (32-bit) x86

Благодарю за Ваше внимание

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6067
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.10.18 11:30. Заголовок: SkyNET пишет: У мен..


SkyNET пишет:

 цитата:
У меня собранные приложения в Visual Studio 2017 прекрасно работают и на XP.


Тогда это отличная новость ! Т.е. ХР можно будет и дальше сопровождать.
Я обеими руками за MSVC !

Спасибо: 0 
Профиль
TimTim



Пост N: 149
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 11.10.18 13:49. Заголовок: Только недавно стал ..


Только недавно стал пробовать писать используя MiniGUI. Да, "старое болото" оно
привычней и на наш век хватит. Но двигаться вперед тоже надо, оправдывать приставку Extended.
Согласен с ММК:

 цитата:
наверное удобнее собирать и выкладывать библиотеки на разных компиляторах.


Работы непосредственно с компилятором С у меня нет. На С не пишу. Пока со сторонними библиотеками на С не сталкивался. Поэтому выбор компилятора не совсем моя тема. Тем более, что все тонкости работы с компиляторами взял на себя Григорий.

Конечно, MSVC привлекателен тем, что действительно для него много доки, и Windows-ы написаны в той же компании, что и этот компилятор.

Мое мнение очень субъективно. Я бы попробовал месяц поработать с библиотеками MiniGui собранными на одном компиляторе, а потом месяц на другом. Возможно, тогда выбор будет более осознанным.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1370
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.10.18 16:20. Заголовок: TimTim пишет: Конеч..


TimTim пишет:

 цитата:
Конечно, MSVC привлекателен


Благодарю за отклик

TimTim пишет:

 цитата:
Я бы попробовал месяц поработать с библиотеками MiniGui собранными на одном компиляторе, а потом месяц на другом.


Вы можете это сделать прямо сейчас.
Попробуйте скачать сборку для бесплатного Embarcadero’s C++ компилятора версии 10.1 с сайта Минигуи, и пробуйте

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1372
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.10.18 10:29. Заголовок: Больше хороших новостей


Собрался и выполнил адаптацию ядра библиотеки для работы с компилятором Microsoft Visual C++ 19.10.25017 (64-bit)
Для этого пришлось поправить кастинг в 35 сишных модулях

Теперь протокол компиляции библиотеки чистый, без предупреждений от компилятора
Скрытый текст

Тесты Харбора показывают, что бесплатный MSVC 64 работает вдвое быстрее свежего, но платного BCC 7.30 (32-bit).
Благодарю за Ваше внимание

Спасибо: 0 
Профиль
Alw Spencer



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 12.10.18 16:43. Заголовок: gfilatov2002 Вопро..


gfilatov2002

Вопросик
Если всё будет собираться скажем с Microsoft Visual C++ 19.10.25017 (32-bit)
и с опцией для XP, то инсталлировать дополнительные Runtime C++ библиотеки на стороне клиента нужно или всё же EXE получается автономный (как в случае с BCC 5)?

Спасибо: 0 
gfilatov2002
moderator




Пост N: 1373
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.10.18 17:06. Заголовок: Alw Spencer пишет: ..


Alw Spencer пишет:

 цитата:
инсталлировать дополнительные Runtime C++ библиотеки на стороне клиента нужно


Увы, НУЖНО устанавливать эти DLL-ки даже на Семерке

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2090
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.10.18 12:23. Заголовок: gfilatov2002 пишет ..


gfilatov2002 пишет
 цитата:
* Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG:
...
- modified the method GotoRec( nRec [, nRowPos ] ) in the TSBrowse
...


В методе GotoRec(...) надо убрать строку
 
If ::lIsDbf

lRet := .T.
cAlias := ::cAlias
// ::SetFocus()

::nLastPos := (cAlias)->( RecNo() )

сломает фокус на др. контролах, при работе в событии CHANGE ...
У себяубрал, т.к. сломались подводы на getbox-ах, с них фокус улетал на тсб

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2091
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.10.18 12:44. Заголовок: PS Может тут слегка ..


PS
Может тут слегка поправить ?
 
FUNCTION HMG_Alert( cMsg, aOptions, cTitle, nType )
...
LOCAL lFont := .F.

...
IF ! _IsControlDefined( "DlgFont", "Main" )
lFont := .T.

DEFINE FONT DlgFont FONTNAME "MS Shell Dlg" SIZE 9
ENDIF
...
If lFont
RELEASE FONT DlgFont
EndIf


RETURN iif( lEmpty, 0, _HMG_ModalDialogReturn )
...


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1361
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 16.10.18 13:00. Заголовок: SergKis пишет: лома..


SergKis пишет:

 цитата:
ломает фокус на др. контролах, при работе в событии CHANGE ...
У себяубрал, т.к. сломались подводы на getbox-ах, с них фокус улетал на тсб


Да, сразу не обратил внимания. В остальном без фокуса есть замечания ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2092
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.10.18 14:03. Заголовок: Haz пишет В остально..


Haz пишет
 цитата:
В остальном без фокуса есть замечания ?


Собрал реальный проект сегодня, отдал в работу. Будем посмотреть
Фокус вылез на однотипных подводах, поправил, у меня ok!, остальное подождем ...

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2093
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.10.18 20:00. Заголовок: gfilatov2002 Что то..


gfilatov2002
Что то сломалось в применении This для Domethod(...)
 
// ошибка везде лезет (пример C:\MiniGui\SAMPLES\BASIC\BUTTON_1>call ..\..\..\batch\compile.bat demo)
This.Button_4.SetFocus()
demo.prg(154) Error E0030 Syntax error "syntax error at '.'"
ставлю сюда (но не важно в др. событиях так же)
This.Button_4.SetFocus()

END WINDOW
...

This.Button_4.Height
This.Button_4.Index
работают



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1374
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.10.18 14:37. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может тут слегка поправить ?


Принято
Благодарю за помощь

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1375
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.10.18 14:40. Заголовок: SergKis пишет: В ме..


SergKis пишет:

 цитата:
В методе GotoRec(...) надо убрать строку


Пока вернулся к старой редакции этого метода, которая работает медленнее, но стабильнее

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1376
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.10.18 14:41. Заголовок: SergKis пишет: слом..


SergKis пишет:

 цитата:
сломалось в применении This для Domethod(...)


Уже поправил - это был мой "косяк"
Благодарю за подсказку

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2098
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.10.18 16:11. Заголовок: gfilatov2002 пишет П..


gfilatov2002 пишет
 цитата:
Пока вернулся к старой редакции этого метода


Может новый метод назвать :GoRec( nRecNo, nRowPos), потом можно совместить, если что.
По мне он и сейчас хорош и требует небольшой доводки.
Как метод, наверно, только у меня крутится. Если будет у большего числа пользователей, быстрее отладится

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2104
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.10.18 21:33. Заголовок: gfilatov2002 Игорь ..


gfilatov2002
Игорь поправил :GotoRec(...).
Пример для проверки (функ. myGotoRow(...) с галочками работает функция) https://my-files.ru/gwnw6t
Текст метода Скрытый текст

Пример для проверки работы метода https://my-files.ru/e0jvqq

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6082
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.10.18 21:50. Заголовок: SergKis пишет: Прим..


SergKis пишет:

 цитата:
Пример для проверки работы метода


Что-то на Down давишь и запись никуда не двигается...
Или это только у меня так ?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2105
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.10.18 21:55. Заголовок: Andrey подробнее, н..


Andrey
подробнее, на какой строке жмешь, если на последней, то куда ниже двигать ?
так же на первой Up ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1384
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.10.18 22:32. Заголовок: SergKis пишет: Игор..


SergKis пишет:

 цитата:
Игорь поправил :GotoRec(...)


Супер! Метод работает отлично
Благодарю за реальную помощь в развитии этой библиотеки

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1374
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.10.18 23:12. Заголовок: SergKis пишет: Прим..


SergKis пишет:

 цитата:
Пример для проверки работы метода


Подумалось, может в методе в качестве nRec реализовать возможность принимать не только номер записи, но и блок кода?
Этот блок должен вернуть номер записи, тогда туда можно закинуть и dbLocate() и dbSeek () и тд!
И устанавливать запись на результат выполнения блока.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6083
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.10.18 23:53. Заголовок: SergKis пишет: подр..


SergKis пишет:

 цитата:
подробнее, на какой строке жмешь, если на последней, то куда ниже двигать ?
так же на первой Up ?


Маркер стоит посередине таблицы.
Нажимаем Down - менюшка, а потом маркер на месте, а запись поменялась с нижней.
Если нажимаем Up, менюшка и маркер двигает запись вверх на одну.

Т.е. я предполагал, что при движении вниз и маркер должен скакать сам вниз вместе с записью.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2106
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.10.18 00:09. Заголовок: Andrey пишет Т.е. я ..


Andrey пишет
 цитата:
Т.е. я предполагал, что при движении вниз и маркер должен скакать сам вниз вместе с записью.


:GotoRec(nRec, nRowPos) теперь имеет 2а параметра.
если второй пар-р не задан - удерживается текущий :nRowPos
тот алгоритм, что предполагал, проделывай сам.
см. работу Insert -> там 2ой параметр используется

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2107
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.10.18 00:14. Заголовок: PS сам маркер никому..


PS
сам маркер никому ничего должен
скорее ты ему ... алгоритмом

Спасибо: 0 
Профиль
TimTim



Пост N: 152
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 26.10.18 08:47. Заголовок: Отличная идея, класс..


Отличная идея, классный алгоритм. Буду изучать.
Andrey пишет:

 цитата:
Т.е. я предполагал, что при движении вниз и маркер должен скакать сам вниз вместе с записью.


Кстати, при движении вверх происходит как раз так, как Андрей и хотел, а вниз - нет.
Маркер не "слушается", ведет себя как хочет?

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2108
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.10.18 10:08. Заголовок: TimTim пишет Маркер ..


TimTim пишет
 цитата:
Маркер не "слушается", ведет себя как хочет?


В этом вы правы - лечится так (цель была проверить работу new :GotoRec):Скрытый текст

Алгоритм с перемещением маркера такой, на вскидку (могут быть шероховатости)Скрытый текст


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 2109
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.10.18 10:15. Заголовок: pS Забыл, что либы е..


pS
Забыл, что либы еще нет. Пример https://my-files.ru/y720va

Спасибо: 0 
Профиль
TimTim



Пост N: 153
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 26.10.18 11:27. Заголовок: :sm250: , но ... Se..


, но ...
SergKis пишет:

 цитата:
могут быть шероховатости


Их есть. Делаем так. В программе изначально ставим создать БД не с 15 записями, а скажем с 20 (можно просто вставить в конец 3 или больше строк). Главное вся БД не помещается в окошко. Передвигаемся в конец базы. Поднимаем последнюю строку на 1 вверх, затем опускаем вниз, типа ошиблись. У меня 20-я запись идет после 16. А у вас?

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1375
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.10.18 11:33. Заголовок: TimTim пишет: У мен..


TimTim пишет:

 цитата:
У меня 20-я запись идет после 16. А у вас?


У меня все нормально

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 530
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет