Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26313
Рейтинг: 2146
#271: 2025-08-04 22:06:30 ЛС | профиль | цитата
Gunta писал(а):
Я пока не вижу никакой необходимости в перетаскивании строк мышкой.

Ну, уже сделано, что теперь? Не выбрасывать же?

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

0
Ответов: 2443
Рейтинг: 693
#272: 2025-08-05 09:21:41 ЛС | профиль | цитата
nesco, у меня при перетаскивании к курсору гирю привязали. Как будто DPI уменьшается. Особенно заметно когда тянешь строку вниз, а потом вверх, скорость вверх очень сильно уменьшается. Прозрачность хорошо смотрится.
карма: 11

0
Разработчик
Ответов: 26313
Рейтинг: 2146
#273: 2025-08-06 00:33:18 ЛС | профиль | цитата
sla8a писал(а):
у меня при перетаскивании к курсору гирю привязали. Как будто DPI уменьшается

Процессор не справляется. Все же этот метод отрисовки процессорозависимый. Распараллелить бы неплохо было бы (я проверил, действительно, нагрузка идет на один поток, и вот теперь это меня озадачило). Тк в методах отрисовки используется Scanline, то можно попытаться распараллелить операции сканирования. Я попробую реализовать распараллеливание, но ничего обещать не буду.
sla8a писал(а):
Прозрачность хорошо смотрится

Это не совсем прозрачность, это псевдопрозрачность (в этом методе не задействуется альфа-канал)

Редактировалось 4 раз(а), последний 2025-08-06 00:50:22
карма: 22

0
Разработчик
Ответов: 26313
Рейтинг: 2146
#274: 2025-08-11 00:46:26 ЛС | профиль | цитата
Добавлены некоторые изменения в код. В частности, убран отдельный графический обработчик субкласса перемещаемой строки _onRowPaint и сведен в собственный обработчик субкласса -- row_EditWndProc. Убраны некоторые траблы при захвате строки, приводящие к несанкционированному самопроизвольному перемещению строки по полю. Добавлено небольшое контрастирование строки в режиме перемещения. Немного откорректирована линия селектора вставки, она теперь не захватывает поле иконок. Добавлен запрет использования перемещения в режимы не таблицы.
P.S. Интересует отработка режима перемещения в состояние 'с' и 'без' двойной буферизации. Особенно, нагрузка на процессор. В режиме 'без' двойной буферизации у меня наблюдается артефакт покачивания селектора вставки, в режиме 'с' двойной буферизацией работает без артефакта.

Редактировалось 3 раз(а), последний 2025-08-11 00:53:12
карма: 22

0
файлы: 1MST_RowDragDrop_002.zip [29.4KB] [32]
Ответов: 2443
Рейтинг: 693
#275: 2025-08-11 13:04:30 ЛС | профиль | цитата
nesco, тестировал на такой схеме (твоя, но немного удалил):

Add(MainForm,15549212,84,203)
{
Width=570
Height=495
Caption="alcColorTable"
Point(onKeyDown)
link(onCreate,10867382:doEnum,[])
}
Add(ArrayEnum,10867382,147,217)
{
link(onItem,8476894:doSplit,[])
link(Array,2073113:Array,[])
}
Add(MultiStrData,8476894,196,217)
{
Char="="
link(onPart1,10492467:doTrim,[(249,223)(249,118)])
link(onPart2,10430147:doTrim,[])
}
Add(Trim,10430147,252,224)
{
Char=";"
link(onTrim,9961426:doCopy,[])
}
Add(Copy,9961426,301,224)
{
Position=5
Count=6
link(onCopy,51021:doEvent1,[])
}
Add(Copy,6565334,427,154)
{
Count=2
link(onCopy,4983611:doValue,[])
}
Add(Hub,51021,357,224)
{
OutCount=3
link(onEvent1,6565334:doCopy,[(399,230)(399,160)])
link(onEvent2,13490066:doCopy,[(409,237)(409,202)])
link(onEvent3,14896559:doCopy,[])
}
Add(Copy,13490066,427,196)
{
Position=3
Count=2
link(onCopy,10482346:doValue,[])
}
Add(Copy,14896559,427,238)
{
Position=5
Count=2
link(onCopy,13132822:doString,[])
}
Add(FormatStr,13132822,490,238)
{
DataCount=3
Mask="%1%2%3"
Point(FString)
link(onFString,7780749:doConvert,[])
link(Str2,10482346:Value,[])
link(Str3,4983611:Value,[])
}
Add(Memory,4983611,504,154)
{
}
Add(Memory,10482346,497,196)
{
}
Add(Trim,10492467,427,112)
{
Char=" "
link(onTrim,13639368:doReplace,[])
}
Add(Memory,11135864,700,112)
{
}
Add(Convertor,7780749,539,238)
{
Mode=5
link(onResult,14621313:doEvent1,[])
}
Add(FormatStr,4371953,700,245)
{
DataCount=8
Mask="%8=%1=%2=%7=%5=%4=%3=%6"
link(onFString,14363550:doMTString,[])
link(Str1,11135864:Value,[])
link(Str3,4420109:R,[])
link(Str4,4420109:G,[])
link(Str5,4420109:B,[])
link(Str6,560770:EndIdxIcons,[(741,224)(859,224)(859,310)(923,310)])
link(Str7,13132822:FString,[(748,233)(622,233)(622,282)(496,282)])
link(Str8,7216616:GetData,[])
}
Add(Convertor,6558578,658,245)
{
Digits=8
SymbolFill="0"
link(onResult,4371953:doString,[])
}
Add(Replace,13639368,504,112)
{
SubStr="acl"
link(onReplace,11135864:doValue,[])
}
Add(Hub,14621313,581,238)
{
link(onEvent1,4982551:doEvent1,[(617,244)(617,174)])
link(onEvent2,6558578:doConvert,[])
}
Add(ToRGB,4420109,714,189)
{
}
Add(EventFromData,7216616,749,84)
{
link(onEvent,1578733:doOperation,[])
}
Add(Math,1578733,798,84)
{
Op2=1
ResultType=0
link(onResult,7216616:doData,[(842,90)(842,78)(737,78)(737,90)])
link(Op1,10867382:Index,[(804,72)(475,72)(475,261)(160,261)])
}
Add(StrList,2073113,133,140)
{
FileName="ColorConstant.txt"
Strings=#38: aclAliceBlue = $FFF0F8FF;|38: aclAntiqueWhite = $FFFAEBD7;|38: aclAqua = $FF00FFFF;|38: aclAquamarine = $FF7FFFD4;|38: aclAzure = $FFF0FFFF;|38: aclBeige = $FFF5F5DC;|38: aclBisque = $FFFFE4C4;|38: aclBlack = $FF000000;|38: aclBlanchedAlmond = $FFFFEBCD;|38: aclBlue = $FF0000FF;|38: aclBlueViolet = $FF8A2BE2;|38: aclBrown = $FFA52A2A;|38: aclBurlyWood = $FFDEB887;|38: aclCadetBlue = $FF5F9EA0;|38: aclChartreuse = $FF7FFF00;|38: aclChocolate = $FFD2691E;|38: aclCoral = $FFFF7F50;|38: aclCornflowerBlue = $FF6495ED;|38: aclCornsilk = $FFFFF8DC;|38: aclCrimson = $FFDC143C;|38: aclCyan = $FF00FFFF;|38: aclDarkBlue = $FF00008B;|38: aclDarkCyan = $FF008B8B;|38: aclDarkGoldenrod = $FFB8860B;|38: aclDarkGray = $FFA9A9A9;|38: aclDarkGreen = $FF006400;|38: aclDarkKhaki = $FFBDB76B;|38: aclDarkMagenta = $FF8B008B;|38: aclDarkOliveGreen = $FF556B2F;|38: aclDarkOrange = $FFFF8C00;|38: aclDarkOrchid = $FF9932CC;|38: aclDarkRed = $FF8B0000;|38: aclDarkSalmon = $FFE9967A;|38: aclDarkSeaGreen = $FF8FBC8B;|38: aclDarkSlateBlue = $FF483D8B;|38: aclDarkSlateGray = $FF2F4F4F;|38: aclDarkTurquoise = $FF00CED1;|38: aclDarkViolet = $FF9400D3;|38: aclDeepPink = $FFFF1493;|38: aclDeepSkyBlue = $FF00BFFF;|38: aclDimGray = $FF696969;|38: aclDodgerBlue = $FF1E90FF;|38: aclFirebrick = $FFB22222;|38: aclFloralWhite = $FFFFFAF0;|38: aclForestGreen = $FF228B22;|38: aclFuchsia = $FFFF00FF;|38: aclGainsboro = $FFDCDCDC;|38: aclGhostWhite = $FFF8F8FF;|38: aclGold = $FFFFD700;|38: aclGoldenrod = $FFDAA520;|38: aclGray = $FF808080;|38: aclGreen = $FF008000;|38: aclGreenYellow = $FFADFF2F;|38: aclHoneydew = $FFF0FFF0;|38: aclHotPink = $FFFF69B4;|38: aclIndianRed = $FFCD5C5C;|38: aclIndigo = $FF4B0082;|38: aclIvory = $FFFFFFF0;|38: aclKhaki = $FFF0E68C;|38: aclLavender = $FFE6E6FA;|38: aclLavenderBlush = $FFFFF0F5;|38: aclLawnGreen = $FF7CFC00;|38: aclLemonChiffon = $FFFFFACD;|38: aclLightBlue = $FFADD8E6;|38: aclLightCoral = $FFF08080;|38: aclLightCyan = $FFE0FFFF;|38: aclLightGoldenrodYellow = $FFFAFAD2;|38: aclLightGray = $FFD3D3D3;|38: aclLightGreen = $FF90EE90;|38: aclLightPink = $FFFFC0CB;|38: aclLightSalmon = $FFFFA07A;|38: aclLightSeaGreen = $FF20B2AA;|38: aclLightSkyBlue = $FF87CEFA;|38: aclLightSlateGray = $FF778899;|38: aclLightSteelBlue = $FFB0C4DE;|38: aclLightYellow = $FFFFFFE0;|38: aclLime = $FF00FF00;|38: aclLimeGreen = $FF32CD32;|38: aclLinen = $FFFAF0E6;|38: aclMagenta = $FFFF00FF;|38: aclMaroon = $FF800000;|38: aclMediumAquamarine = $FF66CDAA;|38: aclMediumBlue = $FF0000CD;|38: aclMediumOrchid = $FFBA55D3;|38: aclMediumPurple = $FF9370DB;|38: aclMediumSeaGreen = $FF3CB371;|38: aclMediumSlateBlue = $FF7B68EE;|38: aclMediumSpringGreen = $FF00FA9A;|38: aclMediumTurquoise = $FF48D1CC;|38: aclMediumVioletRed = $FFC71585;|38: aclMidnightBlue = $FF191970;|38: aclMintCream = $FFF5FFFA;|38: aclMistyRose = $FFFFE4E1;|38: aclMoccasin = $FFFFE4B5;|38: aclMoneyGreen = $FFC0DCC0;|38: aclNavajoWhite = $FFFFDEAD;|38: aclNavy = $FF000080;|38: aclOldLace = $FFFDF5E6;|38: aclOlive = $FF808000;|38: aclOliveDrab = $FF6B8E23;|38: aclOrange = $FFFFA500;|38: aclOrangeRed = $FFFF4500;|38: aclOrchid = $FFDA70D6;|38: aclPaleGoldenrod = $FFEEE8AA;|38: aclPaleGreen = $FF98FB98;|38: aclPaleTurquoise = $FFAFEEEE;|38: aclPaleVioletRed = $FFDB7093;|38: aclPapayaWhip = $FFFFEFD5;|38: aclPeachPuff = $FFFFDAB9;|38: aclPeru = $FFCD853F;|38: aclPink = $FFFFB6C1;|38: aclPlum = $FFDDA0DD;|38: aclPowderBlue = $FFB0E0E6;|38: aclPurple = $FF800080;|38: aclRed = $FFFF0000;|38: aclRosyBrown = $FFBC8F8F;|38: aclRoyalBlue = $FF4169E1;|38: aclSaddleBrown = $FF8B4513;|38: aclSalmon = $FFFA8072;|38: aclSandyBrown = $FFF4A460;|38: aclSeaGreen = $FF2E8B57;|38: aclSeaShell = $FFFFF5EE;|38: aclSienna = $FFA0522D;|38: aclSilver = $FFC0C0C0;|38: aclSkyBlue = $FFA6CAF0;|38: aclSlateBlue = $FF6A5ACD;|38: aclSlateGray = $FF708090;|38: aclSnow = $FFFFFAFA;|38: aclSpringGreen = $FF00FF7F;|38: aclSteelBlue = $FF4682B4;|38: aclTan = $FFD2B48C;|38: aclTeal = $FF008080;|38: aclThistle = $FFD8BFD8;|38: aclTomato = $FFFF6347;|38: aclTransparent = $00FFFFFF;|38: aclTurquoise = $FF40E0D0;|38: aclViolet = $FFEE82EE;|38: aclWheat = $FFF5DEB3;|38: aclWhite = $FFFFFFFF;|38: aclWhiteSmoke = $FFF5F5F5;|38: aclYellow = $FFFFFF00;|38: aclYellowGreen = $FF9ACD32;|
Point(doLoad)
}
Add(MTStrTbl,3412059,154,350)
{
Left=5
Top=5
Width=545
Height=423
Font=[Courier New,8,1,0,204]
Name="tabl"
Columns=#5:ID=60|8:Name=125|8:Color=80|6:HEX=80|7:Blue=60|8:Green=60|6:Red=60|
FlatScroll=1
ColumnClick=1
RowDragDrop=0
SmallIconsManager="icons"
DrawManager="draw"
Point(onMouseMove)
Point(ItemAtPos)
Point(onMouseUp)
link(onClick,8857963:doSeparateMT,[(226,356)(226,321)])
link(onColumnClick,437380:doCase,[])
}
Add(MST_RowAction,7296923,819,231)
{
MSTControl="tabl"
}
Add(MT_String,14363550,770,231)
{
Delimeter="="
link(onResult,7296923:doRowAction,[])
}
Add(IconsManager,560770,903,238)
{
Name="icons"
ImgSize=20
Icons=[]
Point(EndIdxIcons)
}
Add(Hub,4982551,658,168)
{
OutCount=4
link(onEvent1,14329012:doCreate,[(876,174)(876,111)])
link(onEvent2,4682190:doData,[(876,181)(876,202)])
link(onEvent3,15126526:doAdd,[(866,188)(866,328)])
link(onEvent4,4420109:doGetRGB,[])
}
Add(Bitmap,14329012,903,91)
{
HWidth=20
HHeight=20
Point(doCreate)
Point(onCreate)
link(onCreate,1719533:doDraw,[(971,97)(971,160)])
}
Add(Icon,14341706,952,182)
{
Transparent=65793
Point(doLoadFromBitmap)
}
Add(DoData,4682190,903,196)
{
link(onEventData,14341706:doLoadFromBitmap,[])
link(Data,6420969:Var2,[])
}
Add(ArrayRW,15126526,938,308)
{
link(Array,560770:IconArray,[(944,289)(909,289)])
link(Value,14341706:Icon,[])
}
Add(Img_Rectangle,1719533,1008,154)
{
Point(Point1)
Point(Point2)
link(Bitmap,6420969:Var3,[(1014,145)])
link(Point1,6621306:Point,[(1028,138)(986,138)])
link(Point2,15381893:Point,[])
}
Add(GetDataEx,6420969,903,140)
{
link(Data,14329012:Bitmap,[])
}
Add(PointXY,6621306,980,91)
{
}
Add(PointXY,15381893,1029,91)
{
X=20
Y=20
}
Add(MST_SortInCol,2218945,266,350)
{
MSTControl="tabl"
Point(doSortDigit)
}
Add(Case,437380,217,357)
{
Value=Integer(3)
link(onNextCase,2218945:doSortDigit,[])
}
Add(Edit,12538303,322,315)
{
Left=455
Top=435
Width=95
Font=[Tahoma,8,1,0,204]
Cursor=1
Text=""
Alignment=2
}
Add(MT_MultiData,8857963,266,315)
{
From=2
Count=1
Point(Data)
link(onData1,12538303:doText,[])
link(Data,3412059:Select,[(272,303)(140,303)(140,415)(160,415)])
}

MST_DrawManager, удаляю так как с ним тормозит еще сильнее. С двойной буферизации тормозит и загружает процессор (Intel D935) на 50%, без редко до 40%.
Есть косяки с самим перемещением курсора при перетаскивании. Как минимум один можно подтвердить экспериментально:
1. Прокрутить таблицу немного вниз
2. Зажать строку и начать резко перемещать вверх за пределы таблицы
3. Выйдя за таблицу, перемещаемая строка не отображается, скролл не рабоатет, курсор ограничен в перемещении по ширине таблицы
Удавалось и выскочить за пределы таблицы вниз и так чтоб перетаскиваемая строка двигалась вверх даже при неподвижном курсоре, но порядок действий описать пока не могу.
Зачем при начале перетаскивания строка остается видимой (та что не под курсором, а в самой таблице)?
1. Зажми первую строку и начни немного перетаскивать вниз
2. Нажми кнопку PageDown (или кнопку стрелки вниз)
3. Измениться выделенная строка
4. Отпустить перетаскиваемую строку
5. Переместиться не первая строка которую начали перетаскивать, а та которая стала выделенной после управления клавиатурой

Редактировалось 1 раз(а), последний 2025-08-11 13:05:24
карма: 11

0
Разработчик
Ответов: 26313
Рейтинг: 2146
#276: 2025-08-11 15:26:06 ЛС | профиль | цитата
sla8a писал(а):
Зачем при начале перетаскивания строка остается видимой (та что не под курсором, а в самой таблице)?

Селект должен обязательно остаться в таблице, иначе алгоритм работать не будет. Перемещение привязано к селекту. Это обязательное условие. Тут я ничего переделывать не буду. Могу только заблокировать клавиши на время перемещения.

--- Добавлено в 2025-08-11 15:32:15

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

--- Добавлено в 2025-08-11 15:58:39

Вот блокировка клавиш в WndProcTabGrid на момент перемещения:

      WM_KEYDOWN:
begin
if InitDrag then
begin
Result := true;
exit;
end;

--- Добавлено в 2025-08-11 16:17:45

sla8a писал(а):
С двойной буферизации тормозит и загружает процессор (Intel D935) на 50%, без редко до 40%

Да тестовая машина у тебя конечно сильная
Проц 2007 года, сильно, это когда на дворе 2025.

Редактировалось 14 раз(а), последний 2025-08-11 16:17:45
карма: 22

0
Ответов: 2443
Рейтинг: 693
#277: 2025-08-12 09:16:21 ЛС | профиль | цитата
nesco писал(а):
Перемещение привязано к селекту. Это обязательное условие. Тут я ничего переделывать не буду.
Тоже делал вначале так, но с удалением переносимой строки мне понравилось больше. Но это уже дело вкуса и не на что не влияет.
nesco писал(а):
Да тестовая машина у тебя конечно сильная
Старая рабочая лошадка, самое то для тестов И на ней сразу видно если что-то много кушает. Да и не должно перетаскивание строки столько кушать
карма: 11

0
Разработчик
Ответов: 26313
Рейтинг: 2146
#278: 2025-08-12 12:58:30 ЛС | профиль | цитата
sla8a писал(а):
Да и не должно перетаскивание строки столько кушать

Тут проблема в спаме системой сообщений нажатой кнопки и движения мыши. Мы никуда от этого не денемся. Я отключал все графические режимы, нагрузка практически не менялась. Сказывается еще и обработка этих сообщений KOL-ом, особенно, при дабле.

--- Добавлено в 2025-08-12 13:10:06

sla8a писал(а):
Тоже делал вначале так, но с удалением переносимой строки мне понравилось больше

Системный режим перемещения столбца так же не удаляет столбец, пока не отпустишь кнопку мыши.

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

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