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

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

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

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

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

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

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

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

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

0
Разработчик
Ответов: 26315
Рейтинг: 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
Разработчик
Ответов: 26315
Рейтинг: 2146
#279: 2025-08-24 23:49:42 ЛС | профиль | цитата
Последние изменения в режиме перетаскивания строки.
1. Добавлено ограничение перемещения мыши только в пределах таблицы
2. Найдена и устранена причина неработоспособности совместно с MST_DrawManager
3. В режиме текста на пустой таблице убирается грид, если он есть, тк он перекрывает текст на пустой таблице. Естественно, грид появляется, если таблица заполняется.
Единственное, что пока не удалось побороть, так это мерцание заголовка при перемещении за область 0-й строки в режиме даблбуфферинга. Но иначе селектор перемещается поверх заголовка.
карма: 22

0
файлы: 1MST_RowDragDrop_003.zip [29.8KB] [43]
Ответов: 2456
Рейтинг: 695
#280: 2025-08-25 19:10:24 ЛС | профиль | цитата
А ты все жадничаешь ini файл в архив положить. Я то помню где ты его в теме выкладывал, а кто другой захочет протестировать и не сможет.
1. Не удалось убежать при перетаскивании за пределы таблицы.
nesco писал(а):
Но иначе селектор перемещается поверх заголовка.
Так и пёс с ним. Что плохого что поверху заголовка отобразится? Описанное тобой мерцание вижу, но чтоб ты не написал, то и не заметил бы.

Все еще реагирует на нажатие других клавиш в момент перетаскивания (ПКМ, Ctrl, Shift). Не смертельно, но если есть возможность, то лучше заблокировать.

В режиме MultiSelect перетаскивание наверно лучше запретить.

nesco писал(а):
P.S. Интересует отработка режима перемещения в состояние 'с' и 'без' двойной буферизации. Особенно, нагрузка на процессор. В режиме 'без' двойной буферизации у меня
наблюдается артефакт покачивания селектора вставки, в режиме 'с' двойной буферизацией работает без артефакта.


Если это еще актуально, то артефакт не наблюдаю. А процессор напрягает что с, что без. Ryzer 5 аж до 8% и пишет что энергопотребление очень высокое
карма: 11

0
Разработчик
Ответов: 26315
Рейтинг: 2146
#281: 2025-08-28 14:34:36 ЛС | профиль | цитата
sla8a писал(а):
А ты все жадничаешь ini файл в архив положить. Я то помню где ты его в теме выкладывал, а кто другой захочет протестировать и не сможет

Следующий раз обязательно положу.
sla8a писал(а):
Все еще реагирует на нажатие других клавиш в момент перетаскивания (ПКМ, Ctrl, Shift). Не смертельно, но если есть возможность, то лучше заблокировать.

Ладно ПКМ, я его не блокировал, но вот какого хрена на Ctrl, Shift реагирует, совсем не понятно. Принято, надо будет подумать.
sla8a писал(а):
А процессор напрягает что с, что без. Ryzer 5 аж до 8% и пишет что энергопотребление очень высокое

Есть одна идея, как от этого попытаться избавиться. Но только не уверен до конца, что получится.
карма: 22

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