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

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

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

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

SergKis: alkresin Можно тут вставлю свои замечания (там на сайте не привычный редактор) о пробе windows версии [pre2] 1. Задание стилей, помнить их и задавать, для многих, думаю, будет затруднительно 2. Соединение их (стилей) через +, не совсем коректно, хотя бы через ф-ю nNewStyle := hwg_BitOr( nStyle, ....), примеры AEval({WS_CHILD, ES_AUTOHSCROLL, BS_FLAT}, {|s| nStyle := Hwg_BitOr(nStyle, s) }) nTStyle := hwg_BitOr(TBSTYLE_FLAT, TBSTYLE_TRANSPARENT, CCS_NODIVIDER ) nBStyle := hwg_BitOr(TBSTYLE_FLAT, TBSTYLE_TRANSPARENT) 3. Цифровой идентификатор контролов (виджетов) хорошо что есть, но помнить в большом проекте ..., хотелось бы символьное имя (может у меня от МиниГуи так) 4. К сожалению, только INIT DIALOG оказался работоспособным, перенос примеров на child mdi не работают аналогично диалоговому окну 5. HBrowse очень мелькающий (переотображениями), Получить координаты ячеки текущей или какой то оказалось не просто, но получил 6. HBrowseEx по мельканию лучше, но получить координаты ячейки не получилось. Многострочный заголовок получается нормально, но Super Header отсутсвует. Есть я так понял механизм задания врисовки в ячейку (сложноватый показалось, особенно в запоминании) 7. ButtonEx с image без подборки позиции PICTUREMARGIN 7 не смотрится совсем @ 350, 50 BUTTONex oBtBuild CAPTION "Build" SIZE 88,52 FONT oFBtn BITMAP oImgBuild:Handle ; ON Click { || hwg_MsgInfo("Build button") } TRANSPARENT PICTUREMARGIN 7 @ 350,110 BUTTONex oBtExit CAPTION "Exit" SIZE 88,52 FONT oFBtn BITMAP oImgExit:Handle ; ON Click { || hwg_MsgInfo("Exit button") } TRANSPARENT PICTUREMARGIN 7 8. В Get задание цвета через STATIC переменную, работает, но при наличии объектов, смотрится (может только мне) страно Конечно реакция на события (из за отсутсвия базы, как в минигуи) мгновенная, понравиловилось присутсвие везде bOther обработчика, установка клавиш не через hotkey, но без больших вложений (времени и труда) трудно применимо. [/pre2]

alkresin: Я разобью ответ на несколько частей, чтоб потом было удобнее. SergKis пишет: 1. Задание стилей, помнить их и задавать, для многих, думаю, будет затруднительно Вы правы. Есть с ними еще один неприятный момент: это не кросс-платформенно. Названия и свойства стилей - из winapi, GTK про них ничего не знает. В некоторых случаях, когда это надо, я симулирую поведение этих стилей в GTK версии, но в большинстве случаев они там просто игнорируются. С другой стороны: а какова альтернатива ? Возможных стилей великое множество и повторить их все какими-то более удобными для использования средствами проблематично. К счастью, в большинстве случаев их вообще не надо использовать. И еще: все эти стили хорошо описаны в MSDN и прочих доступных источниках, мне меньще забот по документированию ).

alkresin: SergKis пишет: 3. Цифровой идентификатор контролов (виджетов) хорошо что есть, но помнить в большом проекте ..., хотелось бы символьное имя Цифровой идентификатор служит, в основном, для внутренних нужд, а символьный, кстати, есть - это имя переменной соответствующего объекта. Т.е., если у ва вот такой фрагмент кода: [pre] LOCAL oButton ... INIT DIALOG oDlg ... ... @ 20,200 BUTTON oButton CAPTION "ClickMe" ... ... [/pre] То вы можете обращаться к кнопке вот так: oDlg:oButton даже за пределами этой функции, если oDlg известен.


alkresin: SergKis пишет: 4. К сожалению, только INIT DIALOG оказался работоспособным, перенос примеров на child mdi не работают аналогично диалоговому окну MDI работают нормально. Есть примеры использования, утилита DbcH, например, построена на них. Возможно, ваши проблемы были связаны с тем, что MDI окно - это немодальный объект, в отличие от обычного модального диалога, поэтому его надо использовать немного по-другому - так, как немодальный диалог.

alkresin: SergKis пишет: 5. HBrowse очень мелькающий (переотображениями), Получить координаты ячеки текущей или какой то оказалось не просто, но получил Хм... Переотображений я что-то не замечал, разве что когда у меня медленное соединение с сервером. Вот если вы открываете локальную таблицу тем же dbchw, есть какие-то мелькания ? По координатам - см. метод HBrowse():Edit() - там вычисляются координаты ячейки, чтобы отредактировать ее. Кстати, а зачем они вам ? Мне ни разу не понадобились. 6. HBrowseEx по мельканию лучше, но получить координаты ячейки не получилось. Многострочный заголовок получается нормально, но Super Header отсутсвует. Есть я так понял механизм задания врисовки в ячейку (сложноватый показалось, особенно в запоминании) 7. ButtonEx с image без подборки позиции PICTUREMARGIN 7 не смотрится совсем @ 350, 50 BUTTONex oBtBuild CAPTION "Build" SIZE 88,52 FONT oFBtn BITMAP oImgBuild:Handle ; ON Click { || hwg_MsgInfo("Build button") } TRANSPARENT PICTUREMARGIN 7 @ 350,110 BUTTONex oBtExit CAPTION "Exit" SIZE 88,52 FONT oFBtn BITMAP oImgExit:Handle ; ON Click { || hwg_MsgInfo("Exit button") } TRANSPARENT PICTUREMARGIN 7 По всем -ex классам из contrib не хочется комментировать, чтобы не обидеть авторов. Просто рекомендую пользоваться только теми, что в основном наборе. Если нужна картинка на кнопке, используйте ownerbutton - с недавним добавлением стилей (HStyle) они выглядят вполне прилично.

