On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
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 [только новые]


gfilatov2002
moderator




Пост N: 1482
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 03.04.19 12:03. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предлагаю добавить в

CLASS TControl
...
DATA lMsg AS LOGICAL INIT .T.
...
METHOD SetMsg( cText, lDefault ) CLASS TControl
...
If ! ::lMsg .or. ::nStatusItem < 1
return Nil
EndIf
...

тогда можно отключать "порчу" 1го itemа StatusBar, проделываемого TsBrowse


Благодарю за предложение
Но что мешает уже сейчас присвоить

 цитата:
:nStatusItem := 0


с тем же результатом

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




Пост N: 2317
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.04.19 12:40. Заголовок: gfilatov2002 пишет Н..


gfilatov2002 пишет
 цитата:
Но что мешает уже сейчас присвоить


Как говорится, УПС. Вполне можно.
В своей версии увидел DATA lMsg INIT .F. (всегда отключено, не исп. внутренний механизм тсб), вот и дернулся.

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




Пост N: 1450
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.04.19 14:56. Заголовок: Григорий , проверьт..


Григорий , проверьте точно ли исправления прошли в новой версии.
После обновления опять словил глюк , глянул исходники - они не изменились

 
Haz пишет:

 цитата:
Григорий,
уберите пожалуйста проверку на номер записи. С индексами и фильтром при наличии проверки не работает метод ( конкретно под ADS , остальное не проверял )

METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse
LOCAL cAlias
LOCAL nSkip
LOCAL n
LOCAL nRecSave
LOCAL lRet := .F.
LOCAL lReCount := .F.

IF ::lIsDbf
lRet := .T.
cAlias := ::cAlias
::nLastPos := ( cAlias )->( RecNo() )
вот эта строка портит позицию если удалить все нормально
nRec := Min( ( cAlias )->( LastRec() ), nRec )




нужно удалить ( закоментить ) строки , у себя убрал. Глюк исчез
 
If Empty( ( cAlias )->( dbFilter() ) )
nRec := Min( ( cAlias )->( LastRec() ), nRec )
EndIf


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




Пост N: 1484
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.04.19 15:21. Заголовок: Haz пишет: удалить ..


Haz пишет:

 цитата:
удалить ( закоментить ) строки , у себя убрал. Глюк исчез

If Empty( ( cAlias )->( dbFilter() ) )
nRec := Min( ( cAlias )->( LastRec() ), nRec )
EndIf


Убрал эти строки из метода GotoRec()
Благодарю за проверку

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




Пост N: 1485
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.04.19 15:34. Заголовок: Andrey пишет: можно..


Andrey пишет:

 цитата:
можно эти функции добавить в базовые ?


Нет, это локальные одно-строчные функции, которые можно легко заменить с помощью препроцессорных команд
#xtranslate

 цитата:
#xtranslate GetIni( cSection, cEntry, cDefault, cFile ) =>;
GetPrivateProfileString(cSection, cEntry, cDefault, cFile )
*--------------------------------------------------------*
#xtranslate WriteIni( cSection, cEntry, cValue, cFile ) =>;
WritePrivateProfileString( cSection, cEntry, cValue, cFile )
*--------------------------------------------------------*
#xtranslate IsINISection(cIniFile, cName) =>;
( aScan( _GetSectionNames(cIniFile), {|x| UPPER(x) == UPPER(cName)} ) > 0 )
*--------------------------------------------------------*
#xtranslate IsVarINISection(cIniFile, cSecName, cName) =>;
( aScan( _GetSection(cSecName, cIniFile), {|x| UPPER(x[1]) == UPPER(cName)} ) > 0 )



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




Пост N: 1460
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.04.19 17:53. Заголовок: Предложение в TsBrowse


Часто требуется узнать какой хороший человек отредактировал данные в таблице. У себя задаче решил через ::bPrevEdit и ::bPostEdit в колонках
Но поскольку бровсов уже более 50 и это не предел , поднадоело в каждом это прописывать.
Предлагаю включить в библиотеку базовый механизм

1 в данных бровса определить
 
DATA xOldEditValue
DATA xNewEditValue

DATA bEditLog


