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 [только новые]


gfilatov2002
moderator




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


SergKis пишет:

 цитата:
тогда в
FUNC Do_OnCtlRelease( i, p )
можно убрать


Благодарю снова за это важное исправление!
Теперь модальные окна работают нормально с ООП, но вернулась проблема с очисткой переменной ::oName после закрытия любого дочернего окна.
Возможно, надо убрать эти строки

 цитата:
::oName := iif( HB_ISOBJECT( ::oName ), ::oName:Destroy() , Nil ), ;
::oHand := iif( HB_ISOBJECT( ::oHand ), ::oHand:Destroy() , Nil ), ;

также из класса TWndData

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



Пост N: 1587
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.07.17 11:47. Заголовок: gfilatov2002 Был не..


gfilatov2002
Был не прав применив CLASSDATA, т.к. хотел другого. Поправил Скрытый текст



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




Пост N: 1141
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.17 12:58. Заголовок: SergKis пишет: Рабо..


SergKis пишет:

 цитата:
Работает как надо.


Подтверждаю, что после этих исправлений все работает нормально

SergKis пишет:

 цитата:
Пробовал пересобрать Вашу сборку


Выложил очередную бетку с учетом Ваших изменений по старому адресу.
Благодарю за оперативную помощь

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



Пост N: 1589
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.07.17 21:42. Заголовок: gfilatov2002 Такой ..


gfilatov2002
Такой пример получился с исп. MESSAGEONLY ... Скрытый текст


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



Пост N: 1590
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.07.17 21:49. Заголовок: PS пропустил ошибку ..


PS
пропустил ошибку
ACCESS WmApp INLINE ( WM_USER + 100 )
надо
ACCESS WmApp INLINE ( WM_USER + ::nApp )

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




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


SergKis пишет:

 цитата:
пример получился


Благодарю за хороший пример для новой сборки

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




Пост N: 1143
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.07.17 11:49. Заголовок: Подготовил первый RC..


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

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

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



Пост N: 1591
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.07.17 13:56. Заголовок: gfilatov2002 В клас..


gfilatov2002
В класс TCnlData добавил
METHOD SetSize( y, x, w, h ) INLINE _SetControlSizePos( ::cName, ::oWin:cName, y, x, w, h )


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




Пост N: 1144
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 19.07.17 15:33. Заголовок: SergKis пишет: В кл..


SergKis пишет:

 цитата:
В класс TCnlData добавил


Благодарю за помощь
Добавил этот метод также...

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



Пост N: 1592
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.07.17 16:22. Заголовок: gfilatov2002 У себя..


gfilatov2002
У себя сделал такие штуки (на Ваше усмотрение) Скрытый текст


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





Пост N: 47
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 20.07.17 07:37. Заголовок: SergKis пишет: У се..


SergKis пишет:

 цитата:
У себя сделал такие штуки



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

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



Пост N: 1593
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.07.17 08:38. Заголовок: Alex_Cher пишет как ..


Alex_Cher пишет
 цитата:
как все это можно реально использовать в своей работе


Какой момент вас интересует ? Если последний со StatusBar и ClientHeight, то исп. так
 
DEFINE WINDOW &cWnd AT 0,0 WIDTH 650 + nWdt HEIGHT 500 ;
...
PUBL oMain := ThisWindow.Object
PRIV oWnd := oMain, oBrw1
...
DEFINE STATUSBAR
STATUSITEM ''
STATUSITEM '' WIDTH 300
END STATUSBAR
// вместо This.StatusBar.Item(2) := "Right click ( TBrowse ) for context menu" // можно писать так
oWnd:StbSay("Right click ( TBrowse ) for context menu", 2) // или
oMain:StbSay("Right click ( TBrowse ) for context menu", 2)

DEFINE SPLITBOX HANDLE hSplit
DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 16,16 FLAT
...
END TOOLBAR

END SPLITBOX
... // вместо таких строк
nY := GetWindowHeight(hSplit)
nX := 10
nW := This.ClientWidth - nX * 2 - nWdt
nH := This.ClientHeight - GetWindowHeight( This.StatusBar.Handle ) - nY - 1
// можно писать
nY := oWnd:ReBarHeight
nX := 10
nW := This.ClientWidth - nX * 2 - nWdt
nH := oWnd:ClientHeight
...
Если вопрос про события, то написав, к примеру к контролу
cNam := 'ID'
@ nY, nX LABEL &cNam VALUE '' WIDTH nLen HEIGHT oBrw1:nHeightCell CENTERALIGN

