Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26151
Рейтинг: 2127
#106: 2008-08-04 13:38:07 ЛС | профиль | цитата
Ага, понял.
------------ Дoбавленo:

Dilma, я добавил менеджеров на SVN. Посмотри. Пока на них нет добавления элементов. Тут надо бы определиться, как это лучше сделать
Вот пример работы с ними.
карма: 22

0
файлы: 1boxmanager.sha [6.2KB] [555]
Ответов: 4
Рейтинг: 1
#107: 2008-08-04 17:43:51 ЛС | профиль | цитата
при закрытии хиасма, на вкладке User вылетает ошибка Access violation at adress 004679F8 in module 'HiAsm.exe'. Read of address 00000218
карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#108: 2008-08-04 17:47:10 ЛС | профиль | цитата
Nic писал(а):
Ошибка при выборе вкладки User

На пятой странице. Так что -- Баян. Топики читать надо с начала
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#109: 2008-08-04 17:47:34 ЛС | профиль | цитата
Вкладка User будет удалена в финальной версии
карма: 27
1
Голосовали:empty
Ответов: 4
Рейтинг: 1
#110: 2008-08-04 18:02:29 ЛС | профиль | цитата
тогда хотя бы исправте при закрытии ошибку а то приходится через диспетчер задач завершать каждый раз))
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#111: 2008-08-04 20:49:58 ЛС | профиль | цитата
nesco писал(а):
я добавил менеджеров на SVN. Посмотри.

Посмотрел(запустить к сожалению смогу только дома). Только одно замечания по оформлению:
- IndexManager как я понял сопоставляет индекс пункта элемента индексу иконки - не очень нравится такой подход. Получается, что для использования иконок в элементе одного менеджера не достаточно. Код не смотрел могу и ошибаться.

Дополнений несколько:
- думаю все интерфейсы нужно разместить в отдельном юните с их полным описанием. Т.е. в комментариях указать значение каждого метода и их параметры.
- по поводу привязок итомов элементов к иконкам. Один из вариантов это перевести инициализацию элемента данными так же на менеджер. Тогда можно бы было скажем в качестве данных посылать элементу таблицу, в которой один столбик - это имена(или индексы) иконок из менеджера, другой - данные, отображаемые в элементе, а все остальные то, что выдается элементом при выборе соответствующего итема в нем. Например для ListBox будут такие св-ва, осуществляющие этот интерфейс:

- DataManager=Источник данных
- IconField=Имя поля с данными об иконке(если не задано, иконки не используются)
- CaptionField=Имя поля с данными, отображаемыми в элементе
- DataField=Имена(через запятую) колонок, данные из которых выдаются элементом в поток при выборе соответствующего пункта.
эта модель применима для всех списковых и табличных элементов(а других у нас вроде и нет). Ну и кроме того она позволит в будущем легко писать DataSource для различных баз данных.

------------ Дoбавленo:

Такая модель скажем в будущем позволит написать DataSource, который выдает информацию о файловой системе и IconManager, который умеет выдавать иконки файлов. Тогда очень просто и легко можно на основе любого элемента сделать обозреватель файловой системы с именами файлов и их иконками. Только для этого нужно идентификацию иконок делать не по числу, а по строке. Или лучше в интерфейс добавить метод: GetIndexByName.
------------ Дoбавленo:

Запустил, посмотрел подробнее. Такие вопросы:
- почему без MODE_XXX не обойтись? В идеале сервер ничего о клиентах знать не должен. Т.е. хотелось бы интерфейс, который без явных заточек модно было применить к любому элементу
- без менеджера отрисовки элемент не выводит указанные для него иконки. Как тут поступать - пока не знаю, но вижу два варианта:
a) если уж одно без другого не работает, то иконки логичнее присоединять к менеджеру отрисовки, а не к самому элементу. В этом есть как минимум один минус - есть элементы, у которых можно задать иконки без реализации CustomDraw(TreeView к примеру). Т.е. может быть стоит присоединять менеджер туда, где он реально используется
b) если оставить как это сделано сейчас(и что все таки выглядит более логичным), то наверно надо дать элементу возможность самостоятельно рисовать иконки даже если нет DrawManager


В целом, если не обращать внимания на некоторые глюки отрисовки первой версии - выглядит все достаточно красиво и логично
карма: 27
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#112: 2008-08-04 22:54:05 ЛС | профиль | цитата
Dilma писал(а):
почему без MODE_XXX не обойтись?

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

Этот отрисовщик сложно (если вообще возможно) портировать еще куда-то. Он использует специфику именно боксов.
Dilma писал(а):
то наверно надо дать элементу возможность самостоятельно рисовать иконки даже если нет DrawManager

Не получится только потому, что по-умолчанию не работает OnMeasureItem, и тогда высотой можно управлять только размером шрифта, что накладывает ограничение на применяемый шрифт, а это -- неприемлемо

Dilma писал(а):
некоторые глюки отрисовки

Какие конкретно, очень интересно
Если мерцание -- но тут уж никуда не денешься

карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#113: 2008-08-04 23:23:58 ЛС | профиль | цитата
nesco писал(а):
Можно обойтись, но тогда надо отказаться от заливки фона и боковой полоски, иначе последняя будет отрисована не до конца вниз -- очень некрасиво

а в чем именно проблема?

nesco писал(а):
Этот отрисовщик сложно (если вообще возможно) портировать еще куда-то. Он использует специфику именно боксов.

ну хорошо, наверно действительно не стоит далать настолько общий интерфейс и ограничиться только двумя типами Draw менеджеров - для списков и таблиц. Но внутри них различия точно стоит обойти.

