Вверх ↑
Этот топик читают: Гость
Ответов: 2415
Рейтинг: 691
#1: 2025-01-15 11:34:29 ЛС | профиль | цитата
Элемент MST_DragRow предназначен для перетаскивания выбранной строки курсором (зажатой левой клавишей мыши) в таблице строк MTStrTbl (вкладка Интерфейс 2, туда же и устанавливается по умолчанию). Работает как и все остальные элементы этой группы как менеджер и не требует каких либо настроек, достаточно подключить к таблице (свойство MSTControl). Точки в элементе все спрятаны, так как в большинстве случаев в них нет надобности. Но при желании можно и запретить перетаскивание определенных строк и отменить его в любой момент, а так же изменить вид перетаскиваемой строки.

Из известных проблем на данный момент:
-лучше не подключать сразу два элемента к одной таблице
-при включенном у таблицы множественном выборе (свойство MultiSelect = True) случается вместо начала перетаскивания строки уход в правый нижний край таблицы с выделением всего

Вид перетаскиваемой строки по умолчанию


Измененный вид перетаскиваемой строки



Скачать архив с элементом и примерами: Ссылка [29.04.2025 v1.1]
В архиве также pas файл для работы с компилятором FPC 3.2.2. Тема по компилятору: https://forum.hiasm.com/topic/61538

Элемент в тестовом режиме и на данный момент выложен для ознакомления.

Редактировалось 14 раз(а), последний 2025-04-29 10:32:44
карма: 11

2
Голосовали:strannik_nebes, Gitarist
Ответов: 191
Рейтинг: 5
#2: 2025-01-23 10:39:55 ЛС | профиль | цитата
Каких-то сбоев не выявлено, кроме указанных выше проблем.
карма: 1

0
Ответов: 264
Рейтинг: 18
#3: 2025-01-27 09:29:50 ЛС | профиль | цитата
С установленным AdjustControls не дружит

>
карма: 3

0
Ответов: 2415
Рейтинг: 691
#4: 2025-01-27 15:02:19 ЛС | профиль | цитата
fox-video, проблема в устаревшем файле таблицы MTStrTbl. getwinstyle - добавлено в таблицу относительно не так давно и им пользуется и MST_DragRow. Так что это не ошибка элемента MST_DragRow, а проблема в том что нет пока возможности обновлять файлы и автоматически вносить изменения в них чтоб работал AdjustControls. Стараюсь сделать необходимое чтоб это исправить, описано в этой теме: Изменение свойств интерфейса
карма: 11

0
Ответов: 191
Рейтинг: 5
#5: 2025-03-25 09:13:43 ЛС | профиль | цитата
sla8a, С новым компилятором FPC x64 не хочет работать.


Compiling D:\Soft\HiAsm 4 AltBuild FPC\Elements\delphi\code\hiMST_DragRow.pas
hiMST_DragRow.pas(207,10) Error: Illegal type conversion: "Int64" to "TMouseDownPt"
hiMST_DragRow.pas(242,58) Error: Call by var for arg no. 3 has to match exactly: Got "LongInt" expected "Int64"
hiMST_DragRow.pas(268,25) Error: Incompatible types: got "THIMST_DragRow._OnMessage(var MSG;var LongInt):Boolean;" expected "<procedure variable type of function(var MSG;var Int64):Boolean of object;Register>"
hiMST_DragRow.pas(330,4) Fatal: There were 3 errors compiling module, stopping
карма: 1

0
Ответов: 2415
Рейтинг: 691
#6: 2025-03-25 14:20:21 ЛС | профиль | цитата
strannik_nebes, прикрепил отдельно архив с файлом pas.
карма: 11

1
Голосовали:strannik_nebes
Ответов: 191
Рейтинг: 5
#7: 2025-04-14 08:23:08 ЛС | профиль | цитата
fix

Редактировалось 6 раз(а), последний 2025-04-14 08:47:48
карма: 1

0
Ответов: 158
Рейтинг: 1
#8: 2025-04-29 01:11:28 ЛС | профиль | цитата
Подскажите, почему, если сделать таблицу маленькой, с одним столбцом, то эффект "перетаскивания" действует только на последнюю и предпоследнюю строку?
Add(MainForm,12917916,49,91)
{
Width=169
Height=572
Caption="Test MST_DragRow"
Position=1
link(onCreate,10146517:doEnum,[])
}
Add(MTStrTbl,16035729,560,91)
{
Top=25
Width=144
Height=507
Font=[MS Sans Serif,12,0,0,1]
Name="Table_Column"
Layout="ver"
HeightScale=100
Columns=#10:Страна=100|0:|
FlatScroll=1
Redaction=0
HeaderDragDrop=0
Grid=0
DrawManager="testDraw"
Point(doVisible)
Point(doHeight)
Point(doCursor)
AddHint(-34,-32,83,13,Name)
}
Add(StrList,8154399,210,56)
{
Strings=#5:11111|5:88888|4:5555|8:78787878|5:88777|0:|
}
Add(ArrayEnum,10146517,224,105)
{
link(onItem,1274236:doRowAction,[])
link(Array,8154399:Array,[])
}
Add(MT_String,2002120,266,42)
{
}
Add(MST_RowAction,1274236,322,105)
{
MSTControl="Table_Column"
}
Add(MST_DragRow,8886965,84,406)
{
MSTControl="Table_Column"
Point(doRefresh)
Point(Bitmap)
Point(onStart)
Point(Handle)
Point(onEnd)
Point(Width)
Point(Height)
Point(onDrag)
link(onStart,2264624:doEvent1,[(124,412)(124,398)])
link(onEnd,4615193:doData,[(158,419)(158,293)])
}
Add(Img_Bmp,6251646,266,406)
{
link(onDraw,6864811:doOperation,[])
link(Bitmap,10190071:Var2,[])
}
Add(GetDataEx,9138734,224,382)
{
Angle=3
link(Data,8886965:Bitmap,[(216,387)(216,495)(90,495)])
}
Add(Hub,2264624,133,392)
{
link(onEvent1,10909638:doData,[(151,398)(151,237)])
link(onEvent2,2451278:doEvent,[])
}
Add(DoData,10909638,175,231)
{
Data=Integer(114)
link(onEventData,6108667:doWork2,[])
AddHint(-5,-20,33,13,Data)
}
Add(DoData,4615193,175,287)
{
Data=Integer(0)
link(onEventData,6108667:doWork3,[(221,293)])
AddHint(-2,-21,21,13,Data)
}
Add(HubEx,6108667,217,231)
{
link(onEvent,14652889:In,[])
}
Add(LineBreak,8062212,504,112)
{
Caption="cursor"
link(Out,16035729:doCursor,[])
Primary=[14652889,-273,119]
}
Add(RGN_SetToWindow,2060913,476,406)
{
link(onSetRegion,8886965:doRefresh,[(539,412)(539,533)(72,533)(72,412)])
link(Handle,8886965:Handle,[(482,389)(519,389)(519,486)(97,486)])
link(Region,14278502:Result,[(489,394)(513,394)(513,454)(398,454)])
}
Add(RGN_Script,14278502,392,406)
{
link(onCreateRgn,11834520:doDraw,[])
}
Add(LineBreakEx,14119014,98,469)
{
Caption="w"
Type=3
link(_Data,8886965:Width,[])
}
Add(LineBreakEx,740249,105,455)
{
Caption="h"
Type=3
link(_Data,8886965:Height,[])
}
Add(LineBreakEx,7434874,357,364)
{
Caption="w"
Type=2
}
Add(LineBreakEx,7085907,308,371)
{
Caption="h"
Type=2
}
Add(FormatStr,12641235,350,406)
{
DataCount=3
Mask="poly(0,%1,%1,0,%2,0,%2,%3,%1,%3)"
Point(FString)
link(onFString,14278502:doCreateRgn,[])
link(Str1,15136326:getVar,[])
link(Str2,7434874:getVar,[])
link(Str3,7877727:getVar,[])
}
Add(Math,6864811,308,406)
{
OpType=3
Op2=2
ResultType=0
link(onResult,12641235:doString,[])
link(Op1,7085907:getVar,[])
}
Add(LineBreakEx,7877727,364,378)
{
Caption="h"
Type=2
}
Add(Sharpened,4073863,224,406)
{
link(onResult,6251646:doDraw,[])
link(Bitmap,9138734:Var2,[])
}
Add(GetDataEx,10190071,266,382)
{
Angle=3
link(Data,9138734:Var3,[])
}
Add(LineBreakEx,13499235,308,455)
{
Caption="h2"
Type=3
link(_Data,6864811:Result,[])
}
Add(LineBreakEx,15136326,350,350)
{
Caption="h2"
Type=2
}
Add(RGN_Draw,11834520,434,406)
{
Style=0
LineColor=128
link(onDraw,2060913:doSetRegion,[])
link(Bitmap,10190071:Var3,[(440,387)])
}
Add(CheckBox,15192017,175,329)
{
Width=759
Height=25
Font=[MS Sans Serif,12,0,0,1]
Layout="ver"
Checked=0
Caption="Свой дизайн перетаскиваемой строки"
}
Add(IndexToChanel,2451278,175,399)
{
Point(Index)
link(onEvent2,4073863:doSharpened,[])
link(Index,15192017:Checked,[])
}


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

1
Голосовали:sla8a
Ответов: 2415
Рейтинг: 691
#9: 2025-04-29 10:36:24 ЛС | профиль | цитата
Gitarist, если правильно понял то ошибка была в том что перетаскивать получалось только вниз. Была проблема в определении позиции курсора над строкой из-за того что столбец был один. Поправил, архив в первом посте обновил. Достаточно обновить pas файл.
карма: 11

1
Голосовали:Gitarist
Ответов: 191
Рейтинг: 5
#10: 2025-05-14 13:21:12 ЛС | профиль | цитата
sla8a, Обнаружился баг. При добавлении строки AddRow в пустую таблицу, строка помещается на вторую строку (индекс 1). Первая строка- пустая. Иногда происходит появление дублера строки захваченной мышью. Причем дублированная строка добавляется после нажатия на левую кнопку мыши. Если убрать компонент с формы, то все становится нормально.
В тестовом примере MST_RowAction не проявляется (там примитивно). В моем случае, 11 колонок, есть пустые ячейки. Приходит одна строка с 11 значениями, ничего лишнего.

Редактировалось 7 раз(а), последний 2025-05-14 13:45:01
карма: 1

0
Ответов: 2415
Рейтинг: 691
#11: 2025-05-14 13:59:24 ЛС | профиль | цитата
strannik_nebes, лучше сделай небольшую схему где можно увидеть этот баг. Потому что даже вот это:
strannik_nebes писал(а):
При добавлении строки AddRow в пустую таблицу, строка помещается на вторую строку (индекс 1).
Уже очень странно, так как элемента MST_DragRow никак не должен повлиять на это. Не исключаю ошибок в элементе, но пока очень старно.
карма: 11

0
Ответов: 191
Рейтинг: 5
#12: 2025-05-14 15:08:19 ЛС | профиль | цитата
sla8a, Воспроизвести простой код у меня не получилось. Ищу дальше. Подозреваю, что какой-то конфликт переменных. Причем, проблема, когда в программе две и больше таблицы. DblClick точно влияет на дальнейшее поведение. Вылетают ошибки после его использования и появляется пустая строка из неоткуда вместе с добавляемой на соседней таблице. При обычном добавлении строки, кнопкой например, проблемы не наблюдаются.

--- Добавлено в 2025-05-14 15:30:11
Пример найден
Add(MTStrTbl,6345589,273,252)
{
Left=5
Top=5
Width=505
Height=505
Color=-16777192
Antialiased=4
ParentFont=0
Cursor=2
Ctl3D=1
Name="opis"
HintManager="hint"
Layout=""
DoubleBuffered=0
Columns=#15:Обозначение=150|9:Версия=70|16:Наименование=200|16:Код_документа=70|9:Литера=70|13:Кол.листов=80|9:Формат=70|14:Содержание=100|9:Статус=80|13:Имя_Файла=150|7:Hash=10|5:ID=10|
Grid=0
MultiSelect=0
Point(onDblClick)
Point(onMouseDown)
Point(onMouseMove)
link(onDblClick,14824978:doEvent1,[(317,286)(317,402)(58,402)(58,517)])
}
Add(MST_DragRow,16773662,273,203)
{
@Color=43775
MSTControl="opis"
}
Add(MST_RowAction,12688987,336,525)
{
@Color=43775
MSTControl="opis"
}
Add(DoData,16690491,196,525)
{
Data=String(09090.01.00.001ЧД;1;Стойка;ЧД;-;1;А4;Примечание -;утверждено;09090.01.00.001ЧД Стойка_вер.1.pdf;E20BBF6129070CA37DDCD0D545F70E32;26)
link(onEventData,5920228:doMTString,[(236,531)(236,545)])
}
Add(Timer,12126409,126,525)
{
AutoStop=1
link(onTimer,16690491:doData,[])
}
Add(MTStrTbl,6834339,336,399)
{
Left=545
Top=5
Width=505
Height=505
Color=-16777192
Antialiased=4
ParentFont=0
Cursor=2
Ctl3D=1
Name="opis1"
HintManager="hint"
Layout=""
DoubleBuffered=0
Columns=#15:Обозначение=150|9:Версия=70|16:Наименование=200|16:Код_документа=70|9:Литера=70|13:Кол.листов=80|9:Формат=70|14:Содержание=100|9:Статус=80|13:Имя_Файла=150|7:Hash=10|5:ID=10|
Grid=0
MultiSelect=0
Point(onDblClick)
Point(onMouseDown)
Point(onMouseMove)
}
Add(MST_Clear,10829305,126,420)
{
MSTControl="opis"
}
Add(MST_Clear,5016650,119,469)
{
MSTControl="opis1"
}
Add(Hub,14824978,70,511)
{
OutCount=3
link(onEvent1,10829305:doClear,[(105,517)(105,426)])
link(onEvent2,5016650:doClear,[(102,524)(102,475)])
link(onEvent3,12126409:doTimer,[])
}
Add(MST_RowAction,10945025,336,581)
{
MSTControl="opis1"
}
Add(Hub,4682945,287,525)
{
link(onEvent1,12688987:doRowAction,[])
link(onEvent2,10945025:doRowAction,[(319,538)(319,587)])
}
Add(MT_String,5920228,245,525)
{
link(onResult,4682945:doEvent1,[])
}
Add(MainForm,2953706,21,105)
{
Width=1101
Height=739
}


Редактировалось 14 раз(а), последний 2025-05-15 08:23:52
карма: 1

1
Голосовали:sla8a
Ответов: 2415
Рейтинг: 691
#13: 2025-05-14 21:55:03 ЛС | профиль | цитата
strannik_nebes, получается процесс перетаскивания начинается в промежутке между очисткой таблицы и добавление строки. Посмотрю как это лучше поправить.
А протестируй у себя такую правку. Выдели элемент DragRow, нажми Ctrl+F, и в 233 строке поменяй это:
   	  if sControl.Count = 1 then exit;
на это:
   	  if sControl.Count < 2 then exit;
Нажми Ctrl+S чтоб сохранить изменения. Вкладку с кодом элемента можно закрыть.

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

0
Ответов: 191
Рейтинг: 5
#14: 2025-05-15 08:31:51 ЛС | профиль | цитата
sla8a, Та проблема пофиксена. Теперь не отображается сама удержанная строка мышью, когда 2 строки в таблице. С 3-мя строками и более - норм.

Add(MTStrTbl,6345589,546,294)
{
Left=5
Top=5
Width=505
Height=505
Color=-16777192
Antialiased=4
ParentFont=0
Cursor=2
Ctl3D=1
Name="opis"
HintManager="hint"
Layout=""
DoubleBuffered=0
Columns=#15:Обозначение=150|9:Версия=70|16:Наименование=200|16:Код_документа=70|9:Литера=70|13:Кол.листов=80|9:Формат=70|14:Содержание=100|9:Статус=80|13:Имя_Файла=150|7:Hash=10|5:ID=10|
Grid=0
MultiSelect=0
Point(onDblClick)
Point(onMouseDown)
Point(onMouseMove)
link(onDblClick,14824978:doEvent1,[(590,328)(590,444)(331,444)(331,559)])
}
Add(MST_DragRow,16773662,546,245)
{
@Color=43775
MSTControl="opis"
}
Add(MST_RowAction,12688987,609,567)
{
@Color=43775
MSTControl="opis"
}
Add(DoData,16690491,469,567)
{
Data=String(АААА.09090.01.00.002ЧД;1;Стойка;ЧД;-;1;А4;Примечание -;утверждено;АААА.002ЧД Стойка_вер.1.pdf;E20BBF6129070CA37DDCD0D545F70E32;27)
link(onEventData,10133622:doWork1,[(509,573)])
}
Add(Timer,12126409,399,567)
{
AutoStop=1
link(onTimer,8647369:doEvent1,[])
}
Add(MTStrTbl,6834339,609,441)
{
Left=545
Top=5
Width=505
Height=505
Color=-16777192
Antialiased=4
ParentFont=0
Cursor=2
Ctl3D=1
Name="opis1"
HintManager="hint"
Layout=""
DoubleBuffered=0
Columns=#15:Обозначение=150|9:Версия=70|16:Наименование=200|16:Код_документа=70|9:Литера=70|13:Кол.листов=80|9:Формат=70|14:Содержание=100|9:Статус=80|13:Имя_Файла=150|7:Hash=10|5:ID=10|
Grid=0
MultiSelect=0
Point(onDblClick)
Point(onMouseDown)
Point(onMouseMove)
}
Add(MST_Clear,10829305,399,462)
{
MSTControl="opis"
}
Add(MST_Clear,5016650,392,511)
{
MSTControl="opis1"
}
Add(Hub,14824978,343,553)
{
OutCount=3
link(onEvent1,10829305:doClear,[(378,559)(378,468)])
link(onEvent2,5016650:doClear,[(375,566)(375,517)])
link(onEvent3,12126409:doTimer,[])
}
Add(MST_RowAction,10945025,609,623)
{
MSTControl="opis1"
}
Add(Hub,4682945,560,567)
{
link(onEvent1,12688987:doRowAction,[])
link(onEvent2,10945025:doRowAction,[(592,580)(592,629)])
}
Add(MT_String,5920228,518,567)
{
link(onResult,4682945:doEvent1,[])
}
Add(DoData,11711978,469,616)
{
Data=String(АААА.09090.01.00.001ЧД;1;Стойка;ЧД;-;1;А4;Примечание -;утверждено;001ЧД Стойка_вер.1.pdf;E20BBF6129070CA37DDCD0D545F70E32;26\r\nОДСТ.09090.01.00.001ЧД;1;Стойка;ЧД;-;1;А4;Примечание -;утверждено;АААА.001ЧД Стойка_вер.1.pdf;E20BBF6129070CA37DDCD0D545F70E32;27)
link(onEventData,10133622:doWork3,[(509,622)])
}
Add(Hub,8647369,441,567)
{
link(onEvent1,16690491:doData,[])
link(onEvent2,11711978:doData,[(462,580)(462,622)])
}
Add(HubEx,10133622,505,581)
{
link(onEvent,5920228:doMTString,[])
}
Add(MainForm,12384757,294,147)
{
Width=1101
Height=739
}

карма: 1

0
Ответов: 2415
Рейтинг: 691
#15: 2025-05-15 09:58:06 ЛС | профиль | цитата
strannik_nebes, туже строку замени на:
 if not dragRow and (sControl.Count < 2) then exit;

Редактировалось 1 раз(а), последний 2025-05-15 09:58:20
карма: 11

1
Голосовали:strannik_nebes
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)