Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26148
Рейтинг: 2126
#46: 2024-12-06 04:30:34 ЛС | профиль | цитата
Вернул назад, тк нашел некорректности в работе.
карма: 22

0
Ответов: 2265
Рейтинг: 676
#47: 2024-12-06 10:23:58 ЛС | профиль | цитата
nesco, смотри что нашел, может поможет. Тестирую на двух схемах из справки о MST_UseEditCtrl. Вот такой правкой (так для тестирования):

unit hiMST_UseEditCtrl;

interface

uses Windows, Messages, Kol, Share, Debug, hiMTStrTbl;

const
HDN_FIRST = -300; { Header }
HDN_ITEMCHANGEDA = HDN_FIRST-1;
HDN_ITEMCHANGEDW = HDN_FIRST - 21;

type
tagNMHEADERA = packed record
Hdr: TNMHdr;
Item: Integer;
Button: Integer;
PItem: PHDItemA;
end;
HD_NOTIFY = tagNMHEADERA;


type
THIMST_UseEditCtrl = class(TDebug)
private
sControl: PControl;
NewLine: integer;
FMSTControl: IMSTControl;
OldMessage: TOnMessage;
redaction: boolean;//test

procedure SetMSTControl(Value: IMSTControl);
procedure snewcuridx(value:integer);
function gnewcuridx: integer;
function fredaction: boolean;
function fctl3d: boolean;
public

_prop_KeyCellEnter: byte;
_prop_DblClick: boolean;
_data_Row: THI_Event;
_data_Col: THI_Event;
_event_onEscCell: THI_Event;
_event_onEnterCell: THI_Event;
_event_onCellSize: THI_Event;
_event_onClientRect: THI_Event;

property _prop_MSTControl: IMSTControl read FMSTControl write SetMSTControl;
property NewCurIdx:integer read gnewcuridx write snewcuridx;

procedure _work_doSetData(var _Data: TData; Index: word);
procedure _work_doClientRect(var _Data: TData; Index: word);
procedure _var_Index(var _Data: TData; Index: word);
procedure _var_Cell(var _Data: TData; Index: word);
procedure _var_SubItem(var _Data: TData; Index: word);
procedure _var_Matrix(var _Data: TData; Index: word);
protected
function _OnMessage(var Msg: TMsg; var Rslt: Integer): Boolean;
end;

implementation


//------------------------------------------------------------------------------
//
function THIMST_UseEditCtrl._OnMessage;
type
TMouseDownPt = packed record
X: Word;
Y: Word;
end;
var
R, ARect: TRect;
Pt: TMouseDownPt;
HTI: TLVHitTestInfo;
Data: TData;
mt: PMT;
l: TListViewOptions;

procedure InitOnEvent;
var
b: integer;
begin
if FRedaction then exit;
redaction := true;//test
R := sControl.LVSubItemRect(NewLine, NewCurIdx);
if NewCurIdx = 0 then
begin
ARect := sControl.LVItemRect(NewLine, lvipLabel);
R.Left := ARect.Left;
R.Right := ARect.Right;
end;
if fctl3d then
b := 2
else
b := 1;
l := sControl.LVOptions;

dtInteger(Data, R.Left + sControl.Left + b);
mt := mt_make(Data);
mt_int(mt, R.Top + sControl.Top + b);
mt_int(mt, R.Right - R.Left - 1);
mt_int(mt, R.Bottom - R.Top - 1);
_hi_OnEvent_(_event_onCellSize, Data);
mt_free(mt);
end;

procedure EscCell;
begin
if not redaction then exit;//test
redaction := false;//test
R := sControl.LVItemRect(NewLine, lvipBounds);
ARect := sControl.LVItemRect(NewLine, lvipLabel);
R.Left := ARect.Left;
InvalidateRect(sControl.Handle, @R, false);
if not FRedaction then
_hi_OnEvent(_event_onEscCell, sControl.LVItems[NewLine, NewCurIdx]);
end;

