Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26264
Рейтинг: 2140
#181: 2025-04-16 01:54:20 ЛС | профиль | цитата
sla8a писал(а):
Думаю нужно сделать так

И чем это отличается от предложенного тобой выше?
карма: 22

0
Ответов: 2370
Рейтинг: 683
#182: 2025-04-16 12:18:03 ЛС | профиль | цитата
nesco, ничем. Выложил процедуру полностью.
Добавил:
*onEmptyFieldClick=Событие происходит всякий раз при нажатии на пустую (не занятую строками) область таблицы|2|0
И переделал блокировку нажатия по пустому полю. Событие на пустое как по мне вещь нужная.
Архив с правками: https://forum.hiasm.com/getfile/40562

Тестовая схема события onEmptyFieldClick:
Add(MainForm,2953706,42,112)
{
Width=494
Height=382
Position=1
link(onCreate,3556725:doEnum,[])
}
Add(MTStrTbl,11740120,84,203)
{
Left=5
Top=5
Width=470
Height=335
Font=[MS Sans Serif,12,0,0,1]
Name="test"
Columns=#1:№|9:test1=200|10:test2 =200|
IgnoreEmptyField=0
Grid=0
Point(onMouseDown)
Point(onEmptyFieldClick)
link(onMouseDown,12051947:doEvent,[])
link(onEmptyFieldClick,7912398:doEvent,[(142,244)(142,286)])
}
Add(MT_String,6192416,133,119)
{
link(onResult,9361380:doRowAction,[])
}
Add(StrList,6915816,70,70)
{
Strings=#32:1;test string 111;test string 12|32:2;test string 121;test string 22|32:3;test string 131;test string 32|32:4;test string 141;test string 42|32:5;test string 151;test string 52|32:6;test string 161;test string 62|32:7;test string 171;test string 72|32:8;test string 181;test string 82|
}
Add(ArrayEnum,3556725,84,126)
{
link(onItem,6192416:doMT,[])
link(Array,6915816:Array,[])
}
Add(MST_RowAction,9361380,182,119)
{
MSTControl="test"
}
Add(PopupMenu,5547842,224,287)
{
Menu=#3:Add|
}
Add(IndexToChanel,7912398,168,280)
{
link(onEvent2,5547842:doPopupHere,[])
}
Add(PopupMenu,12158859,224,238)
{
Menu=#3:Add|6:Change|6:Delete|
}
Add(IndexToChanel,12051947,168,231)
{
link(onEvent2,12158859:doPopupHere,[])
}


Редактировалось 2 раз(а), последний 2025-04-16 14:20:30
карма: 11

0
Ответов: 2370
Рейтинг: 683
#183: 2025-04-16 14:21:00 ЛС | профиль | цитата
nesco, вот последние: https://forum.hiasm.com/getfile/40562

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

0
Разработчик
Ответов: 26264
Рейтинг: 2140
#184: 2025-04-20 22:03:36 ЛС | профиль | цитата
sla8a, почему ты сделал выдачу события onEmptyFieldClick по DOWN, а не по UP?
карма: 22

0
Ответов: 2370
Рейтинг: 683
#185: 2025-04-21 11:20:23 ЛС | профиль | цитата
nesco, причины было две.
Первое это то что onMouseUp стараюсь не использовать в таблице, по той причине что всплывающее меню можно вывести, только если нажать курсором на строку и немного продвинуть и только потом отпустить. Только так получится событие onMouseUp.
Попробуй вывести всплывающее меню нажав на строки:

 Add(MainForm,2075368,539,322)
{
Width=494
Height=382
Position=1
link(onCreate,3556725:doEnum,[])
}
Add(MTStrTbl,11740120,581,413)
{
Left=5
Top=5
Width=470
Height=335
Font=[MS Sans Serif,12,0,0,1]
Name="test"
Columns=#1:№|9:test1=200|10:test2 =200|
IgnoreEmptyField=0
Grid=0
Point(onEmptyFieldClick)
Point(onMouseUp)
link(onEmptyFieldClick,7912398:doEvent,[])
link(onMouseUp,12051947:doEvent,[(625,454)(625,489)])
}
Add(MT_String,6192416,630,329)
{
link(onResult,9361380:doRowAction,[])
}
Add(StrList,6915816,567,280)
{
Strings=#32:1;test string 111;test string 12|32:2;test string 121;test string 22|32:3;test string 131;test string 32|32:4;test string 141;test string 42|32:5;test string 151;test string 52|32:6;test string 161;test string 62|32:7;test string 171;test string 72|32:8;test string 181;test string 82|
}
Add(ArrayEnum,3556725,581,336)
{
link(onItem,6192416:doMT,[])
link(Array,6915816:Array,[])
}
Add(MST_RowAction,9361380,679,329)
{
MSTControl="test"
}
Add(PopupMenu,5547842,693,448)
{
Menu=#3:Add|
}
Add(IndexToChanel,7912398,637,441)
{
link(onEvent2,5547842:doPopupHere,[])
}
Add(PopupMenu,12158859,693,490)
{
Menu=#3:Add|6:Change|6:Delete|
}
Add(IndexToChanel,12051947,637,483)
{
link(onEvent2,12158859:doPopupHere,[])
}

Второе это то что мне так и не удалось получить событие onEmptyFieldClick в WM_LBUTTONUP,WM_MBUTTONUP,WM_RBUTTONUP если в WM_LBUTTONDOWN,.... "заблокировать" нажатие Result := true. Насколько понял, то если нет нажатия, то система и не выдает отпускание.
Вот как вариант и onEmptyFieldClick не работает:

WM_LBUTTONUP,WM_MBUTTONUP,WM_RBUTTONUP:
if Control.LVItemAtPos(SmallInt(LoWord(Msg.lParam)),SmallInt(hiWord(Msg.lParam))) = -1 then
begin
if _prop_IgnoreEmptyField then
Result := true;
case Msg.WParam of
1: dtInteger(di,0);
2: dtInteger(di,1);
16: dtInteger(di,2);
else dtInteger(di,-1);
end;
_hi_onEvent_(_event_onEmptyFieldClick, di);
end;
WM_LBUTTONDOWN,WM_MBUTTONDOWN,WM_RBUTTONDOWN,
WM_LBUTTONDBLCLK,WM_MBUTTONDBLCLK,WM_RBUTTONDBLCLK:
if _prop_IgnoreEmptyField and (Control.LVItemAtPos(SmallInt(LoWord(Msg.lParam)),SmallInt(hiWord(Msg.lParam))) = -1) then
Result := true;

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

0
Разработчик
Ответов: 26264
Рейтинг: 2140
#186: 2025-04-21 22:58:51 ЛС | профиль | цитата
sla8a писал(а):
Первое это то что onMouseUp стараюсь не использовать в таблице, по той причине что всплывающее меню можно вывести, только если нажать курсором на строку и немного продвинуть и только потом отпустить. Только так получится событие onMouseUp.

Странное явление, непонятно чем объясняется даже.
Да пусть пока будет в такой реализации. Я просто спросил "почему".
карма: 22

0
Ответов: 2370
Рейтинг: 683
#187: 2025-04-22 21:51:43 ЛС | профиль | цитата
nesco, у элемента MST_ColAction есть хорошее свойство Action=StretchCol которая подгоняет (растягивает) ширину столбцов. Так вот раньше оно не знало о рамке таблице и неправильно считало ширину столбцов, что приводило к отображению горизонтального ползунка:

Но после добавления тобой функций fctl3d и fwinstyle можно учитывать при расчетах рамку таблицы:

Там правок в коде то пару строк: Архив c pas файлом и примером для тестирования

Редактировалось 2 раз(а), последний 2025-04-22 22:18:23
карма: 11

0
Разработчик
Ответов: 26264
Рейтинг: 2140
#188: 2025-04-23 00:09:42 ЛС | профиль | цитата
А на кой пес, собственно, эти функции, когда можно сделать просто вот так


  if _prop_MSTControl.getfctl3d then
begin
case _prop_MSTControl.getwinstyle of
0: b := 3;
1: b := 1;
2: b := 2;
3: b := 4;
4: b := 6;
end;
end
else
b := 1;
Там до этого уже проводится проверка на наличие интерфейса.

--- Добавлено в 2025-04-23 00:13:40

Да и в MST_UseEditCtrl они по-хорошему нах не нужны.

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

0
Ответов: 2370
Рейтинг: 683
#189: 2025-04-23 08:06:53 ЛС | профиль | цитата
nesco писал(а):
можно сделать просто вот так

Согласен, сильно упрощает код.
nesco, а не знаешь где "покопаться" чтоб отключить рисование горизонтальных или вертикальных линий сетки таблицы?

--- Добавлено в 2025-04-23 08:34:56

nesco писал(а):
когда можно сделать просто вот так
FPC не нравятся такие правки

--- Добавлено в 2025-04-23 08:39:57

Вот так FPC не ворчит:

if boolean(_prop_MSTControl.getfctl3d) then
case integer(_prop_MSTControl.getwinstyle) of

Редактировалось 3 раз(а), последний 2025-04-23 08:39:57
карма: 11

0
Ответов: 2370
Рейтинг: 683
#190: 2025-04-23 11:09:18 ЛС | профиль | цитата
И у MTStrTbl перенеси функцию GetScrollBarInfo перед implementation, чтоб FPC у MST_UseEditCtrl не ругался.

function GetScrollBarInfo(hwnd: HWND; idObject: Longint; var psbi: TScrollBarInfo): BOOL; stdcall; external 'user32.dll' name 'GetScrollBarInfo';

implementation

uses hiMultiBlockFind, hiStr_Enum;
карма: 11

0
Разработчик
Ответов: 26264
Рейтинг: 2140
#191: 2025-04-23 13:31:18 ЛС | профиль | цитата
sla8a писал(а):
а не знаешь где "покопаться" чтоб отключить рисование горизонтальных или вертикальных линий сетки таблицы?

Насколько я помню, то можно только отключить саму сетку. А вот по отдельности управление рисованием сетки я не встречал. Не исключено, что это системное свойство.

--- Добавлено в 2025-04-23 13:33:50

Че там с селектором, добавлять будем?

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

0
Ответов: 2370
Рейтинг: 683
#192: 2025-04-23 14:13:04 ЛС | профиль | цитата
nesco писал(а):
Че там с селектором, добавлять будем?
Как по мне так лучше добавить, а там если что выплывет, то поправим по ходу дела.
Лично мне после отключения одной только рамки фокуса, намного приятней работать. И это не какие-то рюшечки, а она реально криво смотрится. Если таблица без сетки, то рамка фокуса выглядит нормально, а сетка ее "режет" и выходит какое-то абы что.
карма: 11

0
Разработчик
Ответов: 26264
Рейтинг: 2140
#193: 2025-04-23 15:22:41 ЛС | профиль | цитата
sla8a, проверь на большой таблице будет ли мерцание вот такой код:


  inherited;

FBkColor := Control.Color;
FTextColor := Control.Font.Color;
FTextBkColor := Control.Color;
Control.LVBkColor := FBkColor;
Control.LVTextColor := FTextColor;
Control.LVTextBkColor := FTextBkColor;
Control.Tag := Cardinal(Self);
Control.AttachProc(WndProcTabGrid);
Control.AttachProc(WndHDR);
// Control.DoubleBuffered := _prop_DoubleBuffered;
if _prop_DoubleBuffered then Control.Perform(LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER);
Это двойная буферизация на уровне системы.
карма: 22

0
Ответов: 2370
Рейтинг: 683
#194: 2025-04-23 15:38:29 ЛС | профиль | цитата
nesco, мерцает. Если я LVS_EX_DOUBLEBUFFER конечно правильно указал.

const
LVS_EX_DOUBLEBUFFER = $00010000;
При "старом" Control.DoubleBuffered := _prop_DoubleBuffered; у меня вообще не мерцает.
карма: 11

0
Разработчик
Ответов: 26264
Рейтинг: 2140
#195: 2025-04-23 15:44:17 ЛС | профиль | цитата
А у тебя есть имитация такой таблицы?
карма: 22

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