Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26252
Рейтинг: 2140
#151: 2025-04-10 23:55:53 ЛС | профиль | цитата
Вопрос 1: Нет, нельзя. Системный класс такого не предусматривает.
Вопрос 2: Так же нельзя. При нажатии на пустую область выдается индекс строки = -1, тк мышь не попадет в область строки, и выделение автоматически сбрасывается. Можно попытаться сохранить индекс выбранной строки и при получении индекса = -1 вернуть селектор на старую позицию. Но это надо экспериментировать.
карма: 22

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#152: 2025-04-11 03:51:47 ЛС | профиль | цитата
Ошибка: Добавь вот это в код и проверь:

begin
Result:= CDRF_DODEFAULT;
if (Stage = CDDS_SUBITEM OR CDDS_ITEMPREPAINT) then
begin
l := Sender.LVOptions;
ARect := Sender.LVSubItemRect(ItemIdx,SubItemIdx);

ARect.Left := Rect.Left; // добавить
ARect.Right := Rect.Right; // добавить
карма: 22

0
Ответов: 2360
Рейтинг: 683
#153: 2025-04-11 12:08:27 ЛС | профиль | цитата
nesco писал(а):
Добавь вот это в код и проверь:
Правка помогла, рисует правильно.
nesco писал(а):
Так же нельзя. При нажатии на пустую область выдается индекс строки = -1, тк мышь не попадет в область строки, и выделение автоматически сбрасывается. Можно попытаться сохранить индекс выбранной строки и при получении индекса = -1 вернуть селектор на старую позицию. Но это надо экспериментировать.
Пытаюсь это реализовать, но пока глухо. Смотрел в сторону _OnSelState, но тут все печально. При выделении другого пункта срабатывает три события: oldState = 0 NewState = 0(старая строка еще выделена), oldState = 2 NewState = 0(снимается выделение с старой строки) и oldState = 0 NewState = 3 (выделена новая строка).
А как нажать на пустое место, так только одно событие: oldState = 2 NewState = 0 (выделение с старой строки уже снято). Вот чего оно так не логично Буду пробовать другие варианты. Если есть идея где покапать, то сообщи, попробую.
nesco писал(а):
Вопрос 1: Нет, нельзя. Системный класс такого не предусматривает.
Мне нужно только шрифт строки сохранить при выделенной строке и не хочется использовать для этого MST_DrawManager чтоб не сильно нагружать перерисовку (на старом компьютере особо заметно). Но думаю на элементах собрать что-то попроще.
карма: 11

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#154: 2025-04-11 13:32:07 ЛС | профиль | цитата
sla8a писал(а):
Если есть идея где покапать, то сообщи, попробую

Пока не думал. Если будет время, то тогда тоже подумаю.
sla8a писал(а):
Но думаю на элементах собрать что-то попроще

Наверное проще будет. Тк цвет строки мы можем менять (при поддержке цвета, естественно)
карма: 22