begin
Result := false;
l:= sControl.LVOptions;
case Msg.message of
WM_NOTIFY:
if (HD_NOTIFY(Pointer(Msg.LParam)^).Hdr.code = HDN_ITEMCHANGEDA) or
(HD_NOTIFY(Pointer(Msg.LParam)^).Hdr.code = HDN_ITEMCHANGEDW) then
InitOnEvent;
WM_RBUTTONDOWN, WM_LBUTTONDOWN:
begin
Pt:= TMouseDownPt(Msg.lParam);
HTI.pt.x := Pt.X;
HTI.pt.y := Pt.Y;
sControl.Perform( LVM_SUBITEMHITTEST, 0, Integer( @HTI ) );
if (HTI.flags <> LVHT_ONITEMSTATEICON) and (HTI.iItem <> -1) then
begin
NewLine := HTI.iItem;
NewCurIdx := HTI.iSubItem;
end;
EscCell;
end;
WM_LBUTTONDBLCLK:
begin
Pt:= TMouseDownPt(Msg.lParam);
HTI.pt.x := Pt.X;
HTI.pt.y := Pt.Y;
sControl.Perform( LVM_SUBITEMHITTEST, 0, Integer( @HTI ) );
if (HTI.flags <> LVHT_ONITEMSTATEICON) and _prop_DblClick and (HTI.iItem <> -1) then
begin
InitOnEvent;
_hi_onEvent(_event_onEnterCell);
end;
end;
WM_HSCROLL, WM_VSCROLL:
EscCell;
WM_KEYDOWN:
begin
Case Msg.WParam of
VK_LEFT, VK_RIGHT:
begin
if (lvoRowSelect in l) then
begin
NewCurIdx := NewCurIdx + Msg.wParam - $26;
if NewCurIdx >= sControl.LVColCount then
NewCurIdx := sControl.LVColCount - 1
else
if NewCurIdx < 0 then NewCurIdx := 0;
EscCell;
end;
end;
VK_UP, VK_DOWN:
begin
NewLine := NewLine + Msg.wParam - $27;
if NewLine >= sControl.Count then
NewLine := sControl.Count - 1
else
if NewLine < 0 then
NewLine := 0;
EscCell;
end;
VK_RETURN:
if _prop_KeyCellEnter = 1 then
begin
InitOnEvent;
_hi_onEvent(_event_onEnterCell);
end;
VK_F2:
begin
InitOnEvent;
_hi_onEvent(_event_onEnterCell);
end;
VK_ESCAPE:
EscCell;
end;
end;
end;
Result := Result or _hi_OnMessage(OldMessage, Msg, Rslt);
end;

procedure THIMST_UseEditCtrl.snewcuridx;
begin
if not Assigned(_prop_MSTControl) then exit;
_prop_MSTControl.setnewcuridx(value);
end;

function THIMST_UseEditCtrl.gnewcuridx;
begin
if Assigned(_prop_MSTControl) then
Result := _prop_MSTControl.getnewcuridx
else
Result := 0;
end;

function THIMST_UseEditCtrl.fredaction;
begin
if Assigned(_prop_MSTControl) then
Result := _prop_MSTControl.getfredaction
else
Result := true;
end;

function THIMST_UseEditCtrl.fctl3d;
begin
if Assigned(_prop_MSTControl) then
Result := _prop_MSTControl.getfctl3d
else
Result := true;
end;

procedure THIMST_UseEditCtrl.SetMSTControl;
begin
if Value = nil then exit;
FMSTControl := Value;
sControl := FMSTControl.ctrlpoint;
FMSTControl.detachwndproc;

OldMessage:= sControl.OnMessage;
sControl.OnMessage := _OnMessage;
end;

procedure THIMST_UseEditCtrl._work_doSetData;
var
dControl: PControl;
begin
if not Assigned(_prop_MSTControl) then exit;
dControl := _prop_MSTControl.ctrlpoint;
dControl.LVItems[NewLine, NewCurIdx] := ToString(_Data);
end;

// Содержит индекс столбца выделенной ячейки
//
procedure THIMST_UseEditCtrl._var_SubItem;
begin
dtInteger(_Data, NewCurIdx);
end;

// Содержит значение выбранной ячейки под курсором
//
procedure THIMST_UseEditCtrl._var_Cell;
var
dControl: PControl;
begin
if not Assigned(_prop_MSTControl) then exit;
dControl := _prop_MSTControl.ctrlpoint;
dtString(_Data, dControl.LVItems[NewLine, NewCurIdx]);
end;

// Содержит индекс выделенной строки
//
procedure THIMST_UseEditCtrl._var_Index;
var
sControl: PControl;
begin
if not Assigned(_prop_MSTControl) then exit;
sControl := _prop_MSTControl.ctrlpoint;
dtInteger(_Data, sControl.CurIndex);
end;

// Матрица строк
//
procedure THIMST_UseEditCtrl._var_Matrix;
begin
if not Assigned(_prop_MSTControl) then exit;
_prop_MSTControl.matrix(_Data);
end;

procedure THIMST_UseEditCtrl._work_doClientRect;
var
Row,Col: integer;
R, ARect: TRect;
dTop, dWidth, dHeight, Data: TData;
b: integer;
sControl: PControl;
begin
Row := ReadInteger(_Data, _data_Row);
Col := ReadInteger(_Data, _data_Col);
if not Assigned(_prop_MSTControl) then exit;
sControl := _prop_MSTControl.ctrlpoint;

R := sControl.LVSubItemRect(Row, Col);
if Col = 0 then
begin
ARect := sControl.LVItemRect(Row, lvipLabel);
R.Left := ARect.Left;
R.Right := ARect.Right;
end;
if fctl3d then
b := 2
else
b := 1;

dtInteger(Data, R.Left + sControl.Left + b);
dtInteger(dWidth, R.Right - R.Left - 1);
dtInteger(dTop, R.Top + sControl.Top + b);
dtInteger(dHeight, R.Bottom - R.Top - 1);

Data.ldata:= @dTop;
dTop.ldata:= @dWidth;
dWidth.ldata:= @dHeight;
_hi_OnEvent_(_event_onClientRect, Data);
end;

