Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 25463
Рейтинг: 2071
#316: 2019-05-25 02:20:05 ЛС | профиль | цитата
andrestudio писал(а):
вот, делюсь опытом

Да, я в курсе, обязательно посмотрю, как ее можно приделать, но надо сначала доделать задуманное, если получится. Пока вот что получается. Увы, от форматора никак не избавишься, только делать матрицу параметров, тогда можно. Ну, или наверх, пока не решил, что лучше. Просто отрабатывал методы форматирования.


Редактировалось 1 раз(а), последний 2019-05-25 02:32:04
карма: 19

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#317: 2019-05-26 23:21:11 ЛС | профиль | цитата
Ну вот то, о чем мы говорили, то и получилось. Работает и в режиме CustomDraw

и в обычном режиме

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

Редактировалось 2 раз(а), последний 2019-05-26 23:25:32
карма: 19

0
Ответов: 199
Рейтинг: 2
#318: 2019-05-27 07:08:02 ЛС | профиль | цитата
nesco, смотрится очень прилично. А индекс внутри любой ячейки на иконки тоже можно будет использовать ?
карма: 0

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#319: 2019-05-27 10:40:58 ЛС | профиль | цитата
kaban4ik писал(а):
А индекс внутри любой ячейки на иконки тоже можно будет использовать ?

Нет, иконки пока останутся только на первой ячейке, тк это предусмотрено самим классом. Все остальное -- это уже надстройки, для которых не предусмотрено ни буферов, ни событий отрисовки. Возможно, в CustomDraw режиме это и можно будет сделать, хотя довольно проблематично, тк иконки отрисовываются в ITEMPOSTPAINT режиме, где не передается текущий индекс подпункта, а только индекс строки, но в основном режиме такого точно не будет.
карма: 19

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#320: 2019-05-30 13:52:00 ЛС | профиль | цитата
Вроде закончил задуманное, можете протестировать сами



Но что бы организовать синхронизацию списка параметров ячеек с таблицей, надо так не хило постараться. Обычному пользователю с улицы это будет сделать крайне затруднительно, если вообще под силам.

PS Не забудьте скопировать файлы *.pas и *.ini в соответствующие папки.

Редактировалось 1 раз(а), последний 2019-05-30 13:57:14
карма: 19

0
файлы: 1Example_ColorInCells_MtStrTbl.zip [19.6KB] [59]
Ответов: 3943
Рейтинг: 622
#321: 2019-05-30 14:18:46 ЛС | профиль | цитата
Было-бы неплохо вынести разбор строки формата из обработчика рисования в отдельную процедуру. Иначе загромождает код.
карма: 19

0
Ответов: 1759
Рейтинг: 604
#322: 2019-05-30 15:47:42 ЛС | профиль | цитата
Не могу запустить пример. Выдает ошибку:
D:\Hiasm\HiAsm_AltBuild_26_11_2013\Elements\delphi\code\hiMTStrTbl.pas(643) Error: Undeclared identifier: 'Trim'
Обновление 2307.
Файлы скопировал в соответствующие папки.
hiMTStrTbl.pas писал(а):
В 643 строке ссылается на hiMultiBlockFind.Trim.
В 284 строке есть uses hiMultiBlockFind

hiMultiBlockFind.pas писал(а):
В 77 строке есть function Trim.

Ничего не понимаю.

Редактировалось 2 раз(а), последний 2019-05-30 15:48:12
карма: 7

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#323: 2019-05-30 15:48:54 ЛС | профиль | цитата
Netspirit писал(а):
Было-бы неплохо вынести разбор строки формата из обработчика рисования в отдельную процедуру

Перевел в процедуру метода. Пойдет?

--- Добавлено в 2019-05-30 15:54:01

sla8a писал(а):
Ничего не понимаю.

Обновись с SVN. В ревизии 2307 были добавлены декларации некотороых методов в компонент MultiBlockFind.

Редактировалось 2 раз(а), последний 2019-05-30 15:54:30
карма: 19