nesco писал(а):
Не получится только потому, что по-умолчанию не работает OnMeasureItem, и тогда высотой можно управлять только размером шрифта

почему тут нельзя поставить условие:

#pas
if(IconManager <> nil)and(DrawManager = nil) then
OnMeasureItem := MyProcForDrawIcons;
?

nesco писал(а):
Если мерцание -- но тут уж никуда не денешься

да одно из них.
Поменял чего-то в схеме(Frame уьрал и еще что-то видимо) - мерцание пропало, но пункты, с которых была снята активность перестали обновляться... Повторить эффект еше раз не удалось, но отсюда можно сделать вывод, что убрать этот дефект все таки можно
карма: 27
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#114: 2008-08-05 00:12:59 ЛС | профиль | цитата
Dilma писал(а):
а в чем именно проблема?

Ну проблема в том, что пробегая пункты в отрисовки, низ желательно отрисовать только один раз после последнего пункта, а там скзывается различность в доступных параметрах -- в ListBox'e мне известен размер всего окна, а в ComboBox'e -- нет. Я уже пробовал бороться с этим в своих Ex компонентах, также как и с фликкером (уменьшить можно, но убрать полностью ???) -- нифига не получилось.

Dilma писал(а):
Но внутри них различия точно стоит обойти

С прозрачность в ListBox'e, без отключения некоторых отрисовок, никак не получается, а значит приходилось передавать режим прозрачности, чтобы исключить ненужные отрисовки. Если общий режим отрисовки еще можно помучить, то вот прозрачность ???
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#115: 2008-08-05 16:07:22 ЛС | профиль | цитата
посмотрел повнимательнее:
- получать размер итема вот так

#pas
PControl(Sender).Canvas.TextExtent('W').cy
не хорошо - невозможно будет вывести пункт с двумя и более строками(как в публикаторе скажем). Этот параметр как и в VCL должен определяться пользователем(там оно ItemHeight) называется
- передавать в менеджер Sender - тоже не хорошо. При таком интерфейсе невозможно будет использовать их применительно к невизуальным контролам. Выводимый текст надо передавать в качестве одного из параметров.
- если хочется снабдить DrawManager знанием о рисуемых слева от текста картинок(т.е. константой SHIFT_PICTURE), то IconManager должен всетаки вставляться не в элемент, а в него.

Нужно всетаки постараться проникнуться идеей менеджеров(да и встраиваемых объектов вообще) и понять, что они(менеджеры) абсолютно ничего не должны знать о том, кто и зачем их будет использовать. У интерфейса отрисовки должна быть только одна функция:

#pas
function(DC: HDC; const Rect: TRect; row,col:integer; const text: string; ItemState: TDrawState; Flags:cardinal): Boolean
где
DC - контекст устройства вывода
Rect - координаты области вывода
row,col - номер строки и номер колонки выводимых данных
text - собственно данные
ItemState - состояние текущего пункта
Flags - прочие флаги.

ну не получается ни в какую обойтись существующим интерфейсом сделай флаги - FLG_LISTBOX, FLG_COMBOBOX, FLG_TRANSPARENT... еще какие-то... Хочется учесть отступ от левого края - ну добавь в интерфейс более общие прави, а не затачивайся под один конкретный случай:

#pas
function(DC: HDC; const DrawRect, DataRect: TRect; row,col:integer; const text: string; ItemState: TDrawState; Flags:cardinal): Boolean
DrawRect - область вывода всего пункта
DataRect - область вывода данных


В IconsManager тоже самое. Я правда не совсем понял смысловую значимость параметра Rect, который в метод отрисовки меняется по всем четырем направлениям....
------------ Дoбавленo:

Глюки с отрисовкой кстате появлялись при Transparent = True. Правда мигание зато пропадает в таком режиме...
карма: 27
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#116: 2008-08-05 16:27:04 ЛС | профиль | цитата
Dilma писал(а):
Глюки с отрисовкой кстате появлялись при Transparent = True

А у меня только тянучий курсор при выборе мышью, при перемещении клавиатурой иакого глюка нет, в остальном работает нормально.
Dilma писал(а):
Я правда не совсем понял смысловую значимость параметра Rect

Для отрисовки применяетяся StretchDraw, а для этого режима необходим точный целевой прямоугольник вывода, да его еще и отцентровать надо по высоте селектора
Dilma писал(а):
ну не получается ни в какую обойтись существующим интерфейсом сделай флаги

В последнем релизе я унифицировал версию для боксов без флагов, передается только свойство прозрачности
Мне кажется, что мешать все менеджеры отрисовки в одну кучу, тоже не дело. Для боксов должен быть один, для ListView'a -- другой, и они должны учитывать специфику каждого контрола. А вот универсальный на все -- ну я не знаю, насколько он усложнится
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#117: 2008-08-05 16:33:48 ЛС | профиль | цитата
Dilma писал(а):
при Transparent = True
nesco, а у вас Kol-ы не разные ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#118: 2008-08-05 16:36:08 ЛС | профиль | цитата
Tad писал(а):
а у вас Kol-ы не разные ?

А может и разные, кто ж его знает
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#119: 2008-08-05 16:56:13 ЛС | профиль | цитата
Я знаю.
Разные.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Администрация
Ответов: 15295
Рейтинг: 1519
#120: 2008-08-05 17:36:31 ЛС | профиль | цитата
nesco писал(а):
Для боксов должен быть один, для ListView'a -- другой, и они должны учитывать специфику каждого контрола. А вот универсальный на все -- ну я не знаю, насколько он усложнится

в таком случае это уже не менеджер, а кусок элемента с названием TreeViewDrawer.
карма: 27
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)