end.
Так вот в схеме With_EditCtrl.sha происходит одно лишнее срабатывание onEscCell из-за приходящих WM_NOTIFY. Достаточно выбрать другую строку. Если отключить Менеджер маленьких иконок (SmallIconsManager ), то сообщения WM_NOTIFY перестают приходить. В другой схеме из справки, лишнего срабатывания onEscCell нет.

nesco писал(а):
По крайней мере, в коде именно так -- выдает ячейку, по которой клацнули, а не которую редактировали. Так и в описании к точке написано -- выдает в поток содержимое текущей ячейки, а текущей ячейкой будет как раз та, по которой клацнули.

Мне эти данные не нужны и не могу себе представить для чего они. Нужны данные до начала редактирования и в конце редактирования конкретно той ячейки которую редактируют сторонние контролы. До начала редактирования можно получить с Cell сохранив в Memory, а данные после редактирования можно получить с Memory перед внесением в ячейку doSetData.
Как по мне то onEscCell должен выдавать данные после редактирования редактированной ячейки. Это будет полезно если нужно сравнить данные до редактирования и после. Зачем нужны данные новой выбранной ячейки не понятно.

Вот такая схема нужна чтоб узнать нужно ли вносить данные в базу данных, если данные ячейки были изменены. И ложные срабатывания onEscCell вносят ненужные записи.
Add(MST_UseEditCtrl,5561109,294,168)
{
link(onEnterCell,5484721:doValue,[])
link(onEscCell,16568077:doCompare,[(338,188)(338,265)])
}
Add(Memory,5484721,357,175)
{
Point(Data)
link(Data,5561109:Cell,[(363,163)(342,163)(342,212)(321,212)])
}
Add(Memory,10271330,252,168)
{
link(onData,5561109:doSetData,[])
}
Add(If_else,16568077,350,259)
{
@Hint=#52:Проверка на разницу данных до редактирования и после|
link(Op1,10271330:Value,[(356,229)(258,229)])
link(Op2,5484721:Value,[])
AddHint(-147,43,182,26,@Hint)
}

Еще думаю не помешало бы doStop что бы принудительно завершить редактирование и вызвать onEscCell.

Редактировалось 2 раз(а), последний 2024-12-06 10:49:37
карма: 11

0
Ответов: 793
Рейтинг: 168
#48: 2024-12-06 11:46:49 ЛС | профиль | цитата
sla8a писал(а):
Нужны данные до начала редактирования и в конце редактирования конкретно той ячейки которую редактируют сторонние контролы. До начала редактирования можно получить с Cell сохранив в Memory, а данные после редактирования можно получить с Memory перед внесением в ячейку doSetData.
Как по мне то onEscCell должен выдавать данные после редактирования редактированной ячейки. Это будет полезно если нужно сравнить данные до редактирования и после. Зачем нужны данные новой выбранной ячейки не понятно.

Вот такая схема нужна чтоб узнать нужно ли вносить данные в базу данных, если данные ячейки были изменены. И ложные срабатывания onEscCell вносят ненужные записи.

А почему для этих целей нельзя использовать точки onBeforeLineChange и onLineChange?

Add(MainForm,2953706,77,70)
{
link(onCreate,3682515:doConvert,[])
}
Add(MTStrTbl,7369721,77,133)
{
Width=506
Height=244
Align=5
Name="tabl"
ColorItems=0
Redaction=0
Grid=0
Point(onBeforeLineChange)
Point(onLineChange)
link(onBeforeLineChange,14558800:doLoad,[])
link(onLineChange,11731040:doEnum,[(130,174)(130,216)])
}
Add(MST_ColAction,4139610,231,84)
{
Action=9
MaxColWidth=1000
Index=-2
MSTControl="tabl"
}
Add(MST_Load,571213,182,77)
{
Delimiter="\t"
MSTControl="tabl"
link(onLoadFromStream,4139610:doColAction,[])
}
Add(StreamConvertor,3682515,133,84)
{
Mode=7
Point(Data)
link(onResult,571213:doLoadFromStream,[])
link(Data,6934679:Text,[])
}
Add(StrList,6934679,133,35)
{
Strings=#42:Item Description Quantity Unit Price Value|63:13930 Double-action Quickstart II rem. L=740mm 1 PC 98,66 98,66|53:13100201 Spray gun for udder washer 20 PC 17,77 355,4|49:13246007 COMBI-cock ш51 mm cpl. 10 PC 63,43 634,3|51:25643301 Milk hose ш 24/14 x 2750 32 PC 9,76 312,32|56:14291 Service no.1 RDS MAX double box 1 PC 250,51 250,51|54:24144638 Spiral spring for tube filter 3 PC 43,2 129,6|40:22121763 V-belt spz 1087 4 PC 5,91 23,64|61:MH0015 Repair kit non-rotating cylinder ш40mm 8 PC 14,3 114,4|48:GS9835 Revision set SAC Unipuls 4 PC 13,97 55,88|52:22121735 El-motor 3,0kw 3x400v 1400 1 PC 186,4 186,4|55:23544122 Carbon disc ш44,7/38,3x5,8mm 10 PC 16,92 169,2|55:23544122 Carbon disc ш44,7/38,3x5,8mm 10 PC 16,92 169,2|54:23544122 Carbon disc ш44,7/38,3x5,8mm 2 PC 16,92 33,84|64:21200159 Top part UNIFL3/4 for steel bot.part 25 PC 30,09 752,25|57:24400111 Hose f. pump compl. UNIWASH 153 PC 10,58 1618,74|58:13225 Piston complete for valve UNIWASH3 4 PC 27,09 108,36|60:12200105 Vacuumgauge glycerine ш100mm 3/8" 5 PC 40,57 202,85|0:|
}
Add(MT_Array,14558800,210,161)
{
}
Add(MT_Enum,11731040,140,210)
{
link(onItem,14065383:doRead,[])
}
Add(Debug,2985568,357,210)
{
LogCount=100
}
Add(ArrayRW,14065383,210,210)
{
link(onRead,357915:doCompare,[])
link(Array,14558800:Array,[])
link(Index,11731040:Index,[(223,201)(202,201)(202,250)(153,250)])
}
Add(If_else,357915,266,210)
{
link(onTrue,2985568:doEvent,[])
link(onFalse,5476614:doEvent,[(340,223)(340,244)])
link(Op2,11731040:Item,[(279,201)(258,201)(258,257)(146,257)])
}
Add(Debug,5476614,357,238)
{
LogCount=100
}

