Вверх ↑
Этот топик читают: Гость
Ответов: 2205
Рейтинг: 675
#31: 2016-08-07 14:39:47 ЛС | профиль | цитата
Да мои догадки подтвердились. Если событие приходит от OnMessage, то "губит" каретку.
Вот к примеру и Rush-панель и всплывающее контекстное меню тоже "убивают" каретку.
code_37603.txt (левым кликом по форме вызовите всплывающее меню, выберете любой пункт)
------------ Дoбавленo в 14.39:
А вот ClipboardHook вроде (один раз как-то получилось) не "болеет" этой проблемой, но событие тоже идет от OnMessage.
Add(MainForm,6880721,252,112)
{
Width=657
Height=349
Point(onMouseDown)
}
Add(PaintBox,2386737,350,238)
{
Left=285
Top=165
Color=65535
Point(onMouseDown)
link(onMouseDown,781881:doWork2,[(533,251)(533,209)])
}
Add(Edit,8864697,609,182)
{
Left=535
Top=130
Point(doVisible)
}
Add(ChanelToIndex,781881,539,196)
{
link(onIndex,8864697:doVisible,[])
}
Add(ClipboardHook,10370170,350,196)
{
link(onChange,781881:doWork1,[])
}
Add(Memo,13537280,406,28)
{
Left=235
Top=25
Width=135
Height=125
Strings=#79:скопируйте этот текст в буфер обмена (выделеить, Ctrl+C) или нажмите кнопку >>>|
}
Add(ClipboardHook,10276404,406,91)
{
link(Text,13537280:Text,[])
}
Add(Button,13576236,357,91)
{
Left=380
Top=65
link(onClick,10276404:doSetText,[])
}
карма: 11

0
Ответов: 871
Рейтинг: 322
#32: 2016-08-07 14:48:52 ЛС | профиль | цитата
sla8a, странно или нет, не знаю. Но выглядит так...

карма: 1

1
файлы: 1karetka.zip [23.3KB] [257]
Голосовали:sla8a
Разработчик
Ответов: 26073
Рейтинг: 2122
#33: 2016-08-07 15:23:25 ЛС | профиль | цитата
sla8a писал(а):
не "болеет" этой проблемой

Что-то в этой схеме все равно болеет -- попробуй сразу после запуска нажать на желтое окошко, Edit включается, но без каретки.
карма: 22

0
Ответов: 2205
Рейтинг: 675
#34: 2016-08-07 15:54:44 ЛС | профиль | цитата
В этом примере результат зависит от наличия в буфере обмена текста при запуске.
Если буфер обмена пустой:
- Запустится с видимым Edit-ом (события OnChange от ловушки буфера не будет).
- При копировании будет скрываться Edit и при появлении будет отображаться каретка.
Если буфер обмена содержит текст:
- Произойдет событие onChange от ловушки буфера (кстати почему?) которое спрячет Edit.
- Каретка после появления Edit-а уже не будет отображаться.

Очистить буфер обмена: Пуск\Выполнить\Открыть clipbrd.exe\В меню нажать кнопку Удалить.
карма: 11

0
Ответов: 9906
Рейтинг: 351
#35: 2016-08-08 17:04:59 ЛС | профиль | цитата
nesco писал(а):
Может Galkov чего подскажет

Не-е-е
Ничем я здесь не лучше вас.
карма: 9

0
Ответов: 758
Рейтинг: 112
#36: 2016-08-09 09:33:15 ЛС | профиль | цитата
sla8a, Думаю что каким-то образом каретка удаляется!!! Если повторно создать, то все норм. Только высоту правильно подобрать нужно
Add(PaintBox,2386737,126,126)
{
Left=285
Top=165
Color=65535
Point(onMouseDown)
link(onMouseDown,11082074:doEvent1,[])
}
Add(ScrollBar,4764953,126,84)
{
Left=285
Top=125
link(onPosition,781881:doWork1,[])
}
Add(Edit,8864697,378,70)
{
Left=535
Top=130
Point(doVisible)
Point(Handle)
Point(doSetFocus)
}
Add(ChanelToIndex,781881,308,84)
{
link(onIndex,8864697:doVisible,[])
}
Add(InlineCode,13982809,385,140)
{
WorkPoints=#11:doShowCaret|11:doHideCaret|
EventPoints=#8:onResult|
DataPoints=#6:Handle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses Windows,kol,Share,Debug,Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|23: Handle: THI_Event;|25: onResult: THI_Event;|56: procedure doShowCaret(var _Data:TData; Index:word);|56: procedure doHideCaret(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|34:procedure THiAsmClass.doShowCaret;|3:var|9: h:HWND;|5:begin|34: h := ReadInteger(_Data, Handle);|27: CreateCaret(h, 0, 1, 20);|15: ShowCaret(h);|4:end;|0:|34:procedure THiAsmClass.doHideCaret;|3:var|9: h:HWND;|5:begin|34: h := ReadInteger(_Data, Handle);|15: HideCaret(h);|4:end;|0:|4:end.|
link(Handle,8864697:Handle,[])
}
Add(Hub,11082074,196,133)
{
link(onEvent1,781881:doWork2,[(233,139)(233,97)])
link(onEvent2,13982809:doShowCaret,[])
}
карма: 1

