Форум » Документация » Документация по HwGUI » Ответить

Документация по HwGUI

alkresin: Наконец-то созрел для того, чтобы обновить документацию по HwGUI и решил начать с русской версии, которой до сих пор не было. Вот первая часть: http://www.kresin.ru/hwgdoc.html. Обращаю ваше внимание, что там, как и на многих других страницах сайта есть message board - можно писать комментарии, ругать за недостатки, сообщать о том, чего недостает, и т.п.

Ответов - 94, стр: 1 2 3 4 5 All

SergKis: PS строки с текстом Pavisam - это footer, строки самые верхние (2-е) это Super header

alkresin: SergKis пишет: Вот и получаются "пляски с бубном" во WHEN (востановить), VALID (сохранить), на GOT FOCUS окна (массив сохранить) и т.д. и т.п., а просится добавить в HEDIT DATA tColorinFocus DTA bColorinFocus Вы вместо двух старых известных кодоблоков (WHEN и VALID) предлагаете сделать для этой цели два новых: tColorinFocus, bColorinFocus. Не вижу упрощения. А что за массив надо сохранять в GOT FOCUS ?

alkresin: SergKis пишет: Пример http://my-files.ru/4tcwwc (DbcHw.txt переименовать в DbcHw.exe Увы, не успел скачать - файл удален как "вредоносный"

alkresin: SergKis пишет: 1. многострочный заголовок есть 2. многострочный подвал есть :) На днях задумывался, не убрать ли это дело, нужно ли оно кому-нибудь, знает ли кто о нем... Сам ни разу не пользовался. 3. многострочной строки нет (однострочная) 4. Super header отсутствует [.quote] Отсутствует. Если бы кто-нибудь попросил, подумал бы на эту тему.

alkresin: SergKis пишет: 1. На диалоговом окне работает VK_TAB перемещая фокус, на чилд окне фокус на get надо мышой установить Можно сразу после oChildWnd:Activate() поставить oGet1:SetFocus(). VK_TAB работает только на get на кнопки не прерходит Да, действительно. Странно. Похоже на какую-то фишку в winapi, там таких неожиданных эффектов немало. Надо посмотреть. 2. "Танец с бубнами". - запускаем пункт меню Create DlgGet window. Имеем один цвет первого get в фокусе - запускаем пункт меню Get using SetcolorinFocus. Имеем то что и должно по установке - запускаем пункт меню Create DlgGet window снова. Имеем цвет первого get в фокусе из пред. пункта А... Ну это, сами понимаете, следствие использования hwg_SetColorinFocus(), который устанавливает цвета глобально для всех GET'ов. Разумно, наверное, делать это на 3-х уровнях: глобально, для окна (диалога) и для конкретного GET-элемента. Сам я никогда этим не пользовался (и не я это реализовывал), поэтому и не сразу даже понял, о чем речь. Да, тут есть о чем подумать.

SergKis: alkresin пишет Вы вместо двух старых известных кодоблоков (WHEN и VALID) предлагаете сделать для этой цели два новых: tColorinFocus, bColorinFocus. Не вижу упрощения. Дело не в упрощении, а в "все свое ношу с собой", т.е. имеем объект Get и все относящееся к нему должно находится в нем, а цвет в фокусе - это свойсво объекта, так же как и цвет не в фокусе, можно подумать о цветах в READONLY, но для начала хорошо бы отвязаться от static переменных (два-три одновременно отображаемых окна, с разными стилями Getов - это ...) А если в этих свойствах иметь блоки кода (не только числа\масссив rgb) - решает все проблеммы с цветами 1. сумма < 0 один цвет 2. сумма > 0 < 1000 другой 3. сумма от 1000-5000 еще цвет 5. сумма > 5000 еще в одном Get объекте

SergKis: alkresin пишет Отсутствует. Если бы кто-нибудь попросил, подумал бы на эту тему То что сейчас есть в HEdit, к сожалению, годится в основном для справочников и очень ограниченного списка документов. Я, конечно, говорю только о себе, возможно у др. не так. В clipper задачах, которые надо переводить в Gui такая потребность: - многострочный super header - многострочный header - многосточные (было мах 3) строки - многострочный footer замечательно иметь сразу и многострочный footer (по аналогии с super header), но это уже хотелка, можно реализовывать через label или иными способами Та картинка, данная выше - это раб.место по приему xml заказов и это средняя потребность от browse. Реализована на cpp+Htmlayout монитор отображения и в hide режиме hb 2.0 работа с базой. Хотелось бы уйти на чистый hb с уникодом (в hwg это есть и три языка LV866 встроилось на ура и большой респект за проделанную работу)