карма: 16

0
Ответов: 2265
Рейтинг: 676
#49: 2024-12-06 12:08:02 ЛС | профиль | цитата
Gunta, если речь о таком использовании, то не работает:
Add(MainForm,314817,266,147)
{
Width=445
Height=261
Caption="Пример использования MST_UseEditCtrl"
Position=1
link(onCreate,10041622:doEnum,[])
}
Add(MST_UseEditCtrl,3498945,259,245)
{
MSTControl="MtS_tbl"
PColor(onCellSize,8421440)
PColor(onEscCell,32768)
link(onCellSize,13620734:doValue,[(305,251)(305,216)])
link(onEnterCell,87120:doEvent1,[])
link(onEscCell,9450650:doSendToBack,[(304,265)(304,286)])
}
Add(StrList,15034837,329,105)
{
Strings=#15:sdfsdf;aaaaa;;0|15:fzsdfzs;bbbb;;3|14:sdfszz;cccc;;2|15:sdfszz;ddddd;;0|15:sdfszz;eeeee;;1|15:sdfszz;fffff;;3|15:fzsdfzs;gggg;;2|14:sdfszz;hhhh;;0|16:fzsdfzs;iiiii;;3|16:sdfszz;jjjjjj;;1|
}
Add(MT_String,922736,399,147)
{
link(onResult,2904434:doRowAction,[])
}
Add(ArrayEnum,10041622,343,161)
{
link(onItem,922736:doMTString,[])
link(Array,15034837:Array,[])
}
Add(MST_RowAction,2904434,455,147)
{
MSTControl="MtS_tbl"
}
Add(MT_MultiData,2622840,343,252)
{
Point(Data)
link(onData1,9450650:doLeft,[])
link(onData2,9450650:doTop,[])
link(Data,13620734:Value,[])
}
Add(Hub,15922927,406,266)
{
link(onEvent1,9450650:doSetFocus,[])
link(onEvent2,9450650:doBringToFront,[])
}
Add(Hub,87120,315,252)
{
link(onEvent1,2622840:doSeparateMT,[])
link(onEvent2,15922927:doEvent1,[(337,265)(337,272)])
}
Add(DatePicker,9450650,455,245)
{
Left=30
Top=205
Width=90
Font=[MS Sans Serif,6,0,0,1]
Point(doLeft)
Point(doTop)
Point(doSetFocus)
Point(doBringToFront)
Point(DateTime)
Point(doSendToBack)
link(onChange,10029744:doConvert,[(501,251)(501,296)(443,296)(443,314)])
}
Add(DateConvertor,10029744,455,308)
{
Mode=9
Format="dd-MM-yyyy"
Point(Data)
link(onResult,3498945:doSetData,[(501,314)(501,352)(247,352)(247,251)])
link(Data,9450650:DateTime,[])
}
Add(MTStrTbl,9842821,238,406)
{
Left=25
Top=20
Width=360
Height=170
Font=[MS Sans Serif,12,0,0,1]
Name="MtS_tbl"
Columns=#1:1|1:2|1:3|
ColumnWidth=90
Point(onBeforeLineChange)
Point(onLineChange)
link(onBeforeLineChange,5448921:doEvent,[])
link(onLineChange,1436758:doEvent,[])
}
Add(MT_Memory,13620734,343,210)
{
}
Add(MT_Array,14558800,420,434)
{
}
Add(MT_Enum,11731040,350,483)
{
link(onItem,14065383:doRead,[])
}
Add(ArrayRW,14065383,420,483)
{
link(onRead,357915:doCompare,[])
link(Array,14558800:Array,[])
link(Index,11731040:Index,[(433,474)(412,474)(412,523)(363,523)])
}
Add(If_else,357915,476,483)
{
link(Op2,11731040:Item,[(489,474)(468,474)(468,530)(356,530)])
}
Add(Debug,5448921,301,434)
{
WEName="test1"
VDName=""
link(onEvent,14558800:doLoad,[])
}
Add(Debug,1436758,287,441)
{
WEName="test2"
VDName=""
link(onEvent,11731040:doEnum,[(338,447)(338,489)])
}
Эти события работают при редактировании "своими силами" при свойстве Redaction=True. MST_UseEditCtrl работает при свойстве Redaction=False чтоб использовать для редактирования сторонние контролы.