0
файлы: 1MtStrTbl_230.zip [12.1KB] [58]
Ответов: 3943
Рейтинг: 622
#324: 2019-05-30 15:58:22 ЛС | профиль | цитата
Зависит от того каким образом получаешь результаты работы метода. Если через поля класса ThiMTStrTbl - тоже сильно раздувается. Предполагаю из метода можно выдавать наружу record с полученными значениями и их уже использовать в обработчике.
Меня вот это ещё смущает:
else if (Stage = CDDS_SUBITEM or CDDS_ITEMPREPAINT) or (Stage = CDDS_ITEMPOSTPAINT)
and ((Sender.LVStyle = lvsDetail) or (Sender.LVStyle = lvsDetailNoHeader)) then
begin

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

Редактировалось 1 раз(а), последний 2019-05-30 15:59:41
карма: 19

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#325: 2019-05-30 16:17:46 ЛС | профиль | цитата
Netspirit писал(а):
Предполагаю из метода можно выдавать наружу record с полученными значениями и их уже использовать в обработчике.

Не надо никаких рекордов наружу. Чем ты их обрабатывать будешь? Наружу и так выдается MT-поток, возвращается строка параметров. Почему-то современные браузеры спокойно работают со строковыми переменными гораздо большего вложения. Для кода распарсировать шесть параметров это ниочем. К тому же только в видимой области таблицы, остальное ждет своей очереди.
Netspirit писал(а):
То-есть, два разных этапа отрисовки обрабатываются в одном блоке.

Да, именно так, тк работают они на внешний модуль отрисовки, в нем как раз и отрисовывается часть в одном режиме, часть в другом.
Netspirit писал(а):
Во-вторых, один этап предназначен для рисования, второй - для освобождения ресурсов (или первый для подготовки, а второй - рисования) насколько я понимаю. Но могу и ошибаться.

Оба могут работать на рисование, все зависит от того, что рисуется. В CDDS_ITEMPOSTPAINT выдается только индекс строки, индекс подстроки всегда равен -1 (поэтому в коде и стоит защита от индексов -1). CDDS_ITEMPREPAINT не зря стоит совместно с CDDS_SUBITEM, только в этом режиме выдаются индексы подстроки. Все это прекрасно работало с момента создания всей этой группы компонентов.

Вот, перевел в процедуру метода.

Редактировалось 2 раз(а), последний 2019-05-30 16:20:19
карма: 19

0
файлы: 1MtStrTbl_231.zip [12.1KB] [67]
Ответов: 3943
Рейтинг: 622
#326: 2019-05-30 16:23:19 ЛС | профиль | цитата
nesco писал(а):
Наружу и так выдается MT-поток
Имелось в виду "наружу" из той процедуры разбора строки в то место, где результаты этого разбора нужны, то-есть, в место вызова процедуры разбора. Но ты процедуру сделал вложенной - пусть будет так.

Редактировалось 2 раз(а), последний 2019-05-30 16:25:15
карма: 19

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#327: 2019-05-30 16:26:16 ЛС | профиль | цитата
Netspirit писал(а):
Имелось в виду "наружу" из той процедуры разбора строки в то место, где результаты этого разбора нужны, то-есть, в место вызова процедуры разбора.

А зачем, кода можно использовать локальную процедуру метода и спокойно использовать переменные самого метода? К тому же, некоторые переменные перекрываются и идут дальше на внешний модуль отрисовки.

--- Добавлено в 2019-05-30 16:53:38

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

Редактировалось 1 раз(а), последний 2019-05-30 16:53:38
карма: 19

0
Ответов: 1759
Рейтинг: 604
#328: 2019-05-30 21:34:31 ЛС | профиль | цитата
nesco писал(а):
В ревизии 2307 были добавлены декларации некотороых методов в компонент MultiBlockFind.
Это решило проблему спасибо.
Тестирование:
1. Подсветка текста ячейки по выставленным параметрам.
Схема