SergKis: alkresin пишет Увы, не успел скачать - файл удален как "вредоносный" Это у была утилита dbc с LV866 и база с лат., рус. языками в которой 201 поле первое 10 байт, второе 40, остальные поля 2-3 байта (на первом экране). Эффект мерцания проявляется на selected строке при движении курсора по узким плям. Причина, вероятно в прорисовке цветов всей строки, а не только ячеек, учавствующих в смене цветов фокус\не фокус, но в целом это мелочь.

alkresin: Запостил сейчас изменения. касающиеся ColorInFocus, сделал 3 уровня: 1) глобальный: все работает как раньше, для всех GET, для всех окон; 2) уровень окна: можно определить эти цвета для конкретного окна той же функцией hwg_SetColorinFocus(), только в качестве первого параметра передается объект окна; 3) уровень отдельного GET: для него добавлена новая переменная :bColorBlock. Этот кодоблок вызывается при получении фокуса и ему передается в качестве параметра объект соответствующего GET. Кодоблок должен, по идее, использовать :setColor() для установки нужных цветов.

SergKis: alkresin пишет Запостил сейчас изменения. касающиеся ColorInFocus Это где ? С вашего сайта и HwGUI на Sourceforge одно и то же /* * $Id: Changelog 2526 2016-02-01 13:13:00Z alkresin $ */

alkresin: На SVN, конечно. Новый релиз я еще не формировал. Впрочем, можно скачать так называемый "снапшот": https://sourceforge.net/p/hwgui/code/HEAD/tree/ и там нажать на "Download Snapshot".

SergKis: alkresin Спасибо за ссылку. Нашел свои опыты с hbrowse, где видно, как мерцает переотображение selected строки при горизонтальном перемещении http://my-files.ru/h192y7

SergKis: alkresin пишет Запостил сейчас изменения. касающиеся ColorInFocus SerKis пишет 1. сумма < 0 один цвет 2. сумма > 0 < 1000 другой 3. сумма от 1000-5000 еще цвет 5. сумма > 5000 еще в одном Get объекте Может не все понял. 1. При переходе фокуса с Get на др. Get блок кода должен срабатывать и поставив в нем :SetColor... цвет в фокусе должен меняться. А будет ли срабатывать блок кода в ситуации oGet:Value( -100 ); oGet:Refresh() oGet:Value( 100 ); oGet:Refresh() oGet:Value( 1001 ); oGet:Refresh() ... 2. Может облегчить жизнь и не внутри блока кода делать :SetColor, а пусть блок кода возвращает цвет и внутри HEdit делать :SetColor... 3. Не добавлять DATA bColorBlock, а сделать как то так: Local bC := ::bColor Local tC := ::tColor If hb_IsBlock(bColorinFocus) bC := Eval(bColorinFocus, Self) EndIf If hb_IsBlock(tColorinFocus) tC := Eval(tColorinFocus, Self) EndIf ::SetColor(tC, bC)

alkresin: SergKis пишет: будет ли срабатывать блок кода в ситуации oGet:Value( -100 ); oGet:Refresh() Нет. Он срабатывает только при получении фокуса. И, вообще-то, мне всегда казалось, что значение GET элемента, когда он находится в фокусе ввода, меняет человек, вводящий информацию, а не программа. Но на крайний случай можно написать что-то вроде: [pre]Function RefreshColor( oGet ) IF hwg_Isptreq( oGet:handle, hwg_Getfocus() ) Eval( oGet:bColorBlock, oGet ) ) ENDIF Return oGet:Refresh() [/pre] и вызывать эту функцию вместо oGet:Refresh() 2. Может облегчить жизнь и не внутри блока кода делать :SetColor, а пусть блок кода возвращает цвет и внутри HEdit делать :SetColor. 3. ... Не люблю добавлять переменные в класс на всякий случай жизни - тогда он в конце концов вырастет в монстра.. Один :bColorBlock, IMO, лучше чем два, для текста и фона отдельно. И я не понимаю, почему написать 2 кодоблока, каждый с Return nColor, легче, чем один с Return o:SetColor( tColor,bColor ). Я исповедую минималистический подход. На мой взгляд, класс должен предоставлять минимальный, но достаточный инструментарий для разработчика, а уж его дело использовать этот инструментарий в соответствии со своими вкусами и потребностями. Ну а баланс между минимальным и достаточным - дело тонкое, конечно, и иногда субъективное ).