Если вопрос о том чтоб использовать эти события, то думаю что не нужно этого делать. Лучше чтоб MST_UseEditCtrl выдавал эти события, раз он ответственен за редактирование сторонними контролами.

Редактировалось 2 раз(а), последний 2024-12-06 12:11:17
карма: 11

0
Разработчик
Ответов: 26148
Рейтинг: 2126
#50: 2024-12-06 12:17:03 ЛС | профиль | цитата
sla8a писал(а):
Еще думаю не помешало бы doStop что бы принудительно завершить редактирование и вызвать onEscCell

Так, это добавим, это мелочи. Я кое-чего с выдачей данных придумал, буду тестить. Хорошо, что ты накидал тестовую схему, не помешает протестировать на ней.
карма: 22

0
Ответов: 2265
Рейтинг: 676
#51: 2024-12-06 14:20:01 ЛС | профиль | цитата
nesco, вот еще схема для наглядности и понимания вывода сообщений при потери фокуса у дополнительного контрола.
Add(MainForm,2953706,70,105)
{
Width=778
Height=582
Position=1
link(onCreate,10041622:doEnum,[])
}
Add(MST_UseEditCtrl,5561109,182,259)
{
MSTControl="testTable"
link(onCellSize,12756869:doRect,[])
link(onEnterCell,5484721:doValue,[])
link(onEscCell,7922413:doEvent1,[(226,279)(226,398)])
}
Add(Memory,5484721,315,266)
{
Point(Data)
link(onData,15587215:doEvent1,[])
link(Data,5561109:Cell,[(321,254)(230,254)(230,303)(209,303)])
}
Add(Memory,10271330,126,231)
{
}
Add(If_else,16568077,308,406)
{
@Hint=#52:Проверка на разницу данных до редактирования и после|
link(onTrue,14792882:doString,[])
link(onFalse,3558215:doString,[(370,419)(370,517)])
link(Op1,10271330:Value,[(314,327)(132,327)])
link(Op2,5484721:Value,[])
}
Add(MTStrTbl,5133893,266,105)
{
Left=10
Top=5
Width=745
Height=420
Font=[MS Sans Serif,12,0,0,1]
Name="testTable"
Columns=#4:№=40|9:Фильм=200|9:Год=60==2|11:Жанр=200==2|12:Описание=500|0:|
Grid=0
}
Add(StrList,15034837,119,63)
{
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,182,105)
{
link(onResult,2904434:doRowAction,[])
}
Add(ArrayEnum,10041622,133,119)
{
link(onItem,922736:doMTString,[])
link(Array,15034837:Array,[])
}
Add(MST_RowAction,2904434,224,105)
{
MSTControl="testTable"
}
Add(ChildPanelEx,12756869,406,259)
{
link(Index,8653266:getVar,[])
link(onChange,3117519:doEvent1,[(460,265)(460,192)(69,192)(69,237)])
link(onKillFocus,15319488:doWork,[(459,272)(459,363)])
}
BEGIN_SDK
Add(EditMultiEx,14376481,21,21)
{
WorkCount=#6:doRect|7:doStart|6:doStop|
EventCount=#8:onChange|11:onKillFocus|
DataCount=#5:Index|
Width=818
Height=613
link(doRect,14215607:doValue,[])
link(doStart,10318564:doCompare,[(42,34)(42,223)])
link(doStop,1059799:doEvent1,[(34,41)(34,433)])
}
Add(Panel,5130657,609,63)
{
Left=35
Top=105
Visible=1
BevelInner=0
Point(doLeft)
Point(doTop)
Point(doWidth)
Point(doHeight)
Point(doVisible)
}
Add(IndexToChanel,981480,147,224)
{
Count=5
Point(Index)
link(onEvent2,2554451:doWork1,[(259,237)])
link(onEvent3,3747397:doEvent1,[(219,244)(219,468)])
link(onEvent4,3299747:doEvent1,[])
link(Index,11075478:Var3,[(153,182)])
link(onEvent5,2554451:doWork2,[])
}
Add(MT_MultiData,13383753,329,70)
{
Count=4
Point(Data)
link(onData1,5130657:doLeft,[])
link(onData2,8998097:doOperation,[])
link(onData3,5130657:doWidth,[])
link(onData4,4482135:doWork2,[])
link(Data,14215607:Value,[])
}
Add(Hub,3299747,273,245)
{
OutCount=5
link(onEvent1,10874155:doWork2,[(308,251)(308,307)])
link(onEvent2,12973147:doBringToFront,[])
link(onEvent3,12973147:doSelectString,[])
link(onEvent4,12973147:doSetFocus,[])
link(onEvent5,6349023:doCalc,[(406,279)(406,335)])
}
Add(MT_Memory,14215607,329,21)
{
}
Add(ChanelToIndex,10874155,322,294)
{
link(onIndex,12973147:doVisible,[(412,300)(412,279)])
}
Add(Edit,11196193,420,378)
{
Left=1155
Top=1175
Align=5
Color=8421631
Font=[MS Sans Serif,12,0,0,1]
Visible=1
WinStyle=1
Text=""
Point(doBringToFront)
Point(doSetFocus)
Point(doVisible)
Point(onKillFocus)
link(onChange,6115875:doWork2,[])
link(onEnter,11308046:doWork2,[])
link(onKillFocus,7354813:doWork2,[])
}
Add(Hub,5035439,266,364)
{
OutCount=4
link(onEvent1,11308528:doWork2,[(294,370)(294,419)])
link(onEvent2,11196193:doBringToFront,[(385,377)(385,398)])
link(onEvent3,11196193:doSetFocus,[(376,384)(376,405)])
link(onEvent4,11196193:doText2,[])
}
Add(ChanelToIndex,11308528,322,406)
{
link(onIndex,11196193:doVisible,[])
}
Add(Hub,1059799,70,427)
{
InCount=2
link(onEvent1,3963705:doEvent,[(94,433)(94,384)])
link(onEvent2,5685364:doWork1,[(237,440)(237,111)])
}
Add(Edit,6525929,420,476)
{
Left=1155
Top=1175
Align=5
Color=8421631
Font=[MS Sans Serif,12,0,0,1]
Visible=1
WinStyle=1
Text=""
Alignment=2
DataType=1
MaxLenField=4
Point(doBringToFront)
Point(doSetFocus)
Point(doVisible)
Point(onKillFocus)
link(onChange,6115875:doWork3,[(660,482)])
link(onEnter,15760508:doWork2,[])
link(onKillFocus,15760508:doWork3,[(689,496)])
}
Add(Hub,3747397,259,462)
{
OutCount=4
link(onEvent1,5790774:doWork2,[(280,468)(280,517)])
link(onEvent2,6525929:doBringToFront,[(385,475)(385,496)])
link(onEvent3,6525929:doSetFocus,[(376,482)(376,503)])
link(onEvent4,6525929:doText2,[])
}
Add(ChanelToIndex,5790774,322,504)
{
link(onIndex,6525929:doVisible,[])
}
Add(Hub,7068085,105,217)
{
OutCount=3
link(onEvent1,13383753:doSeparateMT,[(131,223)(131,76)])
link(onEvent2,981480:doEvent,[])
link(onEvent3,5685364:doWork2,[(143,237)(143,118)])
}
Add(ChanelToIndex,5685364,329,105)
{
link(onIndex,5130657:doVisible,[(383,111)(383,104)])
}
Add(HubEx,2554451,255,252)
{
Angle=1
link(onEvent,5035439:doEvent1,[(259,370)])
}
Add(HubEx,7029855,656,217)
{
Angle=3
link(onEvent,14376481:onChange,[(660,27)])
}
Add(HubEx,6115875,656,378)
{
Angle=3
link(onEvent,7029855:doWork3,[])
}
Add(If_else,10318564,63,217)
{
Type=5
Op2=Integer(0)
link(onTrue,7068085:doEvent1,[])
link(Op1,10602446:Var2,[])
AddHint(6,-25,21,13,Op2)
}
Add(GetDataEx,10602446,63,177)
{
Angle=3
link(Data,14376481:Index,[(27,182)])
}
Add(Math,5639590,406,70)
{
OpType=1
Op2=1
}
Add(Math,8998097,455,77)
{
OpType=1
Op2=1
link(onResult,5130657:doTop,[])
}
Add(ListBox,12973147,469,224)
{
Left=465
Top=255
Align=5
Color=8421631
Font=[MS Sans Serif,12,0,0,1]
Visible=1
Strings=#6:боевик|7:комедия|10:фантастика|
DataType=1
Point(doBringToFront)
Point(doSelectString)
Point(onKillFocus)
Point(doSetFocus)
Point(doVisible)
link(onClick,2883110:doEvent1,[(513,237)(513,223)])
link(onKillFocus,5573420:doWork2,[])
}
Add(MathParse,6349023,476,329)
{
DataCount=1
MathStr="%1 * 22 "
link(onResult,4482135:doWork3,[(571,335)])
link(X1,12973147:Count,[])
}
Add(HubEx,4482135,567,91)
{
link(onEvent,5130657:doHeight,[])
}
Add(Hub,2883110,525,217)
{
link(onEvent1,7029855:doWork2,[])
link(onEvent2,5785315:doWork2,[])
}
Add(IndexToChanel,3963705,105,378)
{
Count=5
Point(Index)
link(onEvent2,1512234:doWork1,[(171,391)])
link(onEvent3,5790774:doWork1,[(154,398)(154,510)])
link(onEvent4,10874155:doWork1,[(147,405)(147,300)])
link(onEvent5,1512234:doWork2,[])
link(Index,11075478:Var2,[])
}
Add(HubEx,1512234,167,406)
{
link(onEvent,11308528:doWork1,[])
}
Add(GetDataEx,11075478,105,177)
{
Angle=3
link(Data,10602446:Var3,[])
}
Add(HubEx,5785315,685,224)
{
Angle=3
link(onEvent,14376481:onKillFocus,[(689,34)])
}
Add(HubEx,5573420,685,238)
{
Angle=3
link(onEvent,5785315:doWork3,[])
}
Add(HubEx,11308046,685,385)
{
Angle=3
link(onEvent,5573420:doWork3,[])
}
Add(HubEx,7354813,685,392)
{
Angle=3
link(onEvent,11308046:doWork3,[])
}
Add(HubEx,15760508,685,483)
{
Angle=3
link(onEvent,7354813:doWork3,[])
}
END_SDK
Add(Hub,7922413,238,392)
{
InCount=2
OutCount=3
link(onEvent1,13112036:doWork2,[(383,398)(383,321)])
link(onEvent2,12756869:doStop,[(393,405)(393,279)])
link(onEvent3,4332492:doCalc,[])
}
Add(Hub,3117519,91,231)
{
link(onEvent1,1993221:doWork2,[])
link(onEvent2,5561109:doSetData,[(116,244)(116,265)])
}
Add(HubEx,1993221,112,231)
{
link(onEvent,10271330:doValue,[])
}
Add(Hub,15587215,357,266)
{
OutCount=3
link(onEvent1,12756869:doStart,[])
link(onEvent2,1993221:doWork1,[(376,279)(376,224)(116,224)])
link(onEvent3,13112036:doWork1,[(384,286)(384,314)])
}
Add(LineBreakEx,7209891,189,357)
{
Caption="col"
Type=3
link(_Data,5561109:SubItem,[])
}
Add(LineBreakEx,15433687,196,343)
{
Caption="row"
Type=3
link(_Data,5561109:Index,[])
}
Add(LineBreakEx,5725187,896,364)
{
Caption="col"
Type=2
}
Add(LineBreakEx,12280975,903,378)
{
Caption="row"
Type=2
}
Add(LineBreakEx,8653266,406,231)
{
Caption="col"
Type=2
}
Add(FormatStr,14792882,896,406)
{
DataCount=3
Mask="[событие %3] Данные в %1 колонке %2 строке остались без изменения"
link(onFString,13421160:doWork2,[])
link(Str1,5725187:getVar,[])
link(Str2,12280975:getVar,[])
AddHint(-92,-80,199,26,Mask)
}
Add(LineBreakEx,11450873,896,469)
{
Caption="col"
Type=2
}
Add(LineBreakEx,7881424,903,483)
{
Caption="row"
Type=2
}
Add(FormatStr,3558215,896,511)
{
DataCount=3
Mask="[событие %3] Данные в %1 колонке %2 строке поменялись!!!"
link(onFString,13421160:doWork3,[(949,517)])
link(Str1,11450873:getVar,[])
link(Str2,7881424:getVar,[])
AddHint(-83,66,199,26,Mask)
}
Add(MathParse,4332492,266,406)
{
DataCount=0
MathStr="%0 + 1"
link(onResult,16568077:doCompare,[])
}
Add(HubEx,13421160,945,406)
{
link(onEvent,6997827:doAdd,[])
}
Add(ListBox,6997827,966,406)
{
Left=10
Top=430
Width=745
Height=105
AddType=1
}
Add(ChanelToIndex,13112036,581,308)
{
link(onIndex,13170480:doValue,[])
}
Add(IndexToChanel,9058072,623,357)
{
Count=1
Point(Index)
link(onEvent1,7922413:doEvent2,[(672,363)(672,458)(226,458)(226,405)])
link(Index,13170480:Value,[])
}
Add(Memory,13170480,623,308)
{
@Hint=#9:redaction|9:0 - start|8:1 - stop|
AddHint(51,-34,59,39,@Hint)
}
Add(InfoTip,10305296,476,91)
{
Info=#54:Это должно обрабатываться при doStop в MST_UseEditCtrl|0:|57:И если еще не закончено редактирование (было onEnterCell)|0:|33:Сделать onStop и после onEscCell |
Font=[MS Sans Serif,12,0,0,1]
Frame=2
HAlign=0
Width=288
Height=312
Margin=5
}
Add(Check,15319488,490,357)
{
Caption="doStop"
link(onEvent,9058072:doEvent,[])
}