alkresin: SergKis пишет: 8. В Get задание цвета через STATIC переменную, работает, но при наличии объектов, смотрится (может только мне) страно Не понял, о какой STATIC переменной речь ? Конечно реакция на события (из за отсутсвия базы, как в минигуи) мгновенная, понравиловилось присутсвие везде bOther обработчика, установка клавиш не через hotkey, но без больших вложений (времени и труда) трудно применимо. Проблема в отсутствии адекватной документации, это я и пытаюсь сейчас исправить.

SergKis: alkresin пишет Не понял, о какой STATIC переменной речь ? [pre2] STATIC lColorinFocus := .F. STATIC tColorinFocus := 0 STATIC bColorinFocus := 16777164 ... CLASS HEdit INHERIT HControl ... FUNCTION hwg_SetColorinFocus( lDef, tColor, bColor ) IF ValType( lDef ) <> "L" RETURN .F. ENDIF lColorinFocus := lDef IF tColor != Nil tColorinFocus := tColor ENDIF IF bColor != Nil bColorinFocus := bColor ENDIF RETURN .T. ... пример testget2.prg Function DlgGet(lColor) ... If lColor <> Nil hwg_SetColorinFocus( lColor ) EndIf [/pre2]

SergKis: alkresin пишет С другой стороны: а какова альтернатива ? Возможных стилей великое множество и повторить Все варианты, дествительно не опишешь, но часто используемые (несколько вариантов), возмоожно заложить в init окон, самому пришлось вспоминать, лазить по источникам (в VO об этом приходилось помнить, с MiniGui уже подзабыл)

SergKis: alkresin пишет То вы можете обращаться к кнопке вот так: oDlg:oButton даже за пределами этой функции, если oDlg известен Вот именно, если известен oDlg, oButton. А ели управление с др. окна, контролами, надо их минимум делать PRIVATE\PUBLIC или по цифровомоу id, да даже в пунктах меню (там я имею объект окна) к контролам как обращаться, что бы попроще. К переменным PRIVATE\PUBLIC у меня стойкое убеждение использовать осторожно ( мусоросборщих их таскает туда сюда), в минигуи редко но бывает (прогу не выгружают неделями), переменная PUBLIC обявленная и инициализированная {NIL,NIL,NIL} после сборки мусора превращается в NIL, приходится ставить контроль ситуации типа переменной.

alkresin: SergKis пишет: STATIC lColorinFocus := .F. STATIC tColorinFocus := 0 STATIC bColorinFocus := 16777164 ... Это цвет GET-элемента, получающего фокус, он обычно один и тот же для всех GET-элементов, поэтому и сделан общим. Можно было определить через CLASS VAR - но это, в принципе, одно и то же. Собственно цвет, текста и фона - в переменных объекта, :tcolor и :bcolor.

alkresin: SergKis пишет: Вот именно, если известен oDlg, oButton oButton хранить нигде не надо, oDlg можно всегда найти: если это модальный диалог, то с hwg_GetModalDlg(), если главное окно, HWindow():GetMain(), MDI - HWindow():GetMdiActive(). Т.е., если вы знаете, например, что в текущем модальном диалоге есть кнопка, объект которой назван oButton LOCAL переменная), то из любой функции вы можете обратиться к этому объекту как hwg_GetModalDlg():oButton. И никаких PUBLIC, PRIVATE, STATIC.

SergKis: alkresin пишет он обычно один и тот же для всех GET-элементов, Это и смущает. Как сделать (в фокусе) 1. сумма < 0 один цвет 2. сумма > 0 < 1000 другой 3. сумма от 1000-5000 еще цвет 5. сумма > 5000 еще 6. ставку налога (или сумму) от этих сумм тоже цветами 7. теперь даты, прошлый год - цвет, прошлые месяцы тек. отч. периода - цвет, тек. месяц выходные - еще цвет 8. а добавим еще окно где все похоже, но немного\сильно отличается. Это ж как надо выеживаться, что бы сохранять\устанавливать, может я что не догоняю, конечно ... Если эти переменные в объекте вопросов нет, блок кода на них в oget и понятно, создал, установил критерии и забыл.

SergKis: alkresin пишет hwg_GetModalDlg():oButton. И никаких PUBLIC, PRIVATE, STATIC. Скорее танцуем так, имеем одно-два окна карточки, находимся на модал диалог и на нем делаем манимуляции, отражающиеся на др. окнах. Все окна собраны динамически от каких то установок (контролы-виджеты набраны динамически), т.е. надо проверить наличие контрола(ов) на др.окне(х) и вк.\выкл. алгоритмы заплнения\расчетов и. т.д. от тек.модального

alkresin: SergKis пишет: Это и смущает. Как сделать (в фокусе) Если надо, чтобы перед заходом в GET он менял свой цвет в зависимости от содержимого, то самое напрашивающееся решение - прописать это в кодоблоке WHEN этого GET'a, поставить там соответствующие oGet:SetColor( tColor, bColor )

alkresin: SergKis пишет: Скорее танцуем так, имеем одно-два окна карточки, находимся на модал диалог и на нем делаем манимуляции, отражающиеся на др. окнах. Все окна собраны динамически от каких то установок (контролы-виджеты набраны динамически), т.е. надо проверить наличие контрола(ов) на др.окне(х) и вк.\выкл. алгоритмы заплнения\расчетов и. т.д. от тек.модального Для такого случая тоже нетрудно что-нибудь придумать. Если неудобно использовать имена объектов, можно передавать нужные объекты как параметры процедуре модального диалога (в массиве, если их слишком много), можно в :cargo хранить тот самый строковый id и потом искать по нему, ...

