Вверх ↑
Этот топик читают: Гость
Ответов: 817
Рейтинг: 52
#1: 2012-09-03 13:19:34 ЛС | профиль | цитата
Добрый день!
Сделал я небольшую оболочку для TightVNC.
Выкладываю полный пакет что бы было понятнее.
http://forum.hiasm.com/forum_serv.php?q=56&id=3255
Все бы меня устраивает, однако никак не могу сделать что бы работал PopupMenu в StringTableMT так как я хочу.
А хочу я при нажатии прав. кн. мыши на строке в таблице, строка стала выделенной и только потом появилось доп. меню.
Пока я смог добиться появления доп. меню с точностью до наоборот, т.е. при нажатии прав. кн. мыши на строке в таблице,
появляется меню, но строка в таблице не выделяется, после выбора пункта в доп. меню, оно (меню) пропадает и строка в таблице становится выделенной.
Прошу вашей помощи в решении вопроса на базе моей схемы, т.к если брать чистую StringTableMT, ничем не обвешанную, то вроде работает как надо.

карма: 1

0
Разработчик
Ответов: 26156
Рейтинг: 2127
#2: 2012-09-03 13:32:12 ЛС | профиль | цитата
-= DriveR =-, твой файл имеет 0-ю длину, если что. А по сабжу можно было бы что-то сказать, если был бы небольшой пример, а не просмотр целого проекта. Неужели нельзя сделать схемку из нескольких компонентов
------------ Дoбавленo в 13.31:
А пока что, могу только посоветовать поставить таймер или DeferredEvent перед вызовом меню. Дело в том, что отрисовка и выполнение всех селекторов в таблице происходит по окончанию цепи событий, когда управление передается системе, а ты пытаешься вклиниться со своим меню до передачи управления системе.
карма: 22

0
Ответов: 817
Рейтинг: 52
#3: 2012-09-03 14:26:14 ЛС | профиль | цитата
nesco писал(а):
вой файл имеет 0-ю длину, если что

Действительно очень странно, перезаливал несколько раз и все равно размер=0, хотя на самом деле 190кб. ну да ладно
nesco писал(а):
А по сабжу можно было бы что-то сказать, если был бы небольшой пример

Согласен, исправляюсь
пример:
code_28951.txt
теперь расскажу:
В примере при клике на любой строке, после отпускания кн. мыши должно появиться контекстное меню, но не появляется.
(такое отрабатывает только в пустом месте таблицы)
Если в StringTamleMT связь с точки onMouseUp поменять на onMouseDown, то все работает, но не так как надо.
nesco писал(а):
посоветовать поставить таймер или DeferredEvent перед вызовом меню

Сейчас попробую.
карма: 1

0
файлы: 1code_28951.txt [423B] [448]
Разработчик
Ответов: 26156
Рейтинг: 2127
#4: 2012-09-03 14:34:08 ЛС | профиль | цитата
Все правильно
-= DriveR =- писал(а):
после отпускания кн. мыши

onMouseUp работает
-= DriveR =- писал(а):
только в пустом месте таблицы

Так работает везде в системном классе ListView, коим наследником и является наша таблица. Это старая и дремучая борода, которую вытягивают регулярно на форуме
карма: 22

0
Ответов: 817
Рейтинг: 52
#5: 2012-09-03 14:39:41 ЛС | профиль | цитата
nesco,
спасибо за совет
воспользовался DeferredEvent и все работает как надо
карма: 1

0
Ответов: 1926
Рейтинг: 172
#6: 2017-02-10 21:02:32 ЛС | профиль | цитата
У меня и с DeferredEvent не работает. nesco, как должно работать, можно код?
карма: 9
0
Ответов: 165
Рейтинг: 6
#7: 2017-02-10 21:23:17 ЛС | профиль | цитата
3042,

Add(StringTableMT,4172861,483,308)
{
Width=384
Height=262
Align=5
Columns=#2:X1|2:X2|2:X3|
IconsCheck=[]
MiscIcons=[]
Icons=[]
StringsStrLst=#5:F;A;D|5:O;R;B|5:E;Z;M|
AutoTblStrLst=0
Point(onMouseDown)
link(onMouseDown,14966013:doCompare,[])
}
Add(DeferredEvent,3000618,616,315)
{
link(onDeferredEvent,15020687:doPopupHere,[])
}
Add(PopupMenu,15020687,679,315)
{
Menu=#4:Do 1|4:Do 2|
}
Add(If_else,14966013,553,315)
{
Op2=Integer(1)
link(onTrue,3000618:doDeferredEvent,[])
}

карма: 4

1
Голосовали:3042
Ответов: 1926
Рейтинг: 172
#8: 2017-02-10 21:40:09 ЛС | профиль | цитата
Nickname, спасибо, однако я думал, что это для onMouseUp. А заставить работать onMouseUp нет способов?
карма: 9
0
Ответов: 165
Рейтинг: 6
#9: 2017-02-10 23:18:43 ЛС | профиль | цитата
3042, нет. А разве нужный эффект не достигнут?
карма: 4