0
Ответов: 2360
Рейтинг: 683
#155: 2025-04-11 14:15:52 ЛС | профиль | цитата
По второму вопросу. Если перехватить нажатие в function WndHDR, то должно работать как надо. У меня пока что все хорошо.
function WndHDR(Sender: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
..
..
..
..
begin
Result := false;
fClass := ThiMTStrTbl(Sender.Tag);
with fClass do
begin
case Msg.message of
//add for ignore clicking on an empty field
WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK,
WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK,
WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK:
if _prop_IgnoreEmptyField and (Control.LVItemAtPos(SmallInt(LoWord(Msg.lParam)),SmallInt(hiWord(Msg.lParam))) = -1) then
begin
Result := true;
Exit;
end;
//end

Можно добавить свойство:
IgnoreEmptyField=Игнорировать нажатие на пустое поле таблицы|14|1|True,False


Схема для тестирования

Add(MainForm,2953706,112,154)
{
Width=609
Height=396
Position=1
link(onCreate,3556725:doEnum,[])
}
Add(MTStrTbl,303165,434,161)
{
Left=10
Top=10
Width=575
Height=300
Font=[MS Sans Serif,12,0,0,1]
Name="testTable"
Columns=#8:test1=80|9:test2=200|9:test3=200|6:test=0|
NIdxIcon=0
ColorItems=0
Grid=0
SmallIconsManager="iconColumn"
DrawManager="drawTable"
Point(onSelect)
link(onClick,4918033:doEvent,[])
link(onSelect,9004417:doEvent,[])
}
Add(MT_String,6192416,294,161)
{
link(onResult,4870764:doRowAction,[])
}
Add(StrList,6915816,140,98)
{
Strings=#37:0;1;test string 111;test string 12;1;|37:0;2;test string 121;test string 22;2;|37:0;3;test string 131;test string 32;3;|37:0;4;test string 141;test string 42;4;|37:0;5;test string 151;test string 52;5;|37:0;6;test string 161;test string 62;6;|37:0;7;test string 171;test string 72;7;|37:0;8;test string 181;test string 82;8;|
}
Add(ArrayEnum,3556725,154,168)
{
link(onItem,6192416:doMT,[])
link(onEndEnum,14056293:doAdd,[(194,181)(194,258)])
link(Array,6915816:Array,[])
}
Add(MST_RowAction,4870764,343,161)
{
MSTControl="testTable"
}
Add(MST_RowAction,15658638,266,252)
{
Action=5
MSTControl="testTable"
link(onChange,9185103:doSelect,[])
}
Add(MT_AddData,14056293,203,252)
{
link(onAdd,15658638:doRowAction,[])
link(Data1,10227341:Value,[])
link(Data2,1891607:Value,[(216,244)(251,244)])
}
Add(Memory,10227341,203,203)
{
Default=Integer(3)
AddHint(4,-18,21,13,Default)
}
Add(Memory,1891607,245,203)
{
Default=Integer(9)
AddHint(2,-18,21,13,Default)
}
Add(IconsManager,8032623,203,98)
{
Name="iconColumn"
ImgSize=20
Icons=['down'=[ZIP7E04000078DA636060044201010620A9C090C1C2C020C6C0C0A001C44021A008441C041C5818860C602E63FF8F8CC9D12FB1C4E0BFD46663B2F5CBAEB4FAAFB0D3816CFD8AEB9CFFABEDF7254A3FBA7F41587367F07FBDE3B1FFB1C961D3EFFBB4E1BFC7C3EAFF0E378BFF5B5FC90363A3D329FF75F747FE575CEB04F68FD8226D9CFA43DF76609801D20F7203C81FF23B6C7186274F8510AA1B0BD8C066585CCC06B3D131C1F000AA717F5005368318F5D8F483FCE27AAF826CFD41AF5BC16690AB9F14FF0E14F8FF9F890984FFD8A3E203CCC8988505559E8503A60F006B34AD56]]
Point(EndIdxIcons)
Point(ImgSize)
}
Add(Debug,4918033,525,161)
{
WEName="click"
VDName=""
}
Add(Debug,9004417,539,189)
{
WEName="onSelect"
VDName=""
}
Add(Timer,16618968,399,252)
{
Interval=10
Enable=1
link(onTimer,1795852:doCompare,[])
}
Add(If_else,1795852,441,252)
{
Op2=Integer(-1)
link(onTrue,15360455:doEvent1,[])
link(Op1,303165:Index,[])
AddHint(16,-24,24,13,Op2)
}
Add(Message,10971311,546,259)
{
}
Add(Hub,15360455,497,252)
{
link(onEvent1,16618968:doStop,[(523,258)(523,299)(388,299)(388,265)])
link(onEvent2,10971311:doMessage,[])
}
Add(MST_SelectRow,9185103,329,252)
{
MSTControl="testTable"
link(onSelectRow,16618968:doTimer,[])
}

MST_UseEditCtrl правильно отрабатывает при свойстве IgnoreEmptyField = true и клике в пустую область заканчивает редактирование и оставляет выделенным предыдущую строку.
Пример для тестирования

Add(MainForm,2953706,112,154)
{
Width=609
Height=396
Position=1
link(onCreate,3556725:doEnum,[])
}
Add(MTStrTbl,303165,434,161)
{
Left=10
Top=10
Width=575
Height=300
Font=[MS Sans Serif,12,0,0,1]
Name="testTable"
Columns=#8:test1=80|9:test2=200|9:test3=200|6:test=0|
NIdxIcon=0
ColorItems=0
IgnoreEmptyField=0
Grid=0
SmallIconsManager="iconColumn"
DrawManager="drawTable"
Point(onSelect)
link(onClick,4918033:doEvent,[])
link(onSelect,9004417:doEvent,[])
}
Add(MT_String,6192416,294,161)
{
link(onResult,4870764:doRowAction,[])
}
Add(StrList,6915816,140,98)
{
Strings=#37:0;1;test string 111;test string 12;1;|37:0;2;test string 121;test string 22;2;|37:0;3;test string 131;test string 32;3;|37:0;4;test string 141;test string 42;4;|37:0;5;test string 151;test string 52;5;|37:0;6;test string 161;test string 62;6;|37:0;7;test string 171;test string 72;7;|37:0;8;test string 181;test string 82;8;|
}
Add(ArrayEnum,3556725,154,168)
{
link(onItem,6192416:doMT,[])
link(onEndEnum,14056293:doAdd,[(194,181)(194,258)])
link(Array,6915816:Array,[])
}
Add(MST_RowAction,4870764,343,161)
{
MSTControl="testTable"
}
Add(MST_RowAction,15658638,266,252)
{
Action=5
MSTControl="testTable"
link(onChange,9185103:doSelect,[])
}
Add(MT_AddData,14056293,203,252)
{
link(onAdd,15658638:doRowAction,[])
link(Data1,10227341:Value,[])
link(Data2,1891607:Value,[(216,244)(251,244)])
}
Add(Memory,10227341,203,203)
{
Default=Integer(3)
AddHint(4,-18,21,13,Default)
}
Add(Memory,1891607,245,203)
{
Default=Integer(9)
AddHint(2,-18,21,13,Default)
}
Add(IconsManager,8032623,203,98)
{
Name="iconColumn"
ImgSize=20
Icons=['down'=[ZIP7E04000078DA636060044201010620A9C090C1C2C020C6C0C0A001C44021A008441C041C5818860C602E63FF8F8CC9D12FB1C4E0BFD46663B2F5CBAEB4FAAFB0D3816CFD8AEB9CFFABEDF7254A3FBA7F41587367F07FBDE3B1FFB1C961D3EFFBB4E1BFC7C3EAFF0E378BFF5B5FC90363A3D329FF75F747FE575CEB04F68FD8226D9CFA43DF76609801D20F7203C81FF23B6C7186274F8510AA1B0BD8C066585CCC06B3D131C1F000AA717F5005368318F5D8F483FCE27AAF826CFD41AF5BC16690AB9F14FF0E14F8FF9F890984FFD8A3E203CCC8988505559E8503A60F006B34AD56]]
Point(EndIdxIcons)
Point(ImgSize)
}
Add(Debug,4918033,525,161)
{
WEName="click"
VDName=""
}
Add(Debug,9004417,525,189)
{
WEName="onSelect"
VDName=""
}
Add(Timer,16618968,399,252)
{
Interval=10
Enable=1
link(onTimer,1795852:doCompare,[])
}
Add(If_else,1795852,441,252)
{
Op2=Integer(-1)
link(onTrue,15360455:doEvent1,[])
link(Op1,303165:Index,[])
AddHint(16,-24,24,13,Op2)
}
Add(Message,10971311,546,259)
{
}
Add(Hub,15360455,497,252)
{
link(onEvent1,16618968:doStop,[(523,258)(523,299)(388,299)(388,265)])
link(onEvent2,10971311:doMessage,[])
}
Add(MST_SelectRow,9185103,329,252)
{
MSTControl="testTable"
link(onSelectRow,16618968:doTimer,[])
}
Add(MST_UseEditCtrl,6676570,147,427)
{
MSTControl="testTable"
link(onCellSize,13620734:doValue,[(185,433)(185,384)])
link(onEnterCell,87120:doEvent1,[])
link(onVisibleCell,653259:doVisible,[(185,447)(185,468)])
}
Add(MT_MultiData,2622840,238,420)
{
Count=4
Point(Data)
link(onData1,653259:doLeft,[])
link(onData2,653259:doTop,[])
link(Data,13620734:Value,[])
link(onData3,653259:doWidth,[])
link(onData4,653259:doHeight,[])
}
Add(Hub,87120,203,434)
{
OutCount=4
link(onEvent1,653259:doText2,[(225,440)(225,419)])
link(onEvent2,2622840:doSeparateMT,[(231,447)(231,426)])
link(onEvent3,653259:doSetFocus,[])
link(onEvent4,653259:doBringToFront,[])
}
Add(MT_Memory,13620734,238,378)
{
}
Add(Edit,653259,294,406)
{
Left=560
Top=425
Point(doLeft)
Point(doTop)
Point(doWidth)
Point(doHeight)
Point(doSetFocus)
Point(doBringToFront)
Point(doVisible)
link(Str,6676570:Cell,[(300,394)(342,394)(342,496)(174,496)])
}

Редактировалось 8 раз(а), последний 2025-04-11 14:37:47
карма: 11

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#156: 2025-04-11 16:07:12 ЛС | профиль | цитата
Насчет цвета текста селектора, пока ничего не делай. Есть одна идея. Будет время, вечерком гляну.
карма: 22

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#157: 2025-04-12 03:23:54 ЛС | профиль | цитата
Короче -- ни хрена не получилось. CDRF_NEWFONT не работает на селекторе, только на невыбранных строках. Думал обдурить -- не получается. При дефолтной отрисовке селектора (а это всегда будет, если не рисуем вручную и не подтверждаем потом CDRF_SKIPDEFAULT) шрифт рушится системой (там же видно, что он меняется на дефолтный системный).
Тч, твоя задумка миновать использование MST_DrawManager для отрисовки селектора с другим цветом шрифта работать не будет.

Редактировалось 1 раз(а), последний 2025-04-12 03:24:33
карма: 22

0
Ответов: 2360
Рейтинг: 683
#158: 2025-04-12 21:57:17 ЛС | профиль | цитата
nesco писал(а):
твоя задумка миновать использование MST_DrawManager для отрисовки селектора с другим цветом шрифта работать не будет.
Не ,nesco, накопал то что нужно. Вот покопался и оказалась что рисовать самому и не нужно, достаточно систему обмануть. Добавил два свойства:
IgnoreEmptyField=Игнорировать нажатие на пустое поле таблицы|14|1|True,False
FocusFrame=Рисуется рамка фокуса на таблице|14|0|True,False

Первое уже писал выше, а второе позволяет избавится от рамки фокуса. Цель такой не было, но оно само попутно попалось и решил добавить. Вот эта рамка не будет рисоваться если задействовать свойство:

А вот так выглядит выделенная строка с цветом текста (никакой рамки фокуса, при желании можно и с ней):

Логика внесенного кода такова что система сама рисует нужное, мы только подменяем некоторые значения.

-Если подключен MST_DrawManager, то вообще ничего не вносится. MST_DrawManager сам справляется и с рамкой и с выделенной строкой, нечего ему мешать.
-При рисовании выделенной строки сообщаем системе что не надо её рисовать как выделенную (на индекс выделенной строки никак не влияет), заменяем цвет фона на цвет выделенной строки и цвет текста на тот что у строки. Система сами все нарисует.
-Открывается возможность задать цвета выделенной строки в фокусе и цвет выделенной строки не в фокусе. Пока не вносил это дело в свойство, но очень напрашивается.
-Совместимость не пострадала
-FPC работает

Тестировал на разных схемах, проблем не выявил. Хорошо видно на примере идущем в справке по элементу MST_RowAction. Там и цвет фона строки и цвет текста строки.

Редактировалось 3 раз(а), последний 2025-04-13 15:21:19
карма: 11

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#159: 2025-04-12 23:13:12 ЛС | профиль | цитата
sla8a писал(а):
-Открывается возможность задать цвета выделенной строки в фокусе и цвет выделенной строки не в фокусе. Пока не вносил это дело в свойство, но очень напрашивается.

Во, тогда доканчивай с цветом.
Коды IgnoreEmptyField лучше замени вот на такое:

  if (Msg.message > WM_MOUSEFIRST) and (Msg.message < WM_MOUSELAST) and 
fClass._prop_IgnoreEmptyField and (Sender.LVItemAtPos(SmallInt(LoWord(Msg.lParam)),SmallInt(hiWord(Msg.lParam))) = -1) then
begin
Result := true;
Exit;
end;
карма: 22

0
Ответов: 2360
Рейтинг: 683
#160: 2025-04-13 00:00:19 ЛС | профиль | цитата
nesco писал(а):
тогда доканчивай с цветом.
Внес возможность менять цвет:

nesco писал(а):
Коды IgnoreEmptyField лучше замени вот на такое:
Это пока не вносил. Там case обрабатывает варианты Msg.message, разве правильно будет впихнуть еще и if?

Редактировалось 2 раз(а), последний 2025-04-13 15:21:34
карма: 11

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#161: 2025-04-13 01:18:54 ЛС | профиль | цитата
sla8a писал(а):
Там case обрабатывает варианты Msg.message, разве правильно будет впихнуть еще и if?

Да какая фиг разница

--- Добавлено в 2025-04-13 01:21:21

Ща будем посмотреть, че там к чему

Редактировалось 1 раз(а), последний 2025-04-13 01:21:21
карма: 22

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#162: 2025-04-13 02:45:27 ЛС | профиль | цитата
Таак. При мультиселекте цвет выбора не меняется со стандартного.

--- Добавлено в 2025-04-13 03:37:42

Добавлено еще несколько свойств - https://forum.hiasm.com/getfile/40553

Редактировалось 1 раз(а), последний 2025-04-13 03:37:42
карма: 22

0
файлы: 1hiMTStrTbl_Change_Select_Text_Color_25_04_13(edit).zip [15.4KB] [9]
Ответов: 2360
Рейтинг: 683
#163: 2025-04-13 10:53:35 ЛС | профиль | цитата
nesco писал(а):
Таак. При мультиселекте цвет выбора не меняется со стандартного.
Поправил, должно работать.

Ты взял и подвинул возможность отображать шрифт заданный строке. Добавил режим:
CustomTextDefault - к селектору применяются пользовательские цвета, цвет строки остается заданным строкой)

Может нужно еще добавить цвет текста для селектора без фокуса?
И как насчет вынести свойства селектора из свойства Table? Думаю будет удобней пользоваться.

Редактировалось 4 раз(а), последний 2025-04-13 15:21:44
карма: 11

0
Разработчик
Ответов: 26252
Рейтинг: 2140
#164: 2025-04-13 13:24:33 ЛС | профиль | цитата
А почему ты вот это изменил

if not _prop_FocusFrame and (Control.LVCurItem = -1) then//delete focus frame
и сделал так

if not _prop_FocusFrame then//delete focus frame
карма: 22

0
Ответов: 2360
Рейтинг: 683
#165: 2025-04-13 13:47:07 ЛС | профиль | цитата
if not _prop_FocusFrame then//delete focus frame
Этот код удаляет фокусную рамку вообще со всех строк. Не думаю что делать проверку каждой строке является ли строка в фокусе будет "дешевле", чем сразу каждой назначить без фокуса.
Раньше проверка была только для выделенной строки. Но при множественном выборе возможен вариант когда выделенная строка будет отменена (выделить все строки, нажать с зажатым Ctrl на строку курсором). Если включить фокусную рамку, то будет видно что строка уже не выделена, а еще держит фокус. Так же работает появление рамки и ее отсутствие при остальных режимах. Вот и поменял.

Редактировалось 6 раз(а), последний 2025-04-13 13:56:01
карма: 11

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