WITH OBJECT oWnd:GetObj(cNam)
:Cargo := 0
:Event( 1, {|oc,kd,id| kd := Eval( oBrw1:GetColumn('KODS'):bData ), ; // Get
id := Eval( oBrw1:GetColumn('ID'):bData ), ;
oc:Value := alltrim(cValToChar(id))+"-<"+ ;
alltrim(cValToChar(kd))+">" } )
:Event( 2, {|oc | oc:Window:oCargo:Set(oc:Name, oc:Value) } ) // Put
:Window:oCargo:Set(cNam, :Value ) // init value to oCargo
END WITH
вы собрали в одном месте механизмы заполнения значения ( Event(1) ) и сохранения в базе этого значения (Event(2)).
Теперь, не важно на каком окне находится контрол, мы работаем с ним через очередь, посылая сообщения
// заполнить value контрола
oWnd:GetObj("ID"):PostMsg(1) // без ожидания
oWnd:GetObj("ID"):SendMsg(1) // с ожиданием завершения
// сохранить value контрола где то
oWnd:GetObj("ID"):PostMsg(2) // без ожидания
oWnd:GetObj("ID"):SendMsg(2) // с ожиданием завершения
т.к. контролов много, можно собрать в пакет такие сообщения и зарегестрировать на окно как события
WITH OBJECT oWnd // ---- Window events
:Event( 1, {|ow| AEval( ow:GetObj4Type('LABEL,GETBOX'), {|oc| oc:SendMsg(1) }) } ) // Get
:Event( 2, {|ow| AEval( ow:GetObj4Type('LABEL,GETBOX'), {|oc| oc:SendMsg(2) }) } ) // Put
// ...
END WITH // ---- Window events
т.е. послав окну сообщение oWnd:PostMsg(1) или oWnd:SendMsg(1) выполнятся события Event(1) для всех LABEL+GETBOX окна. По кнопке OK можно сделать oWnd:PostMsg(2) или oWnd:SendMsg(2) сохранить данные контролов где то.
На события можно повесить расчеты\формы\отправки писем ...
Т.е. ваша прогр. начинает работать (как и система) через сообщения



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



Пост N: 1594
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.07.17 08:53. Заголовок: PS Посылать сообщени..


PS
Посылать сообщения можно через псевдо ООП
// заполнить value контрола
(This.ID.Object):PostMsg(1) // без ожидания
(This.ID.Object):SendMsg(1) // с ожиданием завершения
// сохранить value контрола где то
(This.ID.Object):PostMsg(2) // без ожидания
(This.ID.Object):SendMsg(2) // с ожиданием завершения
для окна
(ThisWindow.Object):PostMsg(1)
(ThisWindow.Object):PostMsg(2)


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




Пост N: 1145
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.07.17 10:24. Заголовок: SergKis пишет: Како..


SergKis пишет:

 цитата:
Какой момент вас интересует ?


Благодарю за Ваши пояснения, которые очень полезны.
Но возникают и другие вопросы:
- почему Statusbar м Splitbox выделяются для присвоения им свойств на уровне класса TWndData
Ведь эти элементы управления имеют свои собственные объекты, которые были созданы при их определении
в функциях _BeginMessageBar(), _DefineItemMessage() и _DefineSplitChildWindow(). И, соответственно, эти
объекты имеют требуемую информацию о размерах этих контролов и т.п.
т.е. вместо присвоения
oWnd:StbSay("Right click ( TBrowse ) for context menu", 2)
д.б., например, так
oWnd:oStb:Say("Right click ( TBrowse ) for context menu", 2)

Или я что-то путаю

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




Пост N: 1146
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.07.17 10:31. Заголовок: Alex_Cher пишет: ....


Alex_Cher пишет:

 цитата:
.... может я и не прав


Прав, конечно

Alex_Cher пишет:

 цитата:
где об этом можно почитать


Документация Харбора
- doc\xhb-diff.txt
-doc\en\command.txt

 цитата:
   $DESCRIPTION$ 
CLASS creates a class from which you can create objects.
The CLASS command begins the class specification, in which the VAR
elements (also known as instance variables) and METHODS of the
class are named. The following scoping commands may also appear.
They control the default scope of VAR and METHOD commands that follow them.