Если начать редактирование (вывести доп. контрол) и потерять фокус (нажать Tab к примеру), то должно произойти onEscCell причем только один раз. Узнает об этом MST_UseEditCtrl сам или ему помочь сделав doStop уже не так важно. Пользователь может сам настроить какие контролы пошлют события об окончании редактирования (потеря фокуса, нажатая кнопка, выбранный пункт).

Еще заметил что хорошо бы перемещать ползунок и делать ячейку видимой по возможности. Можно увидеть начав редактирование столбца Описания. Ячейка в не зоне видимости, а размер ячейки выдается полностью.

Редактировалось 2 раз(а), последний 2024-12-06 14:31:21
карма: 11

0
Разработчик
Ответов: 26148
Рейтинг: 2126
#52: 2024-12-06 17:54:27 ЛС | профиль | цитата
sla8a писал(а):
Еще заметил что хорошо бы перемещать ползунок и делать ячейку видимой по возможности. Можно увидеть начав редактирование столбца Описания. Ячейка в не зоне видимости, а размер ячейки выдается полностью

Ни хрена не понял, но очень интересно

--- Добавлено в 2024-12-06 17:58:50

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

--- Добавлено в 2024-12-06 18:41:53

Кстати, есть нормальный компонент ChanelSwitch, нафига ты используешь дремучий набор компонентов для переключения?