SergKis: alkresin пишет прописать это в кодоблоке WHEN этого GET'a, поставить там соответствующие oGet:SetColor( tColor, bColor ) Вот и получаются "пляски с бубном" во WHEN (востановить), VALID (сохранить), на GOT FOCUS окна (массив сохранить) и т.д. и т.п., а просится добавить в HEDIT DATA tColorinFocus DTA bColorinFocus которые могут быть блоками кода, как в них (блоках) доставать контролы с др. окон - это др. вопрос У себя мы добавили в окна и контролы DATA cID и в методе поиска окна, контрола, если первый параметр "C" поиск по cID, иначе как было и многие вопросы отпали

SergKis: alkresin пишет метод HBrowse():Edit() - там вычисляются координаты ячейки, чтобы отредактировать ее. Кстати, а зачем они вам ? Мне ни разу не понадобились. Это странно. У ячейки получить контекстное меню, др. окно для манипуляций (типа achoice, др. hbrowse, ... [с заголовком или без]), в footer ячейки (по клику или без) положить Get для поисков, ну т.д.

SergKis: alkresin пишет MDI работают нормально. Может я что то не то делаю, пример с dialog и child окнами http://my-files.ru/d6gydy 1. На диалоговом окне работает VK_TAB перемещая фокус, на чилд окне фокус на get надо мышой установить и VK_TAB работает только на get на кнопки не прерходит 2. "Танец с бубнами". - запускаем пункт меню Create DlgGet window. Имеем один цвет первого get в фокусе - запускаем пункт меню Get using SetcolorinFocus. Имеем то что и должно по установке - запускаем пункт меню Create DlgGet window снова. Имеем цвет первого get в фокусе из пред. пункта

SergKis: alkresin пишет Переотображений я что-то не замечал, разве что когда у меня медленное соединение с сервером Пример http://my-files.ru/4tcwwc (DbcHw.txt переименовать в DbcHw.exe файлообменник не пропускал сразу с exe) Открываем K1.DBF в проге и двигаем курсор вправо\влево не переходя на скрытые колонки справа (т.е. все действия ТОЛЬКО на 1-м экране таблицы) Когда будем перемещаться по узким колонкам эффект мерцания\гирлянды проявится (особенно, если подержать клавиши влево\вправо нажатыми)

SergKis: alkresin По HBrowse, я правильно понимяю: 1. многострочный заголовок есть 2. многострочный подвал есть 3. многострочной строки нет (однострочная) 4. Super header отсутствует и сделать, что то похожее (на картинке нижнее окно) не получится http://shot.qip.ru/00QROn-1MgWBROLR/

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() может быть вызван в любое время.

SergKis: alkresin пишет: нужна обработка WM_KILLFOCUS. Нужна также и обработка WM_SETFOCUS Я Имел ввиду в том виде, как было. Как сбросил текст метода, увидел, что пропустил [pre2] добавляем в класс DATA tColorinFocus DATA bColorinFocus DATA lFocused INIT .F. METHOD SetColorReal( lFocus ) CLASS HEdit LOCAL tC := ::tColor LOCAL bC := ::bColor LOCAL xC ::lFocused := ! empty(lFocus) If ::lFocused If lColorinFocus tC := tColorinFocus bC := bColorinFocus Else If ::tColorinFocus != NIL tC := ::tColorinFocus EndIf If ::bColorinFocus != NIL bC := ::bColorinFocus EndIf 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 и IF msg == WM_SETFOCUS ::SetColorReal(.T.) ::Refresh() ELSEIF msg == WM_KILLFOCUS ::SetColorReal(.F.) ::Refresh() тогда все что работало по старой схеме (STATIC переменные), должно работать и без них можно работать со свойствами объекта, согласен, в Refresh() вставлять не надо. [/pre2] alkresin пишет: Увы, надо Возможно. Я только вчера бегло глянул на содержимое HEdit (дома ремонт, к компу набегаю с зачумленной головой)

SergKis: alkresin пишет: Странно. Всматривался во все глаза несколько раз, но светлозеленых клеточек не увидел. Повторю др. карточку - аналог (в той задаче есть рус. яз., хотел чтоб понятней было). В текстовом файле кусок кода реализации http://my-files.ru/xtcnl1

alkresin: SergKis пишет: тогда все что работало по старой схеме (STATIC переменные), должно работать и без них можно работать со свойствами объекта, согласен, в Refresh() вставлять не надо. Надо еще :aColorOld задействовать - словом, получается примерно то, что я и сделал, только с двумя отдельными кодоблоками для текста и фона вместо одного, на котором я по-прежнему настаиваю. А вот в Refresh(), наверное, надо все-таки вставить что-то вроде: [pre2]IF !Empty(::bColorBlock) .AND. hwg_isPtrEq(::handle,hwg_getFocus) Eval( ::bColorBlock, Self ) ENDIF[/pre2] Раз есть такой кодоблок для смены цвета по условию, надо его использовать при смене содержимого GET, имеющего фокус.

alkresin: SergKis пишет: Нашел свои опыты с hbrowse, где видно, как мерцает переотображение selected строки при горизонтальном перемещении Убрал мерцание.

SergKis: alkresin пишет: Надо еще :aColorOld задействовать Не очень понимаю, для чего. В фокусе идет со static переменных, если назначено (или новых свойств), не в фокусе из ::tColor, ::bColor и источники не меняются. Но вам виднее, я что то пропускаю, наверно (башка забита ремонтом). на котором я по-прежнему настаиваю это ваше право, я только предложил.

alkresin: SergKis пишет: Не очень понимаю, для чего. В фокусе идет со static переменных, если назначено (или новых свойств), не в фокусе из ::tColor, ::bColor и источники не меняются. В том-то и дело, что меняются. Метод :SetColor() устанавливает новые значения ::tColor, ::bColor.