2 в METHOD Edit CLASS TSbrowse добавить
 
Default nCell := ::nCell, ;
::lPostEdit := .F., ;
::lNoPaint := .F.

::xOldEditValue := ::xNewEditValue := Eval(::aColumns[ nCell ]:bData )


3 в конце METHOD PostEdit CLASS TSbrowse добавить
 
::xNewEditValue := Eval(::aColumns[ ::nCell ]:bData)
if hb_isBlock( ::bEditLog )
Eval( ::bEditLog, ::xOldEditValue, ::xNewEditValue, Self )
end

Return Nil




тогда в своей программе при определении бровса достаточно указать
 
oBrw:bEditLog := { |a,b,c| WriteEditLog( a, b, c:cAlias ) }


и прописать саму функцию в которой в базу или текстовик вести протокол кто когда что и тд
Func WriteEditLog ( xOld, xNew, cAlias )
...
...
return nil

Как идейка

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




Пост N: 2395
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.04.19 18:22. Заголовок: Haz пишет Как идейка..


Haz пишет
 цитата:
Как идейка


На первый взгляд, ОК!
только
::xOldEditValue := ::xNewEditValue := ::bDataEval( ::aColumns[ nCell ], , nCell )
и
::xNewEditValue := ::bDataEval( ::aColumns[ nCell ], , nCell )

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




Пост N: 2396
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.04.19 18:26. Заголовок: PS if hb_isBlock..


PS
 
if hb_isBlock( ::bEditLog ) .and. ::xOldEditValue != ::xNewEditValue
Eval( ::bEditLog, ::xOldEditValue, ::xNewEditValue, Self )
end


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




Пост N: 2397
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.04.19 18:30. Заголовок: PPS Возможно, эти пе..


PPS
Возможно, эти переменные надо не CLASS TsBrowse, а в CLASS TsColumn
Тогда все колонки тек. линии будут иметь старые, новые значения

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




Пост N: 1461
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.04.19 18:31. Заголовок: SergKis пишет: На п..


SergKis пишет:

 цитата:
На первый взгляд, ОК!



Спасибо за правки

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




Пост N: 1462
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.04.19 18:34. Заголовок: SergKis пишет: PPS ..


SergKis пишет:

 цитата:
PPS
Возможно, эти переменные надо не CLASS TsBrowse, а в CLASS TsColumn
Тогда все колонки тек. линии будут иметь старые, новые значения



Нет смысла , редактируется всегда только одна из колонок в один момент времени

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




Пост N: 1463
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.04.19 18:36. Заголовок: Haz пишет: Нет смыс..


Haz пишет:

 цитата:
Нет смысла , редактируется всегда только одна из колонок в один момент времени


хотя , если в TsColumn , то это позволит undo по строке сделать

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




Пост N: 2398
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.04.19 18:41. Заголовок: И в TsColumn должно ..


И в TsColumn должно быть достаточным только старое значение, а новое в bPostEdit должно быть определено.
Именно для Undo и есть смысл в колонке иметь старое значение

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




Пост N: 1466
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.04.19 11:55. Заголовок: В общем пока получил..


В общем пока получилось так
    
CLASS TSColumn
...
DATA xOldEditValue

CLASS TSBrowse
...
DATA bEditLog


METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, ;
nClrBack ) CLASS TSBrowse

Local nRow, nHeight, cType, uValue, nI, aGet, oCol, cMsg, aRct, bChange, lSpinner, bUp, bDown, ;
bMin, bMax, nStartX, nWidth, lCombo, lMulti, nCol, lLogicDrop, lPicker, nTxtHeight, hFont, ix
Local cWnd := ::cControlName
Local nK, aKey, oGet

Default nCell := ::nCell, ;
::lPostEdit := .F., ;
::lNoPaint := .F.

::aColumns[ nCell ]:xOldEditValue := ::bDataEval( ::aColumns[ nCell ], , nCell )


METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse

Local aMoveCell, bRecLock, bAddRec, cAlias, uRet, ;
nLastKey := ::oWnd:nLastKey, ;
lAppend := ::lAppendMode, xNewEditValue
...
// в самом конце
xNewEditValue := ::bDataEval( ::aColumns[ ::nCell ], , ::nCell )