1
Голосовали:sla8a
Ответов: 2205
Рейтинг: 675
#37: 2016-08-09 23:03:34 ЛС | профиль | цитата
miver, может знаете как можно определить что каретка именно удалена (DestroyCaret), а не спрятана (HideCaret)?
http://www.vsokovikov.narod.ru/New_MSDN_API/Caret/fn_hidecaret.htm писал(а):
Сокрытие накапливается. Если ваше приложение обращается HideCaret пять раз подряд, оно должно также обратиться пять раз и к функции ShowCaret прежде, чем каретка покажется на экране.
А то есть вероятность что была очень "глубоко" спрятана. И вот зачем накапливать?
Так что с этим багом делать будем? Могу предложить два варианта:
1. Описать данный баг в вики. Мол если что то:
nesco писал(а):
использовать MMTimer с минимальной задержкой (но не 0)
2. Добавить в Edit.pas свою процедуру doVisible в которой будет заново создаваться каретка (пример miver-а).
Ну и конечно запись для чего этот "костыль".

Могу и то и другое сделать сам.
карма: 11

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#38: 2016-08-10 00:43:48 ЛС | профиль | цитата
sla8a писал(а):
И вот зачем накапливать?

Не накапливаются

MSDN писал(а):
Функция CreateCaret автоматически уничтожает предыдущую форму каретки, если она есть, независимо от окна, которое владеет кареткой. Каретка скрывается до тех пор, пока приложение не вызовет функцию ShowCaret, чтобы сделать каретку видимой.


И каретка должна создаваться только по фокусу

NSDN писал(а):
Система предусматривает одну каретку на очередь. Окно должно создавать каретку, только тогда, когда оно имеет фокус клавиатуры или активно. Окно должно уничтожить каретку перед потерей фокуса клавиатуры или перехода в не активный режим.


sla8a писал(а):
2. Добавить в Edit.pas свою процедуру doVisible в которой будет заново создаваться каретка (пример miver-а).
Ну и конечно запись для чего этот "костыль".

Вот лучше не стоит.
карма: 22

0
Ответов: 2205
Рейтинг: 675
#39: 2016-08-10 01:11:48 ЛС | профиль | цитата
nesco писал(а):
Не накапливаются
nesco, уточните, пишут что накапливается, а вы что не накапливается.
Если что то речь шла о функции HideCaret. Я сделал предположение что могло произойти несколько HideCaret из-за чего и не получается сделать ShowCaret (мешает накопившиеся Hid-ы) . При этом CreateCaret удаляет накапливание любой "глубины" и создает новую каретку (пример miver-а это показывает). Конечно каретка могла быть и просто удалена (DestroyCaret).
Вот мне и стало интересно, как узнать была каретка удалена (DestroyCaret) или спрятана (HideCaret). Пока ничего не нашел.
nesco писал(а):
Вот лучше не стоит.
Ну тогда или "вылечить" (вот только как) или пункт 1. Или есть еще варианты?

карма: 11

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#40: 2016-08-10 03:20:51 ЛС | профиль | цитата
sla8a писал(а):
уточните, пишут что накапливается, а вы что не накапливается

Кто пишет? Читаем первоисточник -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms648399(v=vs.85).aspx
или переведенную версию -- http://www.vsokovikov.narod.ru/New_MSDN_API/Caret/fn_createcaret.htm
Там черным по белому написано

Функция CreateCaret автоматически уничтожает предыдущую форму каретки, если она есть, независимо от окна, которое владеет кареткой

Те надо понимать так, что автоматически вызывается DestroyCaret и назначается новое окно в текущей задаче.

А вот HideCaret накапливается -- http://www.vsokovikov.narod.ru/New_MSDN_API/Caret/remov_caret.htm

Вы можете временно удалить каретку, скрывая её, или можете удалить на постоянно, уничтожив её. Чтобы скрыть каретку, используйте функцию HideCaret. Она применяется тогда, когда ваше приложение должно перерисовать экран при обработке сообщения, но должно сохранить каретку в недоступном для уничтожения месте. Когда приложение завершает рисовать, оно может показать на экране каретку снова при помощи использования функции ShowCaret. Сокрытие каретки не разрушает ее форму и не аннулирует точку ввода. Сокрытие каретки накапливается; то есть если прикладная программа обращается к функции HideCaret пять раз, она должна также обратиться пять раз и к функции ShowCaret прежде, чем каретка вновь появится.