Редактировалось 2 раз(а), последний 2024-12-06 18:41:53
карма: 22

0
Ответов: 2265
Рейтинг: 676
#53: 2024-12-06 20:28:55 ЛС | профиль | цитата
nesco писал(а):
Хотя, понял, что имеется в виду.

Попробую поточнее объяснить, чтоб не возникло недопонимания.
Если самая крайняя правая ячейка отображается на таблице не полностью (ширина всей таблицы меньше чем общая ширина всех колонок) и её начать редактировать, то хорошо бы чтоб ползунок по горизонтали сдвинул таблицу в то положение когда вся яцейка будет в виде ой области таблицы.
Точно так же если сдвинуть ползунок в такое положение чтоб ячейка была частично скрыта слева.
nesco писал(а):
нафига ты используешь дремучий набор
Это тестовая схема, набросал для наглядности
карма: 11

0
Разработчик
Ответов: 26148
Рейтинг: 2126
#54: 2024-12-07 03:17:22 ЛС | профиль | цитата
Я вот этого не понял


Это должно обрабатываться при doStop в MST_UseEditCtrl

И если еще не закончено редактирование (было onEnterCell)

Сделать onStop и после onEscCell


--- Добавлено в 2024-12-07 03:19:17

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

Я уже реализовал этот режим. Проблема будет только в принудительном изменении размера таблицы по ширине -- ячейка раздвинется, а вот контрол нет. Пока этот вопрос открыт.

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