<fixed>
EXPORTED:
VISIBLE:
HIDDEN:
PROTECTED:
</fixed>
The class specification ends with the END CLASS command.

Classes can inherit from multiple <SuperClasses>, and the chain of
inheritance can extend to many levels.

A program uses a Class by calling the Class Constructor, usually the
New() method, to create an object. That object is usually assigned
to a variable, which is used to access the VAR elements and
methods.

Harbour's OOP syntax and implementation supports Scoping (Protect, Hidden and Readonly)
and Delegating, and is largely compatible with Class(y)(tm), TopClass(tm)
and Visual Objects(tm).



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



Пост N: 1595
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.07.17 11:42. Заголовок: gfilatov2002 пишет И..


gfilatov2002 пишет
 цитата:
Или я что-то путаю


Все правильно Вы пишете , разница в том, что на уровне окна идет проверка, есть StatusBar, работаем, нет - пустышка, т.е. есть\нет StatusBar - все работает.
Запись oWnd:Stb:Say... предполагает точное наличие StatusBar. Потому и написал "на Ваше усмотрение".
SplitBox высота исп., только для расчета ClientHeight, т.е. ToolBar на SplitBox и StatusBar вычитаются из высоты клиентской области окна.
Возможно, надо сделать переменные :nTop, ::nRight, ::nBottom, :nLeft и управлять ими, для клиентской области - общий случай для окна.



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



Пост N: 1596
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.07.17 11:46. Заголовок: Alex_Cher пишет: где..


Alex_Cher пишет:
 цитата:
где об этом можно почитать


Еще http://www.kresin.ru/hrbfaq_3.html#Doc3

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



Пост N: 1597
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.07.17 12:01. Заголовок: gfilatov2002 пишет В..


gfilatov2002 пишет
 цитата:
Ведь эти элементы управления имеют свои собственные объекты


#xcommand DEFINE SPLITBOX ;
..., т.е.
FUNCTION _DefineSplitBox ( ParentForm, bottom, inverted )
...
не создает объект (и реальных размеров SplitBoxа еще не будет, появятся только в #xcommand END SPLITBOX), потому менял
FUNCTION _EndSplitBox ()


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




Пост N: 1147
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.07.17 12:15. Заголовок: SergKis пишет: на у..


SergKis пишет:

 цитата:
на уровне окна идет проверка, есть StatusBar, работаем, нет - пустышка


Понятно, тогда просто м.б. использовать проверку на уровне окна

 цитата:
:::IsStb := _IsControlDefined( "StatusBar", ::cName ) )


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

SergKis пишет:

 цитата:
FUNCTION _DefineSplitBox ( ParentForm, bottom, inverted )
...
не создает объект


Все верно, но она помещает требуемый для расчета ClientHeight хэндл в элемент массива родительского окна

 цитата:
_HMG_aFormReBarHandle [ i ] := ControlHandle


который Вы можете использовать в классе окна как ::nReBarHandle := _HMG_aFormReBarHandle [ ::Index ]
без необходимости изменять функцию _EndSplitBox ()

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



Пост N: 1598
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.07.17 12:46. Заголовок: gfilatov2002 пишет к..


gfilatov2002 пишет
 цитата:
который Вы можете использовать в классе окна как ::nReBarHandle := _HMG_aFormReBarHandle [ ::Index ]


В _EndToolBar() происходит
ResizeSplitBoxItem ( _HMG_aFormReBarHandle , nBand - 1, aSize[1], aSize[2], aSize[1] )
только после этого имеем реальные его размеры. Т.е. после END TOOLBAR.
 цитата:
без необходимости изменять функцию _EndSplitBox ()


Тогда выходим на уровень prg, как сейчас (для себя я убрал во внутрь), т.к. на mdi заготовки окон могут быть, mdi child (StatusBar на Main), так и
Modal со своим StatusBar или без него, тогда на Main.

 цитата:
и далее использовать эту переменную для проверки наличия статуса у окна


:oStatusBar и есть такая переменная (_IsControlDefined(...) в классе повторяет вычисления индексов, стараюсь избегать это, псевдо ООП для этого),
т.е. iif( Empty(:Stb), ..., ...) заменяет _IsControlDefined(...).

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