SergKis: SerKis пишет мне всегда казалось, что значение GET элемента, когда он находится в фокусе ввода, меняет человек, вводящий информацию, а не программа Вот одна из простых карточек http://shot.qip.ru/00QSeG-111709ntXja/ вправа от списка л.счетов Getы в Readonly, при перемещении они заполняются данными из базы, по клавише\кнопке\двойной клик на тексте у Get или сам Get, если разрешено, переводим в режим редактирования от первого Get или от того, по которому кликнули. Еще с s87 такие карточки были.

alkresin: Что-то не отображается у меня эта картинка, ну да ладно. Согласен, бывает такое, чего только не бывает). В любом случае простенькая ф-я типа приведенной выше RefreshColor() решит этот вопрос, а железно прописывать подобную функциональность в HEdit(), по-моему, будет неправильно.

Dima: alkresin пишет: Что-то не отображается у меня эта картинка, ну да ладно А так ?

alkresin: Это она и есть ? Я подумал, что какое-то сопутствующее бизнес-предложение от qip.ru. Но где тут текстовый GET, все равно не вижу.

SergKis: alkresin пишет: Но где тут текстовый GET, все равно не вижу Все светлозеленые клеточки это GetBox MiniGui (Get аналоги hwg) в состоянии readonly В любом случае простенькая ф-я типа приведенной выше RefreshColor() решит этот вопрос, а железно прописывать подобную функциональность в HEdit(), по-моему, будет неправильно. Не соглашусь, имея объект, городить доп. функционал можно, но по мне нонсенс. А менять функционал сильно не недо [pre2] добавляем в класс DATA tColorinFocus DATA bColorinFocus METHOD SetColorReal() CLASS HEdit LOCAL tC := ::tColor LOCAL bC := ::bColor LOCAL xC If lColorinFocus tC := tColorinFocus bC := bColorinFocus Else If ::tColorinFocus != NIL tC := ::tColorinFocus EndIf If ::bColorinFocus != NIL bC := ::bColorinFocus EndIf EndIf If hb_IsBlock(tC) xC := Eval(tC, Self) If hb_IsNumeric(xC) tC := xC EndIf EndIf If hb_IsBlock(bC) xC := Eval(bC, Self) If hb_IsNumeric(xC) bC := xC EndIf EndIf ::Setcolor( tC, bC, .T. ) RETURN в Refresh() метод добавляем ::SetColorReal() и не надо больше никаких DATA aColorOld INIT { 0,0 } DATA bColorBlock IF msg == WM_SETFOCUS oParent := hwg_getParentForm( Self ) IF lColorinFocus .OR. oParent:tColorinFocus >= 0 .OR. oParent:bColorinFocus >= 0 .OR. ::bColorBlock != Nil ::aColorOld[1] := ::tcolor ::aColorOld[2] := ::bcolor IF ::bColorBlock != Nil Eval( ::bColorBlock, Self ) ELSE ::Setcolor( Iif( oParent:tColorinFocus >= 0, oParent:tColorinFocus, tColorinFocus ), ; Iif( oParent:bColorinFocus >= 0, oParent:bColorinFocus, bColorinFocus ), .T. ) ENDIF ENDIF ELSEIF msg == WM_KILLFOCUS oParent := hwg_getParentForm( Self ) IF lColorinFocus .OR. oParent:tColorinFocus >= 0 .OR. oParent:bColorinFocus >= 0 .OR. ::bColorBlock != Nil ::tcolor := ::aColorOld[1] ::bcolor := ::aColorOld[2] ::Setcolor( ::tcolor, ::bColor, .T. ) ENDIF ENDIF имеем два простых блока управления цветом от oGet:Value() [/pre2] на скорую руку делал, может пропустил\не учел что, тогда сори

alkresin: SergKis пишет: Все светлозеленые клеточки это GetBox MiniGui (Get аналоги hwg) в состоянии readonly Странно. Всматривался во все глаза несколько раз, но светлозеленых клеточек не увидел. и не надо больше никаких DATA aColorOld INIT { 0,0 } Увы, надо. Метод :SetColor() устанавливает новые значения :tColor, :bColor - а, значит, нужен :aColorOld и нужна обработка WM_KILLFOCUS. Нужна также и обработка WM_SETFOCUS, так как именно в это время надо поместить в :aColorOld старые значения, а :Refresh() может быть вызван в любое время.



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