Add(MainForm,2953706,476,539)
{
Width=451
Height=419
Position=1
link(onCreate,5210249:doEnum,[(520,559)(520,545)])
}
Add(MTStrTbl,342579,518,413)
{
Left=10
Top=60
Width=420
Height=320
Name="myTable"
Columns=#8:Название|3:Вес|10:Количество|9:Позиция Х|9:Позиция Y|
ColorItems=0
Grid=0
link(FormatCell,13332854:GetData,[])
}
Add(MST_RowAction,10435767,616,532)
{
MSTControl="myTable"
}
Add(StrList,3112473,518,483)
{
Strings=#18:Стол;12,3;1;123;12|19:Диван;34,7;1;200;20|17:Ваза;3,4;1;221;15|19:Тарелка;0,3;1;31;12|17:Стул;7,4;1;150;23|20:Цветок;0,45;5;225;15|18:Ковер;12,2;1;12;12|
}
Add(ArrayEnum,5210249,532,539)
{
link(onItem,1965424:doMT,[])
link(Array,3112473:Array,[])
}
Add(MT_String,1965424,574,532)
{
link(onResult,10435767:doRowAction,[])
}
Add(EventFromData,13332854,532,357)
{
link(onEvent,6109613:doEvent1,[])
}
Add(DoData,6311065,861,399)
{
Data=String(16777215,255,MS Sans Serif,8,1)
link(onEventData,16259747:doWork2,[(899,405)(899,314)])
}
Add(MT_MultiData,4188433,644,364)
{
From=2
Count=1
link(onData1,15164830:doEvent,[])
}
Add(If_else,7987007,812,399)
{
Type=2
link(onTrue,3257805:doWork2,[])
link(Op2,16357419:Text,[])
}
Add(MT_MultiMem,12442273,602,364)
{
Count=1
link(onData,4188433:doSeparateMT,[])
}
Add(IndexToChanel,15164830,693,364)
{
Count=4
link(onEvent1,1401113:doCompare,[])
link(onEvent4,1414902:doConvert,[(741,391)(741,405)])
}
Add(Convertor,1414902,742,399)
{
Mode=1
link(onResult,7987007:doCompare,[])
link(Data,1421769:Var2,[])
}
Add(RedrawManager,11201372,875,182)
{
ControlManager="myTable"
}
Add(Hub,6109613,574,357)
{
link(onEvent1,12026103:doData,[(599,363)(599,328)])
link(onEvent2,12442273:doValue,[])
}
Add(HubEx,16259747,644,308)
{
Angle=2
link(onEvent,13332854:doData,[(519,314)(519,363)])
}
Add(DoData,12026103,602,322)
{
link(onEventData,16259747:doWork3,[(648,328)])
}
Add(Edit,16357419,819,182)
{
Left=220
Top=35
Text="153"
DataType=2
link(onChange,5941138:doWork2,[])
}
Add(Edit,10867221,784,231)
{
Left=170
Top=10
Width=135
Text="Стул"
link(onChange,5941138:doWork3,[(865,237)])
}
Add(If_else,1401113,777,364)
{
link(onTrue,3257805:doWork1,[(851,370)])
link(Op1,1421769:Var3,[(783,352)])
link(Op2,10867221:Text,[])
}
Add(HubEx,5941138,861,182)
{
link(onEvent,11201372:doRedraw,[])
}
Add(GetDataEx,1421769,742,347)
{
Angle=3
link(Data,12442273:Value1,[(686,352)(686,415)(608,415)])
}
Add(Label,14993093,728,231)
{
Left=90
Top=10
Width=75
Caption="Название"
}
Add(Label,10335195,770,182)
{
Left=90
Top=35
Width=130
Caption="Позиция Х больше"
}
Add(HubEx,3257805,847,399)
{
link(onEvent,6311065:doData,[])
}

2. Чередование цветов строк в таблице. Мелочь, а приятно.
Схема