0
Ответов: 2265
Рейтинг: 676
#55: 2024-12-07 09:02:19 ЛС | профиль | цитата
nesco писал(а):
Я вот этого не понял

Если будет начато редактирование, контрол отобразится над ячейкой и получит фокус. Но нажав Tab или курсором ткнув в другой контрол на форме можно потерять фокус с контрола над ячейкой. Получается что редактирование закончено, но MST_UseEditCtrl не знает об этом и не выдаст сообщение onEscCell. Таблица уже потеряла фокус и отдала его контролу. И если продолжить работать с таблицей, то onEscCell отработает, но это может и не произойти.
Конечно контрол может сам себя закрыть при потери фокуса, но MST_UseEditCtrl так и не узнает что редактирование закончено и событие onEscCell будет отложено и произойдёт точно не после закончания редактирования.
карма: 11

0
Разработчик
Ответов: 26148
Рейтинг: 2126
#56: 2024-12-07 17:19:26 ЛС | профиль | цитата
??? Кто бы мне столько налил, что бы я это до конца понял
карма: 22

0
Ответов: 2265
Рейтинг: 676
#57: 2024-12-07 19:53:16 ЛС | профиль | цитата
Ну не умею я объяснять
карма: 11

0
Разработчик
Ответов: 26148
Рейтинг: 2126
#58: 2024-12-08 03:18:37 ЛС | профиль | цитата
Короче, пока некий висняк с решением. Вроде как работает твоя правка, но только в определенных случаях. Есть случаи, когда все начисто перестает работать. Попробую покопать дальше.
карма: 22

0
Ответов: 2265
Рейтинг: 676
#59: 2024-12-08 10:59:36 ЛС | профиль | цитата
nesco писал(а):
Есть случаи, когда все начисто перестает работать.
Что это за случаи?
карма: 11

0
Разработчик
Ответов: 26148
Рейтинг: 2126
#60: 2024-12-08 13:31:31 ЛС | профиль | цитата
sla8a писал(а):
Что это за случаи?

Один из таких -- лажание мыши, откуда получается срабатывание входа через раз. И проверять надо на ячеестой структуре, те на самой сложной, а не на строковой, включая перемещение по ячейкам клавишами. Я вообще подумываю о смене алгоритма обработчика.
карма: 22

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