if hb_isBlock( ::bEditLog ) .and. ::aColumns[ ::nCell ]:xOldEditValue != xNewEditValue
Eval( ::bEditLog, ::aColumns[ ::nCell ]:xOldEditValue, xNewEditValue, Self )
end

Return Nil




После объявления в своей программе
oBrw:bEditLog := { |a,b,c| WriteEditLog( a, b, c ) }
все передается корректно

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




Пост N: 2441
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.04.19 20:35. Заголовок: gfilatov2002 Управл..


gfilatov2002
Управление линиями в колонке
 
METHOD DrawLine( xRow ) CLASS TSBrowse
...
oColumn := If( nJ > Len( ::aColumns ), ::oPhant, ::aColumns[ nJ ] )
nLineStyle := ::nLineStyle

If HB_ISNUMERIC(oColumn:nLineStyle)
nLineStyle := oColumn:nLineStyle
EndIf

cPicture := ::cPictureGet( oColumn, nJ )
...
METHOD DrawSelect( xRow ) CLASS TSBrowse
...
oColumn := If( nJ > Len( ::aColumns ), ::oPhant, ::aColumns[ nJ ] )
nLineStyle := ::nLineStyle

If HB_ISNUMERIC(oColumn:nLineStyle)
nLineStyle := oColumn:nLineStyle
EndIf

hFont := ::hFontGet( oColumn, nJ )
...
CLASS TSColumn
...
DATA nLineStyle
...
Пример
// LINES_NONE LINES_ALL LINES_VERT LINES_HORZ LINES_3D LINES_DOTTED
oCol:nLineStyle := LINES_HORZ
или
oCol:nLineStyle := LINES_NONE


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




Пост N: 2442
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.04.19 21:09. Заголовок: gfilatov2002 Для He..


gfilatov2002
Для Header, Footer тоже самое можно сделать
 
CLASS TSColumn
...
DATA nLineStyle
DATA nHLineStyle
DATA nSLineStyle // SpecHd
DATA nFLineStyle

...
METHOD DrawHeaders( lFooters ) CLASS TSBrowse
...
nClrLine := ::nClrLine

Local nLineStyle := 1

Default lFooters := .F.
...
Else
l3DText := nClr3dL := nClr3dS := Nil
EndIf

nLineStyle := 1

If HB_ISNUMERIC(oColumn:nHLineStyle)
nLineStyle := oColumn:nHLineStyle
EndIf