SergKis: alkresin пишет: Метод :SetColor() устанавливает новые значения ::tColor, ::bColor. Тогда не надо исп. SetColor(...) из CLASS HCustomWindow, надо SetColorReal, сделать SetColor(...) и произвести все действия от пполученных переменных tC, bC - добавиться несколько строк.

alkresin: SergKis пишет: Тогда не надо исп. SetColor(...) из CLASS HCustomWindow, надо SetColorReal, сделать SetColor(...) и произвести все действия от пполученных переменных tC, bC - добавиться несколько строк. Увы, это невозможно. :SetColor() не раскрашивает control самостоятельно, он устанавливает новые значения :tColor, :bColor, которые используются уже в другое время и в другом месте: методом :onCtlColor() при обработке сообщения WM_CTLCOLOREDIT, это особенности WinAPI, уж так он сделан.

SergKis: alkresin пишет: при обработке сообщения WM_CTLCOLOREDIT Увидел обработчик, да без :aColorOld не обойтись. Немного понятней стала организация, спасибо за разъяснения.

alkresin: SergKis пишет: 4. Super header отсутствует и сделать, что то похожее (на картинке нижнее окно) не получится Посмотрел это дело внимательнее, и выяснилось, что возможность сделать этот Super header все же есть. Еще в 2003 году ( полезная вещь Changelog) ) Павел Царенко прислал код для расчерчивания ячеек заголовка. В принципе, все достаточно просто. Для каждой колонки указывается :cGrid, там информация по каждой строке заголовка отделяется точкой с запятой ( так же делятся строки и в тексте заголовка. Так вот, в этом :cGrid указывается, с какой стороны рисовать разделительную линию с помощью букв N(North), S(South), W(West), E(East). Т.е., если мы хотим в Super header объединить 2 и 3-ью колонки, то можем написать: [pre]oBrw:aColumns[2]:cGrid := "W;WN" oBrw:aColumns[2]:heading := "Super header;col1" oBrw:aColumns[3]:cGrid := "E;EN" oBrw:aColumns[3]:heading := ";col2"[/pre] Единственно, что надо сделать - чтобы в этом случае текст "Super header" автоматически размещался по центру двух колонок.

SergKis: alkresin пишет: Т.е., если мы хотим в Super header объединить 2 и 3-ью колонки, то можем написать: Такая штука, вроде, и реализована в HBrowseEx. Точно не скажу, уже отключился от hwg

SergKis: alkresin пишет: Единственно, что надо сделать - чтобы в этом случае текст "Super header" автоматически размещался по центру двух колонок Как быть с image в таком Super header (слева\справа от текста) и image в колонке col1 и col2 (для индикации уст. ордера, например) ?

alkresin: SergKis пишет: Как быть с image в таком Super header (слева\справа от текста) и image в колонке col1 и col2 Думал недавно на эту тему. Хочу сделать для колонки (oColumn) пользовательский кодоблок, который рисует все, что надо и будет вызываться при прорисовывании заголовка. При необходимости ( смене ордера, например ) его надо будет просто переставить из одного oColumn в другой. А можно сделать массив таких кодоблоков - как сделал недавно в HPanel - разные фрагменты программы могут добавлять туда свои рисующие кодоблоки.

SergKis: alkresin пишет: Хочу сделать для колонки (oColumn) пользовательский кодоблок, который рисует все, что надо Если на нем, делать строки, header, footer и т.д., то это замечательно, а если заложить в HBrowse двойную буферизацию ("раз пошла такая пъянка") - это вооооооооще SUPER !

alkresin: По идее, нужны отдельные кодоблоки для строк, header, footer. Кроме того, хорошо бы иметь кодоблок, который рисует весь объект, скажем, header, и кодоблок, который рисует только фон - если вы хотите по-своему нарисовать фон, но не хотите заморачиваться с рисованием всего остального. А еще кодоблоки, которые рисуют отдельные элементы. Скажем, вас устраивает стандартный header, но вы хотите после того как он нарисуется пририсовать какой-либо значок (тот же знак установки сортировки) - причем, теоретически, таких кодоблоков может быть больше одного. Поэтому я думаю сделать массив кодоблоков, куда можно будет добавлять их, например, так: [pre2]oColumn:SetPaint( PAINT_HEADER_ALL, block1 ) oColumn:SetPaint( PAINT_LINE_BACKGROUND, block2 )[/pre2] а HwGUI будет находить и запускать их в соответствующие моменты времени вместо каких-то своих стандартных действий. Боюсь только, не слишком ли это будет "накручено" для пользователя. а если заложить в HBrowse двойную буферизацию Ну это нетрудно - всего несколько строк добавить, как это сделано в source/common/hcedit.prg, например: [pre] hDCReal := hwg_BeginPaint( ::handle, pps ) aCoors := hwg_GetClientRect( ::handle ) hDC := hwg_CreateCompatibleDC( hDCReal ) hBitmap := hwg_CreateCompatibleBitmap( hDCReal, aCoors[3]-aCoors[1], aCoors[3]-aCoors[1] ), aCoors[4]-aCoors[2] ) hwg_Selectobject( hDC, hBitmap ) ... hwg_BitBlt( hDCReal, 0, 0, aCoors[3] - aCoors[1], aCoors[4] - aCoors[2], hDC, ::nShiftL, 0, SRCCOPY ) hwg_DeleteDC( hDC ) hwg_DeleteObject( hBitmap ) hwg_EndPaint( ::handle, pps )[/pre] но надо ли ? Я убрал многие моменты, которые могли приводить к перерисовке фрагментов browse и сейчас, вроде, мерцания нет.

SergKis: alkresin пишет: но надо ли ? Работа с сервером напрямую (без skipов, медленное соединение...). В минигуи мы вынуждены были сделать такое (старая версия) в browse (ListView). Мне думается это облегчит жизнь всем, тем более Ну это нетрудно - всего несколько строк добавить Поэтому я думаю сделать массив кодоблоков Наверно, да. Возможно такой массив (объект) организовать для ячейки и далее распространить его на строку и механизм строки распространить на hedar, super header, footer, тогда и super footer получится автоматом. Заложить средние (это условно) возможности в общее поведение browse, а т.к. это скорее всего будут классы, то наследованием можно усложнить поведение до нужных кондиций по надобности