0
Ответов: 1926
Рейтинг: 172
#10: 2017-02-11 14:33:34 ЛС | профиль | цитата
Достигнут. Но тут уже возник чисто спортивный интерес - почему onMouseUp не хочет работать. В сети толком ничего не нашёл, хотя даже в MS проблему сообщали: https://bytes.com/topic/c-sharp/answers/792271-listview-mouseup-event. Я так понял, Tom Bean проблему как-то решил, но подробностей нет.
карма: 9
0
Ответов: 1926
Рейтинг: 172
#11: 2017-08-13 10:49:34 ЛС | профиль | цитата
Костылём решил проблему и для onMouseUp:

Add(StringTableMT,9242582,196,77)
{
Width=392
Height=268
Align=5
Columns=#4:Файл|8:Дата===2|
ColumnClick=1
IconsCheck=[]
MiscIcons=[]
Icons=[]
StringsStrLst=#3:1;2|3:3;4|3:5;6|
AutoTblStrLst=0
Point(doSort)
Point(doAutoColWidth)
Point(Strings)
Point(Matrix)
Point(onMouseDown)
link(onMouseDown,14153017:doWork1,[])
}
Add(PopupMenu,12652589,315,84)
{
Menu=#25:Переименовать все по дате|
}
Add(MultiElement,14153017,259,84)
{
@Hint=#35:"Переделывает" нажатие в отпускание|
link(onEvent1,12652589:doPopupHere,[])
}
BEGIN_SDK
Add(EditMulti,5038441,21,21)
{
EventCount=1
WorkCount=1
link(doWork1,10762547:doEvent,[(49,27)(49,83)])
}
Add(InlineCode,10339731,77,126)
{
@Hint=#24:Глобальный перехват мыши|
EventPoints=#11:onMouseMove|13:onLButtonDown|11:onLButtonUp|13:onRButtonDown|11:onRButtonUp|11:onWheelDown|9:onWheelUp|8:onScroll|14:onX1ButtonDown|11:onX1BttonUp|14:onX2ButtonDown|11:onX2BttonUp|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|27: tagMSLLHOOKSTRUCT = record|12: pt:TPoint;|18: mouseData:dword;|14: flags:dword;|13: time:dword;|23: dwExtraInfo:^Cardinal|5: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|26: onMouseMove:THI_Event;|28: onLButtonDown:THI_Event;|26: onLButtonUp:THI_Event;|28: onRButtonDown:THI_Event;|26: onRButtonUp:THI_Event;|26: onWheelDown:THI_Event;|24: onWheelUp:THI_Event;|23: onScroll:THI_Event;|29: onX1ButtonDown:THI_Event;|27: onX1ButtonUp:THI_Event;|29: onX2ButtonDown:THI_Event;|27: onX2ButtonUp:THI_Event;|0:|23: constructor Create;|33: destructor Destroy; override;|0:|5: end;|0:|14:var H:THandle;|20: hac:THiAsmClass;|0:|14:implementation|0:|49:function hook(code,w,l:integer):Lresult; stdcall;|15:var str:string;|25: ll:tagMSLLHOOKSTRUCT;|15: d:LongWord;|5:begin|38: ll := tagMSLLHOOKSTRUCT(pointer(l)^);|0:|26: d := ll.mouseData shr 16;|46: if d and $8000 <> 0 then d := d or $FFFF0000;|0:|42: //str := Int2Str(w)+ ' ' + Int2Str(d);|10: case w of|36: 512: _hi_OnEvent(hac.onMouseMove);|38: 513: _hi_OnEvent(hac.onLButtonDown);|36: 514: _hi_OnEvent(hac.onLButtonUp);|38: 516: _hi_OnEvent(hac.onRButtonDown);|36: 517: _hi_OnEvent(hac.onRButtonUp);|36: 519: _hi_OnEvent(hac.onWheelDown);|34: 520: _hi_OnEvent(hac.onWheelUp);|45: 522: _hi_OnEvent(hac.onScroll, int2str(d));|12: 523: begin|17: case d of|44: 1: _hi_OnEvent(hac.onX1ButtonDown);|44: 2: _hi_OnEvent(hac.onX2ButtonDown);|12: end;|11: end;|12: 524: begin|17: case d of|42: 1: _hi_OnEvent(hac.onX1ButtonUp);|42: 2: _hi_OnEvent(hac.onX2ButtonUp);|12: end;|11: end;|5: end;|27: //_hi_OnEvent(hac.ev,str);|38: result := CallNextHookEx(H,code,w,l);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|13: hac := self;|48: H := SetWindowsHookEx(14, @hook, hInstance, 0);|82: if H = 0 then messagebox(ReadHandle,'Ошибка перехвата мыши','ERROR',mb_iconhand);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnhookWindowsHookEx(H);|19: inherited Destroy;|4:end;|0:|4:end.|
link(onRButtonUp,1073831:doEvent,[])
}
Add(Switch,9179949,154,70)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(doOn)
Point(State)
}
Add(IndexToChanel,1073831,154,154)
{
Point(Index)
link(onEvent2,10167199:doEvent1,[])
link(Index,9179949:State,[])
}
Add(Hub,10167199,203,161)
{
link(onEvent1,4094970:doDeferredEvent,[])
link(onEvent2,9179949:doReset,[(229,174)(229,128)(142,128)(142,83)])
}
Add(DeferredEvent,4094970,245,161)
{
link(onDeferredEvent,5038441:onEvent1,[(299,167)(299,27)])
}
Add(IndexToChanel,10762547,77,77)
{
link(onEvent2,9179949:doOn,[])
}
END_SDK
карма: 9
0
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)