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


kkg



Пост N: 19
Зарегистрирован: 29.11.19
ссылка на сообщение  Отправлено: 09.02.20 11:00. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Обновил сборку 20.01 (Update 3)


а можно в стандартный комплект поставки bcc101 добавить библиотечку SQLMIX (hbsqldd.lib) ?
Спасибо.

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




Пост N: 3036
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.02.20 12:49. Заголовок: gfilatov2002 Надо п..


gfilatov2002
Надо поправить
 
METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel, aHeadSel ) CLASS TSBrowse
...
Local cTmp

...
If ValType(::aHeaders) == "A" .and. ! empty(::aHeaders) .and. n <= Len( ::aHeaders )
cHeading := ::aHeaders[ n ]
IF CRLF $ cHeading
cData := ""
FOR EACH cTmp IN hb_ATokens(cHeading, CRLF)
IF Len(cTmp) > Len(cData)
cData := cTmp
EndIf
NEXT
cHeading := cData
cData := NIL
ENDIF

Else
cHeading := ::Proper( ( cAlias )->( Field( nE ) ) )
EndIf
...


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




Пост N: 1649
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.02.20 19:27. Заголовок: SergKis пишет: Надо..


SergKis пишет:

 цитата:
Надо поправить


При добавлении этого кода в заголовок таблицы попадет только одна строка наибольшей длины из много-строчного заголовка.
Остальные строки этого много-строчного заголовка будут удалены. В чем смысл этой поправки

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




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


gfilatov2002 пишет
 цитата:
При добавлении этого кода в заголовок таблицы попадет только одна строка наибольшей длины из много-строчного заголовка.
Остальные строки этого много-строчного заголовка будут удалены. В чем смысл этой поправки


Эта поправка для правильного расчета ширины колонки, берется самое длинное слово для участия в расчете,
иначе ширина колонки получается по всем словам с учетом CRLF.
Текст в header потом выводится правильный, полностью все с переносом и ширина max от выделенного слова и
значения в колонке. Так работает в моей версии. После такой правки колонка после LoadFields рассчитана хорошо
и показывает аналогично.

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




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


gfilatov2002 пишет
 цитата:
При добавлении этого кода в заголовок таблицы попадет только одна строка наибольшей длины из много-строчного заголовка.


Прошу прощения, упустил, что у меня стоит перед созданием колонки
 
If ValType(::aHeaders) == "A" .and. ! empty(::aHeaders) .and. n <= Len( ::aHeaders ) // .08.
cHeading := ::aHeaders[ n ]
EndIf
If HB_ISARRAY( aHeadSel ) .and. Len( aHeadSel ) > 0 .and. n <= Len( aHeadSel ) .and. aHeadSel[ n ] != Nil
cHeading := aHeadSel[ n ]
EndIf

т.е. восстанавливаются данные cHeading + я упустил из вида вариант
If HB_ISARRAY( aHeadSel ) .and. Len( aHeadSel ) > 0 .and. n <= Len( aHeadSel ) .and. aHeadSel[ n ] != Nil
cHeading := aHeadSel[ n ]
EndIf
при выделении слова из заголовка. Наверно проще переделать так
Local cTmp, cHead
...
If ValType(::aHeaders) == "A" .and. ! empty(::aHeaders) .and. n <= Len( ::aHeaders ) // .08.
cHeading := ::aHeaders[ n ]
cHead := cHeading
Else
cHeading := ::Proper( ( cAlias )->( Field( nE ) ) )
EndIf

If HB_ISARRAY( aHeadSel ) .and. Len( aHeadSel ) > 0 .and. n <= Len( aHeadSel ) .and. aHeadSel[ n ] != Nil
cHeading := aHeadSel[ n ]
cHead := cHeading
EndIf

IF CRLF $ cHeading
cData := ""
FOR EACH cTmp IN hb_ATokens(cHeading, CRLF)
IF Len(cTmp) > Len(cData)
cData := cTmp
EndIf
NEXT
cHeading := cData
cData := NIL
ENDIF
...
If HB_ISCHAR(cHead)
cHeading := cHead
EndIf