SergKis: alkresin пишет: Боюсь только, не слишком ли это будет "накручено" для пользователя. Думаю, пользователей обрадует, расширение возможностей. "Упрощенный" вариант ляжет в #xcommand ..., а "развитой" в объектах. Это от трудоемкости реализации зависит.

alkresin: Буферизацию добавил.

alkresin: Еще добавил переменную HBrowse :lBuffering ( .F. по умолчанию ), чтобы включать при необходимости буферизацию.

SergKis: alkresin пишет Еще добавил переменную HBrowse :lBuffering Проверил оба режима на bc, все оч. хорошо . Msvc и сервер сейчас проверить не могу, не дома (где то через нельку только)

SergKis: alkresin пишет IF !Empty(::bColorBlock) .AND. hwg_isPtrEq(::handle,hwg_getFocus) Eval( ::bColorBlock, Self ) ENDIF Раз есть такой кодоблок для смены цвета по условию, надо его использовать при смене содержимого GET, имеющего фокус. Этот блок кода надо выполнять всегда и в фокусе и не в фокусе. Пример: от выражения (см. выше для числа) уст. FontColor, одинаковый и для в фокусе и для не в фокусе, а BackColor для них разный oGet:Value( -100 ); oGet:Refresh() oGet:Value( 100 ); oGet:Refresh() oGet:Value( 1001 ); oGet:Refresh() и еще это труднозапоминаемое hwg_Isptreq( ::handle, hwg_Getfocus() ) может сделать ::lFocused переменную или ACCESS IsFocused INLINE hwg_Isptreq( ::handle, hwg_Getfocus() ) oGet:IsFocused oGet:lFocused как то лучше запоминается

SergKis: Понял, что меня все время смущало в работе с цветом HEdit, переменные ::tColor и ::bColor все время меняют свои значения, т.е. ведут себя как рабочие переменные (::aColorOld), т.е. в классе нет переменных источников для цвета. Предложение:[pre2] DATA nFColor DATA nBColor DATA lFocused INIT .F. METHOD SetColor( tcolor, bColor, lRepaint ) CLASS HEdit If ::nFColor == Nil ::nFColor := tcolor EndIf If ::nBColor == Nil ::nBColor := bColor EndIf If ::nFColor == Nil ::nFColor := 0 EndIf RETURN Super:SetColor( tcolor, bColor, lRepaint ) METHOD SetColorReal() CLASS HEdit LOCAL tC := ::nFColor LOCAL bC := ::nBColor LOCAL xC If ::lFocused .and. lColorinFocus tC := tColorinFocus bC := bColorinFocus 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 Super:SetColor( tC, bC, .T. ) RETURN METHOD Refresh() CLASS HEdit LOCAL vari ::SetColorReal() IF hb_isBlock( ::bSetGet ) vari := Eval( ::bSetGet, , self ) IF vari == Nil vari := "" ENDIF IF !Empty( ::cPicFunc ) .OR. !Empty( ::cPicMask ) vari := Transform( vari, ::cPicFunc + iif( Empty(::cPicFunc ),""," " ) + ::cPicMask ) ELSE vari := iif( ::cType == "D", Dtoc( vari ), iif( ::cType == "N",Str(vari ),iif(::cType == "C",vari,"" ) ) ) ENDIF ::title := vari hwg_Setdlgitemtext( ::oParent:handle, ::id, vari ) ELSE hwg_Setdlgitemtext( ::oParent:handle, ::id, ::title ) ENDIF // IF ::bColorBlock != Nil .AND. hwg_Isptreq( ::handle, hwg_Getfocus() ) // Eval( ::bColorBlock, Self ) // ENDIF RETURN Nil и IF msg == WM_SETFOCUS ::lFocused := .T. ::Refresh() ELSEIF msg == WM_KILLFOCUS ::lFocused := .F. ::Refresh() тогда должны совместиться старые тексты с исп. hwg_SetColorinFocus( lColor, ... ) и ::SetColor(...) и добавится возможность ставить ::nFColor := {|o,v| v := o:Value(), iif(v < 0, ..., iif(v >=0 .and. v <= 1000, ... } ::nBColor := {|o| iif(o:lFocused, ..., ...) } [/pre2]

SergKis: PS в Refresh() ::SetColorReal() конечно надо вместо строк с //

alkresin: Добавил массивы кодоблоков в HColumn() и метод SetPaintCB( nId, block, cId ), чтобы их добавлять, менять и удалять. В guilib.ch - предопределенные значения nId: PAINT_LINE_ALL - рисует всю ячейку PAINT_LINE_BACK - рисует только фон и передает управление обратно HwGUI для рисования текста PAINT_LINE_ITEM - вызывается после того, как ячейка отрисована, чтобы нарисовать там дополнительные элементы То же самое для Header и Footer: PAINT_HEAD_ALL PAINT_HEAD_BACK PAINT_HEAD_ITEM PAINT_FOOT_ALL PAINT_FOOT_BACK PAINT_FOOT_ITEM Пример использования помещен в tutor. Секция "Advanced using of controls", модуль "Browse" - там простенький Super Header, смена порядка при щелчке по заголовку - и отображение его в заголовке, нарисованная ячейка.