Чтобы удалить каретку с экрана и уничтожить её форму, используйте функцию DestroyCaret. DestroyCaret уничтожает каретку только тогда, если окно, привлеченное к участию в текущей задаче владеет кареткой.

А не эта ли фигня творится? Те каретка скрыта несколько раз, и одного раза ShowCaret оказывается мало?
карма: 22

0
Ответов: 497
Рейтинг: 16
#41: 2016-08-10 11:00:10 ЛС | профиль | цитата
nesco,
nesco писал(а):
Те каретка скрыта несколько раз, и одного раза ShowCaret оказывается мало?
думаю нет может проблема где то в другом месте . вот если 99 раз ShowCaret толку нет. но если передать фокус кнопке то каретка тут как тут.

Add(PaintBox,2386737,301,154)
{
Left=10
Top=50
Color=65535
Point(onMouseDown)
link(onMouseDown,14837165:doEvent1,[])
}
Add(ScrollBar,4764953,301,112)
{
Left=10
Top=10
link(onPosition,781881:doWork1,[])
}
Add(Edit,8864697,553,98)
{
Left=180
Top=15
Point(doVisible)
Point(Handle)
Point(doSetFocus)
Point(onSetFocus)
}
Add(ChanelToIndex,781881,483,112)
{
link(onIndex,8864697:doVisible,[])
}
Add(InlineCode,13982809,560,175)
{
WorkPoints=#11:doShowCaret|11:doHideCaret|
EventPoints=#8:onResult|
DataPoints=#6:Handle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses Windows,kol,Share,Debug,Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|23: Handle: THI_Event;|25: onResult: THI_Event;|56: procedure doShowCaret(var _Data:TData; Index:word);|56: procedure doHideCaret(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|34:procedure THiAsmClass.doShowCaret;|3:var|9: h:HWND;|5:begin|34: h := ReadInteger(_Data, Handle);|29: //CreateCaret(h, 0, 1, 20);|15: ShowCaret(h);|27: _hi_OnEvent(onResult,1);|4:end;|0:|34:procedure THiAsmClass.doHideCaret;|3:var|9: h:HWND;|5:begin|34: h := ReadInteger(_Data, Handle);|15: HideCaret(h);|4:end;|0:|4:end.|
link(Handle,8864697:Handle,[])
}
Add(Button,8856257,434,217)
{
Left=85
Top=50
}
Add(Hub,14837165,371,161)
{
link(onEvent1,781881:doWork2,[(434,167)(434,125)])
link(onEvent2,9463327:doTimer,[(441,174)(441,181)])
}
Add(Timer,9463327,497,175)
{
Interval=10
Enable=1
AutoStop=99
link(onTimer,13982809:doShowCaret,[])
}

карма: 1
        ]  
1
Голосовали:sla8a
Ответов: 2205
Рейтинг: 675
#42: 2016-08-11 00:26:51 ЛС | профиль | цитата
nesco, вы или издеваетесь или просто не читаете мои посты.
карма: 11

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#43: 2016-08-11 01:32:37 ЛС | профиль | цитата
sla8a писал(а):
вы или издеваетесь или просто не читаете мои посты.

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

0
Ответов: 2205
Рейтинг: 675
#44: 2016-08-11 09:44:55 ЛС | профиль | цитата
nesco, [flood]При чем тут в амбиции лезть? Значит всетаки не читаете. И не три дня назад, а пост перед вашим.

sla8a 09 Aug 2016 23:03 писал(а):
[color=brown писал(а):
http://www.vsokovikov.narod.ru/New_MSDN_API/Caret/[/color]fn_hidecaret.htm]

Сокрытие накапливается. Если ваше приложение обращается HideCaret пять раз подряд, оно должно также обратиться пять раз и к функции ShowCaret прежде, чем каретка покажется на экране.

nesco 10 Aug 2016 00:43 писал(а):
Не накапливаются

nesco 10 Aug 2016 03:20 писал(а):
А вот HideCaret накапливается -- http://www.vsokovikov.narod.ru/New_MSDN_API/Caret/remov_caret.htm


[/flood]
карма: 11

0
Разработчик
Ответов: 26073
Рейтинг: 2122
#45: 2016-08-11 10:06:30 ЛС | профиль | цитата
sla8a, извини. Выходит, что я невнимательно прочитал твой пост, да и не было там одной цитаты, ссылку на которую я привел позже. Мне что-то усиленно казалось, что разговор шел про CreateCaret. И если уничтожить каретку этим методом, то все остальные каретки удалятся. И тут остается открытым вопрос -- а удалятся ли все накопления по HideCaret?
карма: 22

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