Вверх ↑
Этот топик читают: Гость
Ответов: 2236
Рейтинг: 676
#1: 2016-08-17 10:25:02 ЛС | профиль | цитата
Запихнул функции каретки в элемент.
Каретка это мигающая вертикальная черточка в позиции которой происходит ввод текста.
Возможности элемента:
   1. Создавать каретку ввода (каретка может быть создана у любого интерфейсного элемента).
   2. Создание каретки по картинке.
   3. Скрытие\Показ каретки.
   4. Изменение позиции каретки.
   5. Получение позиции каретки.
   6. Изменение мерцания каретки.
   7. Получение значения мерцания каретки.

Используя элемент можно нарисовать свой интерфейсный элемент для ввода текста. В примере DrawEdit.pas показано как это можно сделать.
drawedit.png
В примере CreateCaretFromBitmap.sha элементу Edit вместо стандартной создается каретка по рисунку.
createcaret.png
Добавлен пример изменения значения мерцания каретки с возможностью восстановления по умолчанию.
testblink.png
nesco, элемент прост до безобразия, если не трудно посмотрите и добавьте.

Архив с файлами элемента и примерами

Редактировалось 3 раз(а), последний 2016-09-16 23:48:17
карма: 11

3
файлы: 2createcaret.png [1.5KB] [1935], drawedit.png [4.1KB] [2001]
Голосовали:Konst, miver, RAWY_EX
Ответов: 758
Рейтинг: 112
#2: 2016-08-17 13:26:31 ЛС | профиль | цитата
sla8a, Что-то нето с doSetBlinkTime.
У меня по всей системе поменялось время BlinkTime на 1 и не меняется
------------ Дoбавленo в 12.30:
И еще, хорошо бы добавить точку возврата настроек по умолчанию
------------ Дoбавленo в 13.26:
И настройку высоты/ширины каретки.
BOOL WINAPI CreateCaret(
_In_ HWND hWnd,
_In_opt_ HBITMAP hBitmap,
_In_ int nWidth,
_In_ int nHeight
);

карма: 1

1
Голосовали:sla8a
Разработчик
Ответов: 26113
Рейтинг: 2126
#3: 2016-08-17 15:40:06 ЛС | профиль | цитата
sla8a писал(а):
элемент прост до безобразия, если не трудно посмотрите и добавьте

Только окончательный вариант после добавления всех предложений и последующего тестирования.
карма: 22

0
Ответов: 2236
Рейтинг: 676
#4: 2016-08-17 16:35:43 ЛС | профиль | цитата
miver писал(а):
У меня по всей системе поменялось время BlinkTime на 1 и не меняется
Берется значения X (там по умолчанию 1 стоит). Установите значение в свойствах X = 0 и подавайте нужное значение (530 по умолчанию у меня в системе).
Переделаю чтоб данные брались только из потока.
miver писал(а):
И еще, хорошо бы добавить точку возврата настроек по умолчанию
В этом не вижу смысла. Сделаю пример для сохранения значения в файл.
miver писал(а):
И настройку высоты/ширины каретки.
Тоже нет в этом смысла, нет такой функции. Просто заново создавайте новую каретку с новыми параметрами doCreate, можно не делать doDestroy.
nesco писал(а):
Только окончательный вариант после добавления всех предложений и последующего тестирования.
Ну это понятно.
------------ Дoбавленo в 16.35:
Обновил, можно тестировать.
карма: 11

0
Ответов: 497
Рейтинг: 16
#5: 2016-08-17 17:04:37 ЛС | профиль | цитата
sla8a, ну + за то что сел, подумал, нашел литературу, сделал компонент [flood]еще бы неплохо выравнивание картинки не по левому краю а по правому и поддержку Memo и тп[/flood]
карма: 1
        ]  
0
Ответов: 2236
Рейтинг: 676
#6: 2016-08-17 19:38:08 ЛС | профиль | цитата
RAWY_EX писал(а):
выравнивание картинки не по левому краю а по правому
RAWY_EX, а зачем выравнивание картинки по правому краю? Тем более это задача решается очень просто - минус позиция ширины картинки.
RAWY_EX писал(а):
поддержку Memo
Все возможности элемента могут быть использованы в любом интерфейсном элементе. Обратите внимании что в одном примере меняется стандартная каретка на свою, а во втором вообще создается каретка у PaintBox-а
карма: 11

0
Ответов: 758
Рейтинг: 112
#7: 2016-08-18 12:55:26 ЛС | профиль | цитата
sla8a писал(а):
Тоже нет в этом смысла, нет такой функции. Просто заново создавайте новую каретку с новыми параметрами doCreate, можно не делать doDestroy.

В том то и дело что с помощью компонента невозможно сделать жирную каретку
Add(MainForm,2953706,273,168)
{
Width=532
Height=249
}
Add(Edit,8864697,441,119)
{
Left=50
Top=70
Width=420
Height=50
Font=[MS Sans Serif,30,0,0,1]
Point(doVisible)
Point(Handle)
Point(doSetFocus)
}
Add(InlineCode,13982809,448,168)
{
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, 3, 45);|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(StyleXP,9536927,273,126)
{
}
Add(Button,11285720,357,140)
{
Left=55
Top=40
Caption="Жир"
link(onClick,4000874:doEvent1,[])
}
Add(Hub,4000874,399,140)
{
link(onEvent1,6776184:doWork2,[])
link(onEvent2,13982809:doShowCaret,[(431,153)(431,174)])
}
Add(Button,5385097,357,98)
{
Left=120
Top=40
Caption="Норм"
link(onClick,6776184:doWork1,[(424,104)])
}
Add(HubEx,6776184,420,140)
{
link(onEvent,8864697:doSetFocus,[])
}
карма: 1

0
Ответов: 2236
Рейтинг: 676
#8: 2016-08-18 15:32:50 ЛС | профиль | цитата
miver писал(а):
В том то и дело что с помощью компонента невозможно сделать жирную каретку
Вот это обвинение прошу снять с моего подзащитного
Вот доказательство невиновности:code_37679.txt
Тем более написано:
Caret.ini писал(а):
doCreate=Создает новую каретку (используйте событие onSetFocus). Данные берутся из потока, если Bitmap - картинка, то Width и Height игнорируются, если вместо Bitmap 0 (черная каретка) или 1 (серая каретка), то X - ширина и Y - высота каретки. ARG(Bitmap,X,Y)|1|

карма: 11

0
Ответов: 758
Рейтинг: 112
#9: 2016-08-18 16:51:15 ЛС | профиль | цитата
sla8a, Трудности описания
Предлагаю немного поменять описание для ясности
#ini
[Property]
arg1=Значение первого аргумента для функций по умолчанию|1|0
arg2=Значение второго аргумента для функций по умолчанию|1|0
ShowAfterCreate=Делать каретку видимой после создании|14|1|False,True

[Methods]
doCreate=Создает новую каретку (используйте событие onSetFocus). Данные берутся из потока, если Bitmap - картинка, то arg1 и arg2 игнорируются, если вместо Bitmap=0 (черная каретка) или Bitmap=1 (серая каретка), то arg1 - ширина и arg2 - высота каретки. ARG(Bitmap,arg1,arg2)|1|
doDestroy=Уничтожает каретку (используйте событие onKillFocus).|1|
*doShow=Делает каретку видимой.|1|
*doHide=Скрывает каретку (Сокрытие накапливается. Если doHide пять раз подряд, должно также пять раз и doShow прежде, чем каретка отобразится).|1|
*doSetPosition=Перемещает каретку в заданные координаты. Значение arg1 и arg2 координата верхнего угла каретки. Каретка перемещается в независимости скрыта она или нет. ARG(arg1,arg2)|1|
*doGetPosition=Получает координаты позиции каретки и выдает из в onGetPosition.|1|
*doSetBlinkTime=Устанавливает частоту мерцания каретки в миллисекундах. ARG(MSeconds)|1|
*doGetBlinkTime=Получения значения в миллисекундах мерцания каретки в onGetBlinkTime.|1|
onResult=Выдает результат: 1 - успешно, 0 - ошибка|2|
*onGetPosition=Событие происходит после doGetPosition и выдает позицию каретки ARG(arg1,arg2)|2|
*onGetBlinkTime=Событие происходит после doGetBlinkTime и выдает значение в миллисекундах мерцания каретки ARG(MSeconds)|2|
Handle=Определяет идентификатор|4|1
Bitmap=Картинка определяющая вид каретки или значения: 0, 1|4|11
arg1=Значение первого аргумента для функций|4|1
arg2=Значение второго аргумента для функций|4|1
карма: 1

0
файлы: 1code_37682.txt [2.5KB] [481]
Ответов: 2236
Рейтинг: 676
#10: 2016-08-18 17:23:04 ЛС | профиль | цитата
miver, пожалуй соглашусь с вашим вариантом. Изменил, проверяйте.
карма: 11

0
Ответов: 497
Рейтинг: 16
#11: 2016-08-19 11:52:43 ЛС | профиль | цитата
sla8a,
sla8a писал(а):
любом интерфейсном элементе
у меня в RichEdit при фокусе да каретка кастомная а вот когда нажать клавишу обратно полоска
карма: 1
        ]  
0
Ответов: 2236
Рейтинг: 676
#12: 2016-08-19 15:12:54 ЛС | профиль | цитата
RAWY_EX, Приведи пример своей схемы
карма: 11

0
Ответов: 497
Рейтинг: 16
#13: 2016-08-19 15:36:06 ЛС | профиль | цитата
sla8a, да ну какая схема вот например CreateCaretFromBitmap.sha . почему то у меня только RichEdit через )(опу работает
code_37688.txt
------------ Дoбавленo в 15.35:
думал из за изменений. обновился то же самое
карма: 1
        ]  
0
файлы: 1code_37688.txt [1.4KB] [991]
Ответов: 2236
Рейтинг: 676
#14: 2016-08-19 15:45:28 ЛС | профиль | цитата
RAWY_EX, что тут можно сделать раз RichEdit при каждом чихе обновляет свою каретку. Придется заставить его "полюбить" чужую:
code_37689.txt
Тут вопрос в другом, зачем RichEdit постоянно создает заново свою каретку?
карма: 11

0
Ответов: 2236
Рейтинг: 676
#15: 2016-09-12 23:12:05 ЛС | профиль | цитата
nesco, может уже можно элемент в палитру впихнуть? Если что потом напильником доработаем.
Последняя версия в архиве в первом посте.
карма: 11

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