SergKis: alkresin По документации. Дистрибутив HwGUI представляет собой архивный файл, без какой-либо установочной программы. Это может быть zip - архив, если он предназначен для Windows, или tar.gz, tar.bz2, если для Linux. Вам надо просто распаковать его в любое место, которое вы сочтете подходящим ... Установка C:\BORLAND\BCC55 C:\MiniGUI\Harbour C:\HwGui с добавкой в bat файлы сборки set path=c:\minigui\harbour\bin;c:\borland\bcc55\bin; set hb_path=c:\minigui\harbour\bin не собирают libы, примеры собираются через hbmk2 (примеры) [pre2] c:\HwGui\_hbmk2.bat @echo off cls set path=c:\minigui\harbour\bin;c:\borland\bcc55\bin; set hb_path=c:\minigui\harbour\bin echo ------- hwgui.hbp -------- > _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace hwgui.hbp >> _hbmk2.txt echo ------- hbxml.hbp -------- >> _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace hbxml.hbp >> _hbmk2.txt echo ------- hwgdebug.hbp -------- >> _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace hwgdebug.hbp >> _hbmk2.txt echo ------- procmisc.hbp -------- >> _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace procmisc.hbp >> _hbmk2.txt C:\HwGui\contrib\_hbmk2.bat @echo off cls set path=c:\minigui\harbour\bin;c:\borland\bcc55\bin; set hb_path=c:\minigui\harbour\bin echo ------- hbactivex.hbp -------- > _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace hbactivex.hbp >> _hbmk2.txt echo ------- hwg_extctrl.hbp -------- >> _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace hwg_extctrl.hbp >> _hbmk2.txt echo ------- hwg_qhtm.hbp -------- >> _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace hwg_qhtm.hbp >> _hbmk2.txt C:\HwGui\samples\_hbmk2.bat @echo off cls if %1.==. goto e set path=c:\minigui\harbour\bin;c:\borland\bcc55\bin; set hb_path=c:\minigui\harbour\bin if not exist hwgui_xp.rc echo 1 24 "..\image\WindowsXP.Manifest" > hwgui_xp.rc echo -------------- %1 -------------------- > _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace ..\hwgui.hbc hwgui_xp.rc %1 >> _hbmk2.txt :e C:\HwGui\tutorial\_hbmk2.bat @echo off SET P=tutor.prg set path=c:\minigui\harbour\bin;c:\borland\bcc55\bin; set hb_path=c:\minigui\harbour\bin if not exist hwgui_xp.rc echo 1 24 "..\image\WindowsXP.Manifest" > hwgui_xp.rc echo ------- %P% -------- > _hbmk2.txt %hb_path%\hbmk2.exe -info -comp=bcc -trace ..\..\hwgui.hbc hwgui_xp.rc %P% >> _hbmk2.txt [/pre2]

SergKis: alkresin пишет Пример использования помещен в tutor. Бросается в глаза сразу: 1. Стиль прорисовки "Some data" отличается от "Age", "Salary" (даже по цвету) 2. "Name" не центровано по вертикали в своей колонке по умолчанию 3. Наведение мыши справа за текстом "Salary" (далеко еще до вертикальной разд.линии) превращает курсор мыши в вид, предназначенный для изменения ширины колонки. 4. Клик по "Salary" работает как клик по "Age", а не должен был бы так себя вести (как то надо различать эти клики) 5. Как заменить, предлагаемую индикацию уст. ордера, на свою bmp ?

SergKis: SergKis пишет 4. Клик по "Salary" работает как клик по "Age" надо так 4. Клик по "Some data" работает как клик по "Age"

Петр: SergKis пишет: set hb_path=c:\minigui\harbour\bin Так в документации (англ.) ж вроде просто SET HB_PATH=c:\harbour или SET HB_PATH=c:\minigui\harbour У меня собралось. вот в стандартные батники setlocal / endlocal добавить было бы не плохо (в помощь ленивому ).

alkresin: Петр пишет: SET HB_PATH=c:\harbour Точно. И в русской тоже. вот в стандартные батники setlocal / endlocal добавить было бы не плохо А что это ?

alkresin: SergKis пишет: 1. Стиль прорисовки "Some data" отличается от "Age", "Salary" (даже по цвету) Потому что именно так и было задумано - в кодоблоке bBack. 2. "Name" не центровано по вертикали в своей колонке по умолчанию В HBrowse по умолчанию выравнивание влево. 3. Наведение мыши справа за текстом "Salary".. А.. ну да, это потому что колонка последняя, надо будет поправить. 4. Клик по "Some data" работает как клик по "Age" Значит, кликнули на header над "Age". 5. Как заменить, предлагаемую индикацию уст. ордера, на свою bmp ? В bDrawOrd использовать hwg_drawbitmap() или hwg_Drawtransparentbitmap() вместо hwg_DrawLine().

Петр: alkresin пишет: А что это ? описание команды SETLOCAL

alkresin: Петр пишет: описание команды SETLOCAL Спасибо. Не знал. Но пока не очень представляю, как это можно использовать.

SergKis: Петр пишет Так в документации (англ.) ж вроде просто SET HB_PATH=c:\harbour или SET HB_PATH=c:\minigui\harbour У меня собралось. Не собирается у меня. samples\bld.bat [pre2] @echo off set path=c:\minigui\harbour\bin;c:\borland\bcc55\bin; set hb_path=c:\minigui\harbour set HRB_DIR=%HB_PATH% set HWGUI_INSTALL=.. ... запуск bld.bat Browse_1 > _.txt _0.txt Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland browse_1.c: Error E2209 c:\minigui\harbour\include\hbdefs.h 50: Unable to open include file 'stdarg.h' Error E2209 c:\minigui\harbour\include\hbdefs.h 51: Unable to open include file 'stdio.h' Error E2209 c:\minigui\harbour\include\hbdefs.h 52: Unable to open include file 'stdlib.h' Error E2209 c:\minigui\harbour\include\hbdefs.h 53: Unable to open include file 'string.h' Error E2209 c:\minigui\harbour\include\hbdefs.h 54: Unable to open include file 'limits.h' Error E2293 c:\minigui\harbour\include\hbdefs.h 517: ) expected Error E2188 c:\minigui\harbour\include\hbdefs.h 523: Expression syntax Error E2257 c:\minigui\harbour\include\hbdefs.h 555: , expected Error E2188 c:\minigui\harbour\include\hbdefs.h 583: Expression syntax Error E2257 c:\minigui\harbour\include\hbdefs.h 617: , expected Error E2451 browse_1.c 49: Undefined symbol 'NULL' Error E2141 browse_1.c 49: Declaration syntax error Error E2190 browse_1.c 49: Unexpected } Error E2190 browse_1.c 49: Unexpected } Error E2040 browse_1.c 49: Declaration terminated incorrectly Error E2190 browse_1.c 100: Unexpected } Error E2190 browse_1.c 100: Unexpected } Error E2109 browse_1.c 100: Not an allowed type in function hb_vm_SymbolInit_BROWSE_1 *** 18 errors in Compile *** Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: Unable to open file 'C0W32.OBJ' [/pre2]

alkresin: SergKis пишет: Error E2209 c:\minigui\harbour\include\hbdefs.h 50: Unable to open include file 'stdarg.h' Т.е., Харборовские *.h он находит, а *.h от Borland C не может найти. Такое впечатление, что у вас c:\borland\bcc55\bin\bcc32.cfg не настроен. там должно быть: -I"c:\Borland\Bcc55\include" -L"c:\Borland\Bcc55\lib" Странно. Вы этот компилятор не использовали с minigui ?

Петр: alkresin пишет: Но пока не очень представляю, как это можно использовать. Да нет это я так по привычке, зачем все усложнять SergKis пишет: Не собирается у меня. samples\bld.bat И у меня Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c: Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: Unable to open file 'HWG_QHTM.LIB' Ну это понятно, м.б. лучше по аналогии с hbactivex.lib написать if exist %HWGUI_INSTALL%\lib\hwg_qhtm.lib echo %HWGUI_INSTALL%\lib\hwg_qhtm.lib + >> b32.bc

SergKis: alkresin пишет: Странно. Вы этот компилятор не использовали с minigui ? Минигуи как раз им и пользую (примеры только). Там все хорошо. c:\borland\bcc55\bin\bcc32.cfg Его совсем нет. Обычно направление на include, lib, obj в bat задаются, но я по шагам инструкции шел.

SergKis: alkresin пишет: Т.е., Харборовские *.h он находит, а *.h от Borland C не может найти Это все понятно, понятно, что надо добавлять в bat set bc_path=..., но там и vc, mingw. Может отказаться уже от bat и перейти на hbmk2 ? Вроде работает.

Петр: SergKis пишет: но я по шагам инструкции шел. Но ведь это не инструкция по установке борландовского компилятора, да? Предполагается, что компилятор уже установлен. А вот другая инструкция How-To: Install and Configure Borland® Free Command Line Tools

SergKis: Петр пишет А вот другая инструкция Совершенно верно, но устанавливать, пытаться что то сделать, могут люди разной квалификации. Многим она не нужна, сразу в тексты лезут и быстро врубаются, а кто то пробует, споткнулся, вроде мелочь, а в результате - грустно и время потеряно. Ясно же, надо или batы доводить (надеюсь посылать на инструкцию по написанию их тут не будем) или перходить на hbmk2, т.е. ткнули - получили положительный результат и полжительные эмоции.

Andrey: SergKis пишет: т.е. ткнули - получили положительный результат и положительные эмоции. Люблю очень положительные эмоции !!!

SergKis: alkresin пишет: 3.5. Обзор виджетов. ... Далее идут несколько виджетов, о которых мне почти нечего сказать. ... . Pager, Rebar, Animation - не очень представляю, где и зачем я мог бы их использовать... Пример для Rebar http://my-files.ru/ubrt5z В меню "Dialog" смотреть

alkresin: SergKis пишет: Ясно же, надо или batы доводить (надеюсь посылать на инструкцию по написанию их тут не будем) или перходить на hbmk2, т.е. ткнули - получили положительный результат и полжительные эмоции. Да кто ж мешает вам Hbmk использовать ? В новой локументации про это написано: 2.4. Сборка приложений с HwGUI В bat файлах все нормально, надо только с hwg_qhtm.lib поправить - правильно Петр написал. Просто bcc32.cfg и TLink32.cfg действительно должны присутствовать, это делается всегда при установке/настройке Borland C. Я предпочитаю использовать bat, потому что с ним вижу все, что делаю: что запускается, какие библиотеки используются, какие опции компилятора/линкера, ...

ММК: alkresin пишет: Просто bcc32.cfg и TLink32.cfg действительно должны или iLink32.cfg :)

alkresin: SergKis пишет: Этот блок кода надо выполнять всегда и в фокусе и не в фокусе. Пример: от выражения (см. выше для числа) уст. FontColor, одинаковый и для в фокусе и для не в фокусе, а BackColor для них разный Не надо примешивать сюда изменение цветов в зависимости от содержимого, это другая песня: все, о чем здесь шла речь - это ColorInFocus, цвет GET'a, находящегося в фокусе. и еще это труднозапоминаемое hwg_Isptreq hwg_IsPtrEq() - Is Pointer Equal - так легче запомнить. Можно было бы использовать просто ( :;handle == hwg_GetFocus() ), но, насколько я помню, в xHarbour нельзя сравнивать POINTER'ы, так что эта функция здесь для совместимости. Что насчет добавления нового метода или переменной в класс, я делаю это с большой осторожностью и неохотой, только когда это действительно очень полезно - иначе через какое-то время класс превратится в монстра.

alkresin: SergKis пишет: Понял, что меня все время смущало в работе с цветом HEdit, переменные ::tColor и ::bColor все время меняют свои значения, т.е. ведут себя как рабочие переменные (::aColorOld), т.е. в классе нет переменных источников для цвета. :tColor и :bColor определяют актуальные значения цвета виджета, точно так же, как, например, :nWidth и :nHeight - актуальные значения его размера, и :SetColor() меняет эти актуальные значения, так же, как и :Move() меняет актуальные значения размера. Если просто принять эту логику, то ничего не должно смущать. Реализовать все это можно множеством разных способов, но нужны действительно серьезные основания, чтобы менять существующую реализацию.

SergKis: alkresin пишет: Реализовать все это можно множеством разных способов, но нужны действительно серьезные основания, чтобы менять существующую реализацию Я уже говорил, что принимать\менять - это вашо право, я излагаю (понятным мне языком чего я не понимаю в hwg) все, о чем здесь шла речь - это ColorInFocus, цвет GET'a, находящегося в фокусе. Возможно я беру шире, но пока не понимаю, как в GET (в фокусе\нет) реализовать чтобы циферки < 0 были красненькими, > 0 и <= 1000 синенькими и т.д., а фон для фокуса желтенький, не фокуса беленький. hwg_IsPtrEq() - Is Pointer Equal - так легче запомнить Я не понимаю, чем запись (это ж по всей проге такие конструкции писать) {|o| iif(hwg_Isptreq( o:handle, hwg_Getfocus() ), ..., ... ) } лучше к примеру {|o| iif(o:lFocused, ..., ...) }

alkresin: SergKis пишет: Возможно я беру шире, но пока не понимаю, как в GET (в фокусе\нет) реализовать чтобы циферки < 0 были красненькими, > 0 и <= 1000 синенькими и т.д., а фон для фокуса желтенький, не фокуса беленький. Примерно так: [pre]INIT DIALOG oDlg ... oDlg:bColorinFocus := желтенький ... @ ... GET ... VALID {|nVal,o|SetGetColor(nVal,o)} ... Function SetGetColor( nVal, oGet ) Local tColor := Iif(nVal... ) oGet:SetColor( tColor,, .T. ) oGet:Refresh() // чтобы можно было использовать SetGetColor() вместо oGet:Refresh() RETURN .T. [/pre] Я не понимаю, чем запись (это ж по всей проге такие конструкции писать) {|o| iif(hwg_Isptreq( o:handle, hwg_Getfocus() ), ..., ... ) } лучше к примеру {|o| iif(o:lFocused, ..., ...) } Не лучше. Но если для каждого возможного улучшения создавать новые переменные и методы класса, ... - я об этом уже писал. К тому же, если вы не пишете для xHarbour, можете использовать iif( o:handle == hwg_Getfocus(), ... ). Ну и в крайнем случае, если реально очень надо, можно ведь сделать субкласс от Hedit() и добавить туда нужный вам метод, ООП для того и существует. И, конечно, насчет всей проги вы загнули )

SergKis: alkresin пишет: надо, можно ведь сделать субкласс от Hedit() и добавить туда нужный вам метод, ООП для того и существует. Этим всю весну и часть лета мы с товарищем и занимались, при этом сыпятся все ch команды (получается своя версия, с которой трудно слезть при изм. версий hwg). В основном мой товарищ, двигал (MDI, HBrowseEx свой, а до HEdit даже не дошли) по семейным обстоятельствам, меня хватило в основном на примеры. Сечас нас съела, текучка и срочные изменения законодательсва. В итоге решили, что переводим на 3.2 свою старую (уникодную версию Минигуи) и остаемся на ней, а hwg второй раз (при всех плюсах) откладывается в ящик. К нашему сожалению

alkresin: SergKis пишет: Этим всю весну и часть лета мы с товарищем и занимались, при этом сыпятся все ch команды (получается своя версия, с которой трудно слезть при изм. версий hwg). Это вы долго что-то. Команды, конечно, добавляют неудобства в использование собственных субклассов, но изменяются они очень редко и проблем с этим быть не должно, тем более, что вам ведь не надо заменять весь guilib.ch. Достаточно просто создать свой заголовочный файл mycommands.ch с парой измененных команд (HEdit():New(... -> HEditEx():New(... ) и вставить #include "mycommands.ch" ПОСЛЕ #include "hwgui.ch" - тогда даже переименовывать команду не надо, возьмется ваша.

SergKis: alkresin пишет: Примерно так: Т.е. во WHEN ставим цвет для значения, поступающего в get, учитывая возврат .T.\.F., в VALID ставим цвет для значения, завершающего get, определяем фокус If hwg_Isptreq( oGet:handle, hwg_Getfocus() ) Else EndIf Если есть реальный алгоритм для значения по VALID его встраиваем, разделяя на ошибку\нет, встраиваем действия after Get (с учетом ошибки\нет) ... а Get не один, ... вернулись к "танцу с бубном" по кругу

alkresin: Что-то вы усложняете. Про WHEN вообще речи нет, а в VALID - да, надо вставить в кодоблок ваш алгоритм изменения цвета текста в зависимости от введенного значения. Куда-то же его все-равно придется вставить...

SergKis: alkresin пишет: Это вы долго что-то. 1. Время на это есть только вечером и частично в выходные. 2. Mdi практически с 0 в реальной структуре mdi 3. Меню тоже надо было под себя 4. За рыбу взят HBrowseEx, но все практически с 0, на отладке остановились 5. Старались не трогать базовые классы 6. ch команды надо делать по минигуи (тексты переносить надо) вот и набралось, что не подняли. Пример mdi и только menu http://my-files.ru/23znwg

alkresin: В русскую документацию добавлен раздел про классы HwGUI: http://www.kresin.ru/hwgdoc_classes.html. Пока почти без пояснений и комментариев - будут добавляться по мере возможности, зато список классов, их переменных и методов полный и актуальный.

alkresin: Добавлен раздел про функции HwGUI: http://www.kresin.ru/hwgdoc_functions.html. Комментариев на русском пока нет, зато список - полный.



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