TSDrawCell( hWnd, ; // 1
hDC, ; // 2
0, ; // 3
nStartCol, ; // 4
aColSizes[ nJ ], ; // 5
cHeading, ; // 6
nAlign, ; // 7
nClrFore, ; // 8
nClrBack, ; // 9
hFont, ; // 10
hBitMap, ; // 11
nHeightHead, ; // 12
l3DLook, ; // 13
nLineStyle
, ; // 14 nLineStyle
nClrLine, ; // 15
1, ; // 16 1=Header 2=Footer 3=Super 4=Special
...
IF ::lDrawSpecHd
...
Else
l3DText := nClr3dL := nClr3dS := Nil
EndIf

nLineStyle := 1

If HB_ISNUMERIC(oColumn:nSLineStyle)
nLineStyle := oColumn:nSLineStyle
EndIf

TSDrawCell( hWnd, ; // 1
hDC, ; // 2
0, ; // 3
nStartCol, ; // 4
aColSizes[nJ], ; // 5
cHeading, ; // 6
nAlign, ; // 7
nClrFore, ; // 8
nClrBackS, ; // 9
hFont, ; // 10
hBitMap, ; // 11
0, ; // 12 nHeightFoot
l3DLook, ; // 13
nLineStyle,
; // 14 nLineStyle
nClrLine, ; // 15
4, ; // 16 1=Header 2=Footer 3=Super 4=Special
...
If ::lFooting .and. ::lDrawFooters
...
Else
l3DText := nClr3dL := nClr3dS := Nil
EndIf

nLineStyle := 1

If HB_ISNUMERIC(oColumn:nFLineStyle)
nLineStyle := oColumn:nFLineStyle
EndIf

TSDrawCell( hWnd, ; // 1
hDC, ; // 2
::nRowCount(), ; // 3
nStartCol, ; // 4
aColSizes[nJ], ; // 5
cFooting, ; // 6
nAlign, ; // 7
nClrFore, ; // 8
nClrBack, ; // 9
hFont, ; // 10
hBitMap, ; // 11
nHeightFoot, ; // 12
l3DLook, ; // 13
nLineStyle,
; // 14 nLineStyle
nClrLine, ; // 15
2, ; // 16 1=Header 2=Footer 3=Super
...


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




Пост N: 2443
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.04.19 08:55. Заголовок: gfilatov2002 Предла..


gfilatov2002
Предлагаю добавить для блокировки перехода на др. строку вверх\вниз при :PostEdit (oCol:EditMove работает)
 
CLASS TSBrowse FROM TControl
...
DATA lPostEdit // to detect postediting
DATA lPostEditGo AS LOGICAL INIT .T. // to detect postediting VK_UP,VK_RIGHT,VK_LEFT,VK_DOWN

...
METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse
...
( cAlias )->( DbSkip( 0 ) ) // refresh relations just in case that a relation field changes

::SetFocus()

If nLastKey == VK_UP .and. ::lPostEditGo
::GoUp()
ElseIf nLastkey == VK_RIGHT .and. ::lPostEditGo
::GoRight()
ElseIf nLastkey == VK_LEFT .and. ::lPostEditGo
::GoLeft()
ElseIf nLastkey == VK_DOWN .and. ::lPostEditGo
::GoDown()
::Refresh( .F. )
ElseIf ::aColumns[ nCol ]:nEditMove >= 1 .and. ::aColumns[ nCol ]:nEditMove <= 5 // excel-like behavior post-edit movement
Eval( aMoveCell[ ::aColumns[ nCol ]:nEditMove ] )
::DrawSelect()
If ! ::lAppendMode
::Refresh( .F. )
EndIf
ElseIf ::aColumns[ nCol ]:nEditMove == 0 .and. ! ::lAutoEdit
::DrawSelect()
EndIf

::oWnd:nLastKey := Nil
...
Else
If lAppend .and. ::lIsArr
...
::SetFocus()

If nLastKey == VK_UP .and. ::lPostEditGo
::GoUp()
ElseIf nLastkey == VK_RIGHT .and. ::lPostEditGo
::GoRight()
ElseIf nLastkey == VK_LEFT .and. ::lPostEditGo
::GoLeft()
ElseIf nLastkey == VK_DOWN .and. ::lPostEditGo
::GoDown()
::Refresh( .F. )
ElseIf ::aColumns[ nCol ]:nEditMove >= 1 .and. ::aColumns[ nCol ]:nEditMove <= 5 // excel-like behaviour post-edit movement
Eval( aMoveCell[ ::aColumns[ nCol ]:nEditMove ] )
ElseIf ::aColumns[ nCol ]:nEditMove == 0
::DrawSelect()
EndIf

::oWnd:nLastKey := Nil
...


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




Пост N: 1494
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.04.19 10:43. Заголовок: SergKis Добавил эти..


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

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




Пост N: 1495
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.04.19 11:03. Заголовок: Просто к сведению З..


Просто к сведению
Завершена подготовка следующей сборки 19.04, которая выйдет на этой неделе

Список изменений для новой сборки можно увидеть на сайте библиотеки (файл ChangelogHMG.docx).

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




Пост N: 2447
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.04.19 11:41. Заголовок: gfilatov2002 пишет Д..


gfilatov2002 пишет
 цитата:
Добавил эти изменения, хотя и считаю их необязательными


Согласен, что это мелочь. Но линиями давно хотел заняться, т.к. надо часто показывать колонки, как одну графу, суперхидер над ней занят. Приходилось показывать через выражение, а модифицировать на окне как отдельные поля\getbox.
Второе изменение, по мне, более четко отрабатывает установленный на колонки :nEditMove алгоритм, не перескакивая на др. запись, отличную от строки с :Edit

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 182
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет