Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26161
Рейтинг: 2127
#91: 2024-12-19 19:45:54 ЛС | профиль | цитата
sla8a писал(а):
-Сохранится совместимость

Она уже не сохраняется, тк, ChangeWidth должен быть первым.
Тогда уж ARG(ChangeWidth, PreviousWidth, ColIdx), что оставит совместимость с тем, что было до изменения. Или ARG(ChangeWidth, ColIdx, PreviousWidth). Выбирай, что лучше

Редактировалось 3 раз(а), последний 2024-12-19 19:49:40
карма: 22

0
Ответов: 2270
Рейтинг: 677
#92: 2024-12-20 08:34:57 ЛС | профиль | цитата
nesco писал(а):
ChangeWidth должен быть первым.
Посмотрел в старой версии там идет вначале ColIdx потом ChangeWidth
        begin
ind := HD_NOTIFY(Pointer(Msg.LParam)^).Item;
s := Sender.LVColText[ind] + _ColDlm +
int2str(PHDNotify(PNMHEADER(Msg.LParam))^.pItem^.cxy) + _ColDlm +
int2str(Sender.LVColImage[ind]) + _ColDlm +
int2str(ord(Sender.LVColAlign[ind]));
CList.Items[ind] := InitColStr(s);
dtInteger(di, ind);
dtInteger(dw, PHDNotify(PNMHEADER(Msg.LParam))^.pItem^.cxy);
di.ldata := @dw;
_hi_onEvent_(_event_onChangeWidth, di);
end;
Насколько помню так и было всегда. А с чего ты взял что было ARG(ChangeWidth, ColIdx) ?

Вот тема когда добавляли это дело: https://forum.hiasm.com/topic/52160/2

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

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#93: 2024-12-20 14:35:43 ЛС | профиль | цитата
sla8a писал(а):
Насколько помню так и было всегда

Насколько я знаю, то это почему-то отключили, и остался один ChangeWidth.
Хорошо, сделаем ARG(ColIdx, ChangeWidth, PreviousWidth). Так нормально будет?

--- Добавлено в 2024-12-20 14:38:57

Вот

        HDN_ENDTRACKA, HDN_ENDTRACKW:
begin
InvalidateRect(Sender.Handle, nil, false);
ind := HD_NOTIFY(Pointer(Msg.LParam)^).Item;
s := Sender.LVColText[ind] + _ColDlm +
int2str(PHDNotify(PNMHEADER(Msg.LParam))^.pItem^.cxy) + _ColDlm +
int2str(Sender.LVColImage[ind]) + _ColDlm +
int2str(ord(Sender.LVColAlign[ind]));
CList.Items[ind] := InitColStr(s);
dtInteger(di, ind);
dtInteger(dw, PHDNotify(PNMHEADER(Msg.LParam))^.pItem^.cxy);
dtInteger(dow, Sender.LVColWidth[ind]);
di.ldata := @dw;
dw.ldata := @dow;
_hi_onEvent_(_event_onChangeWidth, di);
end;

Редактировалось 1 раз(а), последний 2024-12-20 14:38:57
карма: 22

0
Ответов: 2270
Рейтинг: 677
#94: 2024-12-20 15:18:28 ЛС | профиль | цитата
nesco писал(а):
сделаем ARG(ColIdx, ChangeWidth, PreviousWidth). Так нормально будет?
Думаю что да.
карма: 11

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#95: 2024-12-21 17:19:52 ЛС | профиль | цитата
Пофиксил на SVN. Возможно, сегодня ночью добавлю General Patch на SVN. Туда войдут все добавленные фичи, включая MST_UseEditCtrl
карма: 22

1
Голосовали:envoy_sky
Разработчик
Ответов: 26161
Рейтинг: 2127
#96: 2024-12-22 01:04:31 ЛС | профиль | цитата
Патч добавлен на SVN со всем последними изменениями.
карма: 22

0
Ответов: 2270
Рейтинг: 677
#97: 2024-12-23 14:48:53 ЛС | профиль | цитата
nesco, MST_HDHints очень хорошая вещь
карма: 11

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#98: 2024-12-24 01:51:38 ЛС | профиль | цитата
sla8a писал(а):
MST_HDHints очень хорошая вещь

Я рад, что тебе понравилось
карма: 22

0
Ответов: 2270
Рейтинг: 677
#99: 2024-12-24 07:44:08 ЛС | профиль | цитата
nesco, элемент MST_RowAction при сдвиге строки вверх (UpRow) или вниз (DownRow) не сохраняет значение флажка состояния (checkbox) сдвигаемой строки. Это не связано с последним обновлением.
Тестовая схема:

Add(MainForm,10809136,154,126)
{
Width=778
Height=582
Position=1
Point(onKeyDown)
link(onCreate,10041622:doEnum,[])
}
Add(MTStrTbl,5133893,343,126)
{
Left=5
Top=5
Width=752
Height=433
Font=[MS Sans Serif,12,0,0,1]
WinStyle=4
Name="testTable"
Columns=#4:№=40|9:Фильм=200|9:Год=60==2|11:Жанр=200==2|12:Описание=300|0:|
CheckBoxes=0
Grid=0
}
Add(StrList,15034837,196,84)
{
Strings=#49:1;Звездные войны;1980;фантастика;Фильм о войнах )|32:2;1+1;2003;комедия;Фильм о двух |39:3;Убить Билла;1990;боевик;Убивают Билла|53:4;Крепкий орешик 2;1999;боевик;Встретил жену с работы|52:5;Куб;1993;фантастика;Для любителей трехмерных фигур|48:6;Аватар;2004;фантастика;Управляют синими телами|
}
Add(MT_String,922736,259,126)
{
link(onResult,2904434:doRowAction,[])
}
Add(ArrayEnum,10041622,210,140)
{
link(onItem,922736:doMTString,[])
link(onEndEnum,14792267:doData,[(249,153)(249,195)])
link(Array,15034837:Array,[])
}
Add(MST_RowAction,2904434,301,126)
{
MSTControl="testTable"
}
Add(Button,4370717,385,294)
{
Left=340
Top=445
Width=90
Height=40
Font=[MS Sans Serif,12,0,0,1]
Caption="Вверх"
link(onClick,10277927:doRowAction,[])
}
Add(Button,13202419,385,350)
{
Left=340
Top=495
Width=90
Height=40
Font=[MS Sans Serif,12,0,0,1]
Caption="Вниз"
link(onClick,2072383:doRowAction,[])
}
Add(MST_RowAction,10277927,441,294)
{
Action=8
MSTControl="testTable"
Point(Index)
link(Index,12943451:Var2,[])
}
Add(MST_RowAction,2072383,427,350)
{
Action=9
MSTControl="testTable"
Point(Index)
link(Index,12943451:Var1,[(433,264)])
}
Add(MST_SelectRow,15300888,434,189)
{
MSTControl="testTable"
}
Add(DoData,14792267,259,189)
{
Data=Integer(2)
link(onEventData,730855:doEvent1,[])
AddHint(-1,-20,21,13,Data)
}
Add(MST_CheckBoxes,9803949,392,231)
{
MSTControl="testTable"
}
Add(Hub,730855,315,189)
{
link(onEvent1,15300888:doSelect,[])
link(onEvent2,14797827:doAdd,[(336,202)(336,237)])
}
Add(MT_Add,14797827,343,231)
{
Data=Integer(1)
link(onAdd,9803949:doCheckBox,[])
AddHint(0,-23,21,13,Data)
}
Add(GetDataEx,12943451,441,259)
{
link(Data,15300888:Index,[])
}
Вариант решения:

// Сдвигает строку вверх
// ARG(IndexRow)
//
procedure THIMST_RowAction._work_doRowAction8;
var
sControl: PControl;
dt, di: TData;
oldindex: integer;
cbState: integer;//fix sla8a 24.12.2024 update checkbox
begin
if not Assigned(_prop_MSTControl) then exit;
sControl := _prop_MSTControl.ctrlpoint;
oldindex := ReadInteger(_Data, _data_Index, _prop_Index);
if (oldindex <= 0) or (oldindex > sControl.Count - 1) then exit;
dtNull(dt);
dtNull(di);
oldindex := sControl.LVCurItem;
cbState := sControl.LVItemStateImgIdx[oldindex];//fix sla8a 24.12.2024 update checkbox
dt := _prop_MSTControl.getstring(oldindex);
dtInteger(di, oldindex - 1);
di.ldata := @dt;
_prop_MSTControl.actionitm(di, ITM_INSERT);
inc(oldindex);
if Assigned(PData(sControl.LVItemData[oldindex])) then
begin
FreeData(PData(sControl.LVItemData[oldindex]));
Dispose(PData(sControl.LVItemData[oldindex]));
end;
sControl.LVDelete(oldindex);
sControl.LVCurItem := oldindex - 2;
sControl.LVItemStateImgIdx[oldindex - 2] := cbState;//fix sla8a 24.12.2024 update checkbox
_hi_onEvent(_event_onChange, sControl.LVCurItem);
end;

// Сдвигает строку вниз
// ARG(IndexRow)
//
procedure THIMST_RowAction._work_doRowAction9;
var
sControl: PControl;
dt, di: TData;
oldindex: integer;
cbState: integer;//fix sla8a 24.12.2024 update checkbox
begin
if not Assigned(_prop_MSTControl) then exit;
sControl := _prop_MSTControl.ctrlpoint;
oldindex := ReadInteger(_Data, _data_Index, _prop_Index);
if (oldindex < 0) or (oldindex >= sControl.Count - 1) then exit;
dtNull(dt);
dtNull(di);
oldindex := sControl.LVCurItem;
cbState := sControl.LVItemStateImgIdx[oldindex];//fix sla8a 24.12.2024 update checkbox
dt := _prop_MSTControl.getstring(oldindex);
dtInteger(di, oldindex + 2);
di.ldata := @dt;
_prop_MSTControl.actionitm(di, ITM_INSERT);
if Assigned(PData(sControl.LVItemData[oldindex])) then
begin
FreeData(PData(sControl.LVItemData[oldindex]));
Dispose(PData(sControl.LVItemData[oldindex]));
end;
sControl.LVDelete(oldindex);
sControl.LVCurItem := oldindex + 1;
sControl.LVItemStateImgIdx[oldindex + 1] := cbState;//fix sla8a 24.12.2024 update checkbox
_hi_onEvent(_event_onChange, sControl.LVCurItem);
end;
карма: 11

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#100: 2024-12-24 16:52:47 ЛС | профиль | цитата
Всем Привет!
sla8a писал(а):
не сохраняет значение флажка состояния

Я вечерком гляну.

Редактировалось 3 раз(а), последний 2024-12-24 16:53:57
карма: 22

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#101: 2024-12-25 04:02:38 ЛС | профиль | цитата
Пофиксил на SVN
карма: 22

0
Ответов: 2270
Рейтинг: 677
#102: 2024-12-26 15:05:05 ЛС | профиль | цитата
nesco, вот как-то не логично работает вывод события onCheck у MTStrTb. Срабатывает и при смене флажка курсором на таблице и при смене состояния флажка другими элементами: MST_CheckBoxes, MST_RowAction при сдвиге строки.

Add(MainForm,10809136,259,154)
{
Width=907
Height=582
Position=1
Point(onKeyDown)
link(onCreate,10041622:doEnum,[])
}
Add(MTStrTbl,5133893,483,455)
{
Left=5
Top=5
Width=622
Height=433
Font=[MS Sans Serif,12,0,0,1]
WinStyle=4
Name="testTable"
Columns=#4:№=40|9:Фильм=200|9:Год=60==2|11:Жанр=200==2|12:Описание=300|0:|
CheckBoxes=0
Grid=0
link(onCheck,6543734:doString,[])
}
Add(StrList,15034837,301,112)
{
Strings=#49:1;Звездные войны;1980;фантастика;Фильм о войнах )|32:2;1+1;2003;комедия;Фильм о двух |39:3;Убить Билла;1990;боевик;Убивают Билла|53:4;Крепкий орешик 2;1999;боевик;Встретил жену с работы|52:5;Куб;1993;фантастика;Для любителей трехмерных фигур|48:6;Аватар;2004;фантастика;Управляют синими телами|
}
Add(MT_String,922736,364,154)
{
link(onResult,2904434:doRowAction,[])
}
Add(ArrayEnum,10041622,315,168)
{
link(onItem,922736:doMTString,[])
link(onEndEnum,14792267:doData,[(354,181)(354,223)])
link(Array,15034837:Array,[])
}
Add(MST_RowAction,2904434,406,154)
{
MSTControl="testTable"
}
Add(Button,4370717,441,280)
{
Left=340
Top=445
Width=90
Height=40
Font=[MS Sans Serif,12,0,0,1]
Caption="Вверх"
link(onClick,10277927:doRowAction,[])
}
Add(Button,13202419,441,322)
{
Left=340
Top=495
Width=90
Height=40
Font=[MS Sans Serif,12,0,0,1]
Caption="Вниз"
link(onClick,2072383:doRowAction,[])
}
Add(MST_RowAction,10277927,497,280)
{
Action=8
MSTControl="testTable"
Point(Index)
link(Index,12943451:Var2,[])
}
Add(MST_RowAction,2072383,483,322)
{
Action=9
MSTControl="testTable"
Point(Index)
link(Index,12943451:Var1,[(489,264)])
}
Add(MST_SelectRow,15300888,490,217)
{
MSTControl="testTable"
}
Add(DoData,14792267,364,217)
{
Data=Integer(2)
link(onEventData,730855:doEvent1,[])
AddHint(-1,-20,21,13,Data)
}
Add(MST_CheckBoxes,9803949,483,385)
{
MSTControl="testTable"
link(onCheckBox,7250149:doString,[])
}
Add(Hub,730855,406,217)
{
link(onEvent1,15300888:doSelect,[])
link(onEvent2,14797827:doAdd,[(427,230)(427,391)])
}
Add(MT_Add,14797827,441,385)
{
Data=Integer(1)
link(onAdd,9803949:doCheckBox,[])
AddHint(0,-23,21,13,Data)
}
Add(GetDataEx,12943451,497,259)
{
link(Data,15300888:Index,[])
}
Add(ListBox,1534508,588,469)
{
Left=635
Top=10
Width=225
Height=430
}
Add(FormatStr,6543734,525,469)
{
Mask="MTStrTb [%1 %2]"
link(onFString,10122469:doWork2,[])
}
Add(FormatStr,7250149,525,385)
{
Mask="MST_CheckBoxes [%1 %2]"
link(onFString,10122469:doWork1,[(571,391)])
}
Add(HubEx,10122469,567,469)
{
link(onEvent,1534508:doAdd,[])
}
Почему бы не сделать так чтоб событие у MTStrTb выдавалось при смене флажка только при работе из таблицы, а все остальное блокировалось?
карма: 11

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#103: 2024-12-26 19:02:18 ЛС | профиль | цитата
sla8a писал(а):
вот как-то не логично работает вывод события onCheck у MTStrTb

Поменялось состояние, неважно чем -- выдалось событие о смене состояния. Но вот при смене положения не должно выдаваться, если не изменилось состояние. Хотя, если ты отслеживаешь состояния всех флажков, то логично перечитывать эти состояния и при смене позиции, тк индексы меняются, а для этого нужно какое-то событие.

Редактировалось 1 раз(а), последний 2024-12-26 19:05:48
карма: 22

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#104: 2024-12-27 00:40:49 ЛС | профиль | цитата
<del>

Редактировалось 1 раз(а), последний 2024-12-27 02:40:54
карма: 22

0
Разработчик
Ответов: 26161
Рейтинг: 2127
#105: 2024-12-27 02:40:27 ЛС | профиль | цитата
Окончательное решение:

procedure ThiMTStrTbl._OnSelState;
var
dt, Data: TData;
begin
dtNull(Data);
TRY
if (Newstate = 3) or (Newstate = 1) then
begin
if FEnableOnClick then _hi_OnEvent(_event_onClick, IdxFrom);
_hi_OnEvent(_event_onSelect, IdxFrom);
exit;
end;
if GMouse and (OldState = 0) then
begin
Sender.LVItemStateImgIdx[IdxFrom] := 0;
exit;
end;

if (Newstate = $3000) and ((OldState = $1000) or (OldState = $2000)) then
dtInteger(dt, 2)
else if (Newstate = $2000) and ((OldState = $1000) or (OldState = $3000)) then
dtInteger(dt, 1)
else if (Newstate = $1000) and ((OldState = $2000) or (OldState = $3000)) then
dtInteger(dt, 0)
else
exit;

dtInteger(Data, IdxFrom);
Data.ldata := @dt;

if GMouse then _hi_onEvent_(_event_onCheck, Data);

FINALLY
GMouse := false;
END;
end;

--- Добавлено в 2024-12-27 02:41:41

Если устроит, то пофиксю на SVN

Редактировалось 1 раз(а), последний 2024-12-27 02:41:41
карма: 22

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