cBlock := 'FieldWBlock("' + aStru[ nE, 1 ] + '",Select("' + cAlias + '"))'
::AddColumn( TSColumn():New( cHeading, FieldWBlock( aStru[ nE, 1 ], Select( cAlias ) ),cPicture, ;
...


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




Пост N: 3042
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.02.20 20:32. Заголовок: PS Правда у меня все..


PS
Правда у меня всегда включен расчет nSize, т.е.
 
cPicture := "@K "+cPicture
EndIf

// If nSize == Nil

cData := ( cAlias )->( FieldGet( nE ) )
...
nSize += If( ! Empty( cOrder ), 14, 0 ) //V90
// EndIf


но это связано связано с переносом :LoadFields(...) под команды файла ch, изложенное во флайме сегодня.

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




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


SergKis пишет:

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


Да, после такой переделки обработка заголовка отработала нормально
Благодарю за помощь

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




Пост N: 6583
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.02.20 10:01. Заголовок: SergKis пишет: Эта ..


SergKis пишет:

 цитата:
Эта поправка для правильного расчета ширины колонки, берется самое длинное слово для участия в расчете,
иначе ширина колонки получается по всем словам с учетом CRLF.
Текст в header потом выводится правильный, полностью все с переносом и ширина max от выделенного слова и
значения в колонке.
Так работает в моей версии. После такой правки колонка после LoadFields рассчитана хорошо
и показывает аналогично.


Классно !
Это когда будет включено в МиниГуи ?
А то у меня своя функция криво работает...

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




Пост N: 3044
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.02.20 12:54. Заголовок: gfilatov2002 Поправ..


gfilatov2002
Поправил у себя
 
METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse // BK 2018.03.20
...
LOCAL nBrwLen := GetWindowWidth( ::hWnd ) - iif( ::lNoVScroll, 0, GetVScrollBarWidth() ) - ;
iif( HB_ISNUMERIC(nDelta), nDelta, 1 )

IF HB_ISLOGICAL(aColumns)
IF ! aColumns ; RETURN NIL
ENDIF
aColumns := NIL
ENDIF

If empty(aColumns)
...


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




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


SergKis пишет:

 цитата:
Поправил у себя


Добавил такую проверку также

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




Пост N: 3051
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.02.20 12:21. Заголовок: gfilatov2002 Предла..


gfilatov2002
Предлагаю добавить проверку
 
IF w > GetDesktopWidth() ; w := GetDesktopWidth()
ENDIF
IF h > ( GetDesktopHeight() - GetTaskBarHeight() ) ; h := GetDesktopHeight() - GetTaskBarHeight()
ENDIF
перед строкой с
mVar := '_' + FormName

в функции
FUNCTION _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, ;
FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ;

Если высота ширина заданы, то есть шанс при переносе на др. комп, с др. монитором попадать на размеры окна > экрана, что произошло с примером CBru.exe на др. pc.

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




Пост N: 3052
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.02.20 12:53. Заголовок: PS У меня, еще, така..


PS
У меня, еще, такая штука присутствует
 
IF y > 0 .and. y < 1 ; y := int( GetClientHeight(0) * y )
ENDIF
IF x > 0 .and. x < 1 ; x := int( GetClientWidth (0) * x )
ENDIF
IF w > 0 .and. w < 1 ; w := int( GetClientWidth (0) * w )
ENDIF
IF h > 0 .and. h < 1 ; h := int( GetClientHeight(0) * h )
ENDIF

IF w > GetClientWidth (0) ; w := GetClientWidth (0)
ENDIF
IF h > GetClientHeight(0) ; h := GetClientHeight(0)
ENDIF
...
для управления положением окна с отключенным CENTER WINDOW ... , т.е.
DEFINE WINDOW Form_0 ;
At 0.5,0.5 ;
WIDTH 0.5 ;
HEIGHT 0.5 ;
...
разместит окно в правом нижнем углу

но может это и баловство ?

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




Пост N: 1654
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.02.20 13:29. Заголовок: SergKis пишет: доба..


SergKis пишет:

 цитата:
добавить проверку


Благодарю за предложение.
Пока сделал эту проверку таким образом:

 цитата:

IF ! ISNUMBER( w ) .AND. ! ISNUMBER( h )
...
ELSE

w := Min( w, GetDesktopWidth() )
h := Min( h, GetDesktopHeight() - GetTaskBarHeight() )

ENDIF

mVar := '_' + FormName
...



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




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


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


В большинстве случаев задаю ширину, высоту окон в процентном отношении к клиентской обл. Descktop, т.е.
w := GetClientWidth(0) * 0.4
h := GetClientHeight(0)*0.6
оказалось, что удобно располагать окно по координатам, также в процентах, т.е. запись удобна
 
DEFINE WINDOW Form_0 ;
At 0.4,0.6 ;
WIDTH 0.4 ;
HEIGHT 0.6 ;
для расположения в правом нижнем углу экрана
DEFINE WINDOW Form_0 ;
At 0,0.6 ;
WIDTH 0.4 ;
HEIGHT 0.6 ;
для расположения в правом верхнем углу экрана
DEFINE WINDOW Form_0 ;
At 0.4,0 ;
WIDTH 0.4 ;
HEIGHT 0.5 ;
в левом нижнем и т.д.
т.е. оформив y,x,w,h как параметры, на мой взгляд, удобно динамически, при вызовах, задавать позиции и размеры окна. Это актуально для небольших, в размерах, справочниках. Располагая сразу, при вызове, удобно для клиента, часто, не надо делать запоминание координат и размеров для одного и того же окна справочника.


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




Пост N: 3057
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.02.20 09:55. Заголовок: gfilatov2002 Не был..


gfilatov2002
Не было учтено в ch для tbrowse :lAdjColumn := .T.
Сделал у себя так
 
Function _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight,;
...
oBrw:nHeightCell += 4

IF ! ( Adjust == NIL .and. lAdjust == NIL )

IF HB_ISLOGICAL(lAdjust) .and. lAdjust
Adjust := lAdjust
ENDIF
IF Adjust != NIL
oBrw:AdjColumns(Adjust)
ENDIF
ENDIF

...
METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse // BK 2018.03.20
...
IF HB_ISLOGICAL(aColumns)
IF ! aColumns
::lAdjColumn := .T.

RETURN NIL
ENDIF
aColumns := NIL
ENDIF
...
тогда в примере CBru.prg
...
DEFINE TBROWSE oBrw AT nY, nX ALIAS cAlias WIDTH nW HEIGHT nH GRID ;
...
FOOTERS .T. ;
LOADFIELDS FIXED
...
не будет работать :AdjColumns()
...
FOOTERS .T. ;
LOADFIELDS FIXED ;
COLADJUST .T. // или {...}
будет работать :AdjColumns(.T.) // :AdjColumns({...})
FOOTERS .T. ;
LOADFIELDS FIXED ;
COLADJUST .F.
будет работать :AdjColumns(.F.), т.е. установка :lAdjColumn := .T.



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




Пост N: 1655
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.02.20 10:54. Заголовок: SergKis пишет: Не б..


SergKis пишет:

 цитата:
Не было учтено в ch для tbrowse


Благодарю за поправку

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




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


Обновил сборку 20.01 (Update 4) с учетом последних предложений Сергея Киселева

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

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

Обновил также архив для бесплатного Embarcadero C++ 10.1 Berlin compiler по адресу

http://hmgextended.com/files/CONTRIB/hmg2001_bcc101.exe

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

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




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


Обновил сборку 20.01 (Update 5) с учетом последних наработок

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

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

Обновил также архив для бесплатного Embarcadero C++ 10.1 Berlin compiler по адресу

http://hmgextended.com/files/CONTRIB/hmg2001_bcc101.exe

Выпуск дальнейших обновлений (и сборок) не планируется по понятным причинам...

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




Пост N: 1659
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.02.20 11:14. Заголовок: Снова обновил сборку..


Снова обновил сборку 20.01 (Update 6) с учетом последних наработок

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

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

Обновил также архив для бесплатного Embarcadero C++ 10.1 Berlin compiler по адресу

http://hmgextended.com/files/CONTRIB/hmg2001_bcc101.exe

Добавлен новый/старый редактор форм GuiDes

Андрею должно понравится такое изменение:

 цитата:
* Fixed: Removed ButtonEx`s flickering at a MOUSEHOVER event.
Contributed by Milomir Zecevic <zeka/at/bnbos.rs>
(see menulist_2.prg in folder \samples\Advanced\MenuList)



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




Пост N: 3073
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.02.20 12:32. Заголовок: gfilatov2002 пишет С..


gfilatov2002 пишет
 цитата:
Снова обновил сборку 20.01 (Update 6) с учетом последних наработок


Андрей говорил, дать правку для TBrowse, а я не дал.
Для одинаковой работы с колонкой в :bDecode и :bPrevEdit
 
METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, ;
...
If oCol:bPrevEdit != Nil
If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) // append mode for arrays
ElseIf nKey != VK_RETURN // GF 15-10-2015
uVar := Eval( oCol:bPrevEdit, uValue, Self, nCell, oCol )
If ValType( uVar ) == "L" .and. ! uVar
nKey := VK_RETURN
EndIf
EndIf
EndIf
...
METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse
...
::oWnd:nLastKey := nKey

If ::aColumns[ nCol ]:bPrevEdit != Nil

If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) // append mode for arrays
Else // GF 16-05-2008
uVal := ::bDataEval( ::aColumns[ nCol ] )
uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uVal, Self, nCol, ::aColumns[ nCol ] )
If ValType( uVal ) == "L" .and. ! uVal
Return 0
EndIf
EndIf

EndIf...
...
что бы не делать доп. переменных, а использовать :cargo колонки, например (от Андрея):
a2Dim4 := Get2DimCol4() // получить массив для колонки 4
меняем
oCol := oBrw:GetColumn("Name_4")
oCol:Cargo := Get2DimCol4() // получить массив для колонки 4
oCol:bDecode := {|val,ob,nc,oc| nc:=ob, Select2Array(val, oc:Cargo) }
oCol:nAlign := DT_CENTER
oCol:cPicture := REPL("x",25)
oCol:lEdit := .T.
oCol:bPrevEdit := {|val,ob,nc,oc| SelectWho(ob, oc:Cargo), WriteColum4(ob), ob:Setfocus(), FALSE }
...


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