Add(MainForm,12272402,392,336)
{
Width=451
Height=419
Position=1
link(onCreate,5210249:doEnum,[(436,356)(436,342)])
}
Add(MTStrTbl,342579,434,210)
{
Left=10
Top=60
Width=420
Height=320
Name="myTable"
Columns=#8:Название|3:Вес|10:Количество|9:Позиция Х|9:Позиция Y|
ColorItems=0
Grid=0
link(FormatCell,13332854:GetData,[])
}
Add(MST_RowAction,10435767,532,329)
{
MSTControl="myTable"
}
Add(StrList,3112473,434,280)
{
Strings=#18:Стол;12,3;1;123;12|19:Диван;34,7;1;200;20|17:Ваза;3,4;1;221;15|19:Тарелка;0,3;1;31;12|17:Стул;7,4;1;150;23|20:Цветок;0,45;5;225;15|18:Ковер;12,2;1;12;12|
}
Add(ArrayEnum,5210249,448,336)
{
link(onItem,1965424:doMT,[])
link(Array,3112473:Array,[])
}
Add(MT_String,1965424,490,329)
{
link(onResult,10435767:doRowAction,[])
}
Add(EventFromData,13332854,448,168)
{
link(onEvent,4188433:doSeparateMT,[])
}
Add(DoData,6311065,616,175)
{
Data=String(16777215,,,,)
link(onEventData,11590577:doWork3,[(703,181)])
}
Add(MT_MultiData,4188433,490,168)
{
From=1
Count=1
link(onData1,556440:doOperation,[])
}
Add(IndexToChanel,15164830,574,168)
{
link(onEvent1,14610653:doData,[])
link(onEvent2,6311065:doData,[])
}
Add(Math,556440,532,168)
{
OpType=40
link(onResult,15164830:doEvent,[])
}
Add(DoData,14610653,658,168)
{
Data=String(12632256,,,,)
link(onEventData,11590577:doWork2,[])
}
Add(HubEx,11590577,699,168)
{
Angle=3
link(onEvent,13332854:doData,[(703,125)(435,125)(435,174)])
}


Редактировалось 7 раз(а), последний 2019-05-31 00:54:15
карма: 7

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#329: 2019-05-31 00:02:18 ЛС | профиль | цитата
sla8a писал(а):
Чередование цветов строк в таблице. Мелочь, а приятно.

Да, гораздо проще получается, чем лепить значения цвета строк в таблицу, да и память на эти значения не жрет. Это хорошо скажется на больших таблицах.

--- Добавлено в 2019-05-31 00:06:32

Да, кстати, писать все параметры в строку не обязательно, если менять только цвет, то достаточно указать просто два первых параметра. Дефолтные параметры можно просто пропустить, поставив два разделителя подряд.
Те, твои параметры будут выглядеть вот так
12632256,,,,1
и
16777215,,,,1

Редактировалось 5 раз(а), последний 2019-05-31 00:09:01
карма: 19

0
Ответов: 1759
Рейтинг: 604
#330: 2019-05-31 01:00:06 ЛС | профиль | цитата
nesco писал(а):
твои параметры будут выглядеть вот так
Спасибо за пояснение. Пример выше подправил.
3. Простой пример изменения данных для каждой ячейки.
Схема

Add(MainForm,6723529,525,504)
{
Width=511
Height=444
Position=1
link(onCreate,5210249:doEnum,[(569,524)(569,510)])
}
Add(MTStrTbl,342579,553,343)
{
Left=40
Top=70
Width=420
Height=320
Name="myTable"
Columns=#8:Название|3:Вес|10:Количество|9:Позиция Х|9:Позиция Y|
ColorItems=0
Grid=0
DrawManager="draw"
Point(ItemAtPos)
link(onClick,2567468:doValue,[])
link(FormatCell,13332854:GetData,[])
}
Add(MST_RowAction,10435767,665,441)
{
MSTControl="myTable"
}
Add(StrList,3112473,567,441)
{
Strings=#18:Стол;12,3;1;123;12|19:Диван;34,7;1;200;20|17:Ваза;3,4;1;221;15|19:Тарелка;0,3;1;31;12|17:Стул;7,4;1;150;23|20:Цветок;0,45;5;225;15|18:Ковер;12,2;1;12;12|
}
Add(ArrayEnum,5210249,581,504)
{
link(onItem,1965424:doMT,[(618,510)(618,454)])
link(onEndEnum,11945622:doCalc,[])
link(Array,3112473:Array,[])
}
Add(MT_String,1965424,623,441)
{
link(onResult,10435767:doRowAction,[])
}
Add(EventFromData,13332854,567,238)
{
link(onEvent,6289078:doValue,[])
}
Add(RedrawManager,11201372,1106,350)
{
ControlManager="myTable"
}
Add(MatrixRW,3249515,924,399)
{
link(Matrix,14374875:Var3,[(930,215)])
link(X,2567468:Value2,[])
link(Y,2567468:Value1,[(951,387)(937,387)])
}
Add(Hub,3975851,1078,343)
{
link(onEvent1,3249515:doWrite,[(1153,349)(1153,442)(912,442)(912,412)])
link(onEvent2,11201372:doRedraw,[])
}
Add(MT_MultiMem,2567468,931,343)
{
Point(Data)
link(onData,3231102:doNumber,[])
link(Data,342579:ItemAtPos,[(937,331)(601,331)(601,379)(587,379)])
}
Add(MatrixRW,5346286,651,238)
{
link(onRead,13332854:doData,[(691,244)(691,207)(559,207)(559,244)])
link(Matrix,14374875:Var1,[(657,215)])
link(X,6289078:Value2,[(671,225)(702,225)(702,276)(622,276)])
link(Y,6289078:Value1,[(678,234)(695,234)(695,283)(615,283)])
}
Add(MST_DrawManager,10020943,504,343)
{
Name="draw"
SingleString=0
TabGrid=0
TabGridFrame=0
GutterStyle=1
LightTextSel=1
StyleGrid3D=1
ColorRowSel=0
FrameColor=-16777211
BkFrameColor=-16777201
GutterColor=-16777211
}
Add(MT_MultiMem,6289078,609,238)
{
From=1
link(onData,5346286:doRead,[])
}
Add(GetDataEx,14374875,812,210)
{
link(Data,13338805:Matrix,[])
}
Add(FontBox,8518274,1043,252)
{
Left=245
Top=15
Width=145
Height=24
SelFont="MS Sans Serif"
}
Add(ColorBox,11097918,1036,210)
{
Left=145
Top=15
Width=95
Height=24
DefColor=255
}
Add(Edit,13163071,1050,287)
{
Left=400
Top=15
Text="8"
DataType=2
}
Add(FormatStr,2969162,1029,343)
{
DataCount=5
Mask="%1,%2,%3,%4,%5"
Point(FString)
link(onFString,3975851:doEvent1,[])
link(Str1,11254634:CurrentColor,[])
link(Str2,11097918:CurrentColor,[])
link(Str3,8518274:CurrentFont,[])
link(Str4,13163071:Text,[])
}
Add(ColorBox,11254634,1029,168)
{
Left=45
Top=15
Width=95
Height=24
DefColor=-16777211
}
Add(CheckBox,10677294,973,161)
{
Left=45
Top=45
Width=65
Font=[MS Reference Sans Serif,8,1,0,204]
TabOrder=-1
Checked=0
Caption="Bold"
}
Add(CheckBox,14654181,980,203)
{
Left=135
Top=45
Width=70
Font=[MS Reference Sans Serif,8,2,0,204]
TabOrder=-1
Caption="Italic"
}
Add(CheckBox,12649705,987,238)
{
Left=235
Top=45
Width=80
Font=[MS Reference Sans Serif,8,4,0,204]
TabOrder=-1
Caption="Underline"
}
Add(BitsToInt,3231102,973,343)
{
link(onNumber,2969162:doString,[])
link(Bit1,10677294:Checked,[])
link(Bit2,14654181:Checked,[])
link(Bit3,12649705:Checked,[])
link(Bit4,9033521:Checked,[])
}
Add(CheckBox,9033521,994,280)
{
Left=355
Top=45
Width=100
Font=[MS Reference Sans Serif,8,8,0,204]
TabOrder=-1
Caption="StrikeOut"
}
Add(InfoTip,15148645,497,406)
{
Info=#58:Добавляем строки в таблицу и устанавливаем размер матрицы |
Frame=2
Width=218
Height=151
}
Add(InfoTip,10009675,882,147)
{
Info=#22:Запись данных о ячейки|
Frame=2
Width=316
Height=326
}
Add(InfoTip,1438607,518,161)
{
Info=#63:При рисовании каждой ячейки подаются значения из таблицы данных|
Frame=2
Width=197
Height=137
}
Add(Matrix,13338805,812,133)
{
@Hint=#37:Матрица для хранения данных о ячейках|
MatrixType=2
AddHint(-79,-42,182,26,@Hint)
}
Add(MathParse,11945622,665,511)
{
DataCount=1
MathStr="5 + 65536 * %1"
link(onResult,13338805:doSize,[(755,517)(755,139)])
link(X1,10435767:Count,[])
}


--- Добавлено в 2019-05-31 01:07:06

nesco, пока только положительные эмоции от проделанной вами работы.

Редактировалось 4 раз(а), последний 2019-05-31 01:27:47
карма: 7

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)