Виджет browse

133 views
Skip to first unread message

Сергей Владимирович

unread,
Dec 3, 2018, 3:19:55 AM12/3/18
to guiserver
Вопрос такой можно ли в ячейке нарисовать кнопки(чтобы были разные обработчики)?
 Как менять стиль отдельной ячейки, строки, колонки (возможно динамически)(рекомендации)?



Сергей Владимирович

unread,
Dec 3, 2018, 4:15:01 AM12/3/18
to guiserver
Еще хотел спросить про подвал.
Навигацию по вводу(по строке, по колонке).
фиксированный размер колонки.
попадание в режим редактирование ячейки при активации.

У меня табельная программа. редактирование галки(пробелом да/нет)
и второй вариант числа, буквы.
Порядок обхода важен(и не только в browse).

alkresin

unread,
Dec 3, 2018, 8:57:58 AM12/3/18
to guiserver
Кнопки поместить в browse нельзя. Можно поставить контекстное меню, например, на щелчок правой кнопки мыши - будет произвольное количество обработчиков. Можно вместо browse сделать панель, на которой разместить упорядоченные по строкам и столбцам кнопки и пр.

Browse - самый навороченный виджет в HwGUI, у него куча свойств и методов, и надо еще хорошо продумать, как сделать их доступными из Go-программы наиболее удобным способом. Подробнее напишу попозже.

alkresin

unread,
Dec 5, 2018, 8:27:52 AM12/5/18
to guiserver
Browse, как я писал, имеет кучу свойств, я сейчас думаю, какие из них будет разумно устанавливать через Widget.AProps в дополнение к тем, что там уже есть. Так или иначе, какую-то часть, может большую, будем устанавливать через SetParam, например:
pBrw.SetParam("bColorSel", CLR_LGRAY)
Имена свойств надо будет включить в будущую документацию, а пока их можно смотреть в online документации по HwGUI: http://www.kresin.ru/hwgdoc_classes.html#Classes3_3_1
Вот некоторые:
tColorSel, bColorSel - цвете текста и фона выделенной строки
httColor, htbColor - цвете текста и фона выделенной ячейки
oStyleHead, oStyleFoot, oStyleCell - стили заголовка, подножья, (или как его правильно по-русски называть?) и ячеек с данными
headColor - цвет текста заголовка.

Для изменения свойств колонок надо использовать BrwSetColumn(), BrwSetColumnEx() - эту сегодня добавил.
BrwSetColumn() устанавливает основные свойства, а BrwSetColumnEx() работает как SetParam() - пример добавил в test1.go
Вот некоторые свойства колонок (см. http://www.kresin.ru/hwgdoc_classes.html#Classes5):
lResizable - если установить в false, не будет растягиваться
oStyleHead, oStyleFoot, oStyleCell - стили заголовка, подножья и ячеек с данными для этой колонки
tcolor, bcolor - цвете текста и фона колонки

Сергей Владимирович

unread,
Dec 5, 2018, 11:37:29 AM12/5/18
to guiserver
foot - подвал называю обычно.

хотел еще узнать может ли в одной строке цвет шрифта(фона) в колонке быть разный  в зависимости от условий.
на примере табеля: сотрудник уволился 10 числа  значит колонки с днями с 1 по 10 фон зеленый а с 10 до конца месяца фон желтый. А у другого сотрудника все дни зеленые.

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

И бордюр может ли рисоваться по разному: например толщина бордюра снизу 2, сверху и справа 1, слева нет бордюра.

alkresin

unread,
Dec 7, 2018, 3:55:10 AM12/7/18
to guis...@googlegroups.com
Эта возможность (я о цветах строк и ячеек) в HwGUI была давно, но здесь ее добавил только вчера/сегодня - надо было решить, как это сделать удобнее и проще. Скачайте сегодняшнее обновление guiserver, external и etutor. Пример я добавил в etutor (External GUI/browse) - сделал там "зебру".
 Все решается установкой кодоблока (Harbour скрипта) с помощью BrwSetColumnEx():

    var cbColor egui.CodeBlock = `private oBrw := Widg("main.brw")
if oBrw != Nil
  if oBrw:nPaintRow%2 == 0
    return {0,15658734,14116608,13421772}
  endif
endif
return {0,16777215,14116608,13421772}`

...
    egui
.BrwSetColumnEx(pBrw, 1, "bColorBlock", cbColor)
    egui
.BrwSetColumnEx(pBrw, 2, "bColorBlock", cbColor)
    egui
.BrwSetColumnEx(pBrw, 3, "bColorBlock", cbColor)

Здесь все просто. Скрипт получает по имени объект browse и, в зависимости от четности/нечетности номера текущей строки (oBrw:nPaintRow), возвращает те или иные цвета. Этот кодоблок всегда должен возвращать массив из четырех цветов: { текст, фон, текст выделенной строки, фон выделенной строки}.
Если условие сложнее, можно включить в массив специальный столбец с информацией для выбора, а колонку соответствующую потом удалить с помощью BrwDelColumn() - см. пример в tests/test1.go - там я добавил пятый элемент в массив и удалил его из browse. Там же, кстати, и пример с галочками. Если какую-то колонку заполнить "f" и "t" (в примере - 4-ая колонка), то при нажатии пробела там будет ставиться/сниматься галочка.

А по поводу border надо подумать. Сейчас там его рисует сам Windows (стиль по умолчанию WS_BORDER). Можно будет позволить задать отрисовывание границы с помощью кодоблока.

Сергей Владимирович

unread,
Feb 15, 2019, 8:16:38 AM2/15/19
to guiserver
egui.CodeBlock = `private oBrw := Widg("main.brw")
main это что?
в диалоговом окне полосатость не получилась. вместо main что то надо написать?

alkresin

unread,
Feb 18, 2019, 4:26:50 AM2/18/19
to guiserver
main.brw - это полное имя виджета, которое складывается из имени окна, которому он принадлежит и его собственного имени (параметр Name). Имя главного окна - всегда main. Имя диалога формируется автоматически, но в тех случаях, когда его надо использовать, его можно задать с помощью того же Name:

pDlg := &egui.Widget{Name: "dlg1", ...

В этом случае полное имя этого виджета будет dlg1.brw. Если он еще и на панели pane1 расположен, то - dlg1.pane1.brw

Сергей Владимирович

unread,
Apr 12, 2019, 10:03:06 AM4/12/19
to guiserver
У меня на форме дерево и browse. каким образом лучше сделать отбор в browse при выборе элемента : 1. заново передать данные. 2. сделать невидимыми строки? и как лучше делать отборы в browse. встал на ячейку и отобрал текущее значение. тоже 2 пути выбираем из базы запросом, либо отбираем по фильтру из browse.
вообще наверное было бы удобно сформировать шаблоны контейнеров с набором виджетов и функций по работе с ними. (фильтры, сортировки, toolbar контекстное меню)

например для работы со структурой, двумерным слайсом, мапой..... , выбором периода.

Еще думаю было бы удобно (у вас частично реализовано в примерах) это редактор стилей.(тип виджета(контейнера?) - цвет, шрифт.....)

alkresin

unread,
Apr 15, 2019, 8:37:41 AM4/15/19
to guiserver
> 1. заново передать данные. 2. сделать невидимыми строки?

  Передавать данные.
  2-й способ теоретически тоже возможен, но несколько сложнее в реализации - и ведь все равно придется передавать информацию, какие именно строки "спрятать".

> как лучше делать отборы в browse. встал на ячейку и отобрал текущее значение.

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

> тоже 2 пути выбираем из базы запросом, либо отбираем по фильтру из browse.

 Не понял, что значит "по фильтру из browse".

> вообще наверное было бы удобно сформировать шаблоны контейнеров...

 Вот опишите мне, как должны выглядеть такие шаблоны, что делать - я добавлю их в etutor.

> Еще думаю было бы удобно (у вас частично реализовано в примерах) это редактор стилей.(тип виджета(контейнера?) - цвет, шрифт.....)
 В примерах я что-то не припомню, а вот в дизайнере это есть. А как вы себе представляете такой редактор стилей - как отдельное приложение, которое формирует строки кода, или что-то другое?

Сергей Владимирович

unread,
Apr 15, 2019, 8:57:34 AM4/15/19
to guiserver
В etutor.ini описываются стили. Графический редактор стилей.  
как пример: https://github.com/goki/gi  


По поводу browse. не получается передать новые данные. каким образом не пойму. 
для текста так:

pedit1 := egui.Widg("pDlg1.edit1")
pedit1.SetText("jjjj") 

 a browse как?
pBrw := egui.Widg("dlg1.brw")
buildBrowse(pBrw)
не обновляет форму.

alkresin

unread,
Apr 15, 2019, 9:29:46 AM4/15/19
to guiserver
BrwSetArray() передает данные в browse, как в test1.go, например.

Сергей Владимирович

unread,
Apr 18, 2019, 9:17:47 AM4/18/19
to guiserver
вывожу в Browse разные таблицы. если количество столбцов первой выводимой таблицы 5 а второй 2 возникает ошибка. если вывожу сперва таблицу с 2 столбцами, а затем с 5 . приложение не падает количество столбцов 2.
соответственно вопрос есть ли функция которая очищает Browse.

alkresin

unread,
Apr 19, 2019, 6:25:35 AM4/19/19
to guiserver
Да, я изначально предполагал, что создаваемый browse будет предназначен для определенного типа данных, и его структура (описание столбцов) создавалась при первой передаче массива, а последующие передачи только изменяли данные.
Теперь я это изменил, и описание столбцов переформировывается каждый раз, если приходит массив данных с новой структурой.
Обновленный guiserver уже можно скачать у меня на сайте.

Сергей Владимирович

unread,
May 4, 2019, 7:47:57 AM5/4/19
to guiserver

Активная ячейки(строка выделяется, а ячейка нет - это кодоблоком?). и можно ли передать фокус ячейке программно?
Редактирование ячейки из списка? календаря? делать через диалоговое окно? 
задание шаблона ввода(числа - нельзя вводить буквы, даты - первая цифра 0 или 1 или 2 или 3 ...)
заморозка столбцов слева или справа?

Сергей Владимирович

unread,
May 4, 2019, 7:59:52 AM5/4/19
to guiserver
 с заморозкой и активной ячейкой разобрался.
Это функция pBrw.SetParam("htbColor", 0)

Сергей Владимирович

unread,
May 4, 2019, 8:05:15 AM5/4/19
to guiserver
egui.BrwSetColumnEx(pBrw, 2, "bColor", CLR_LBLUE3)
pBrw.SetParam("htbColor", 0)
не срабатывает. Цвет фона берется из колонки, а не от активной ячейки.



Сергей Владимирович

unread,
May 7, 2019, 6:33:16 AM5/7/19
to guiserver
Есть ли многострочный режим в Browse?

Сергей Владимирович

unread,
May 7, 2019, 8:07:13 AM5/7/19
to guiserver
 с выкидным списком разобрался
 t := []string{"g", "h", "i"}
 egui.BrwSetColumnEx(pBrw, 3, "alist", t)

Сергей Владимирович

unread,
May 7, 2019, 8:10:47 AM5/7/19
to guiserver
правда вылетает по ошибке.
Reply all
Reply to author
Forward
0 new messages