| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как поставить каретку TMemo в нужную строку |
| Автор: Punk 1.6.2002, 15:08 |
Как поставить каретку TMemo в нужную строку |
| Автор: Baa 1.6.2002, 16:12 |
| Посылай нажатие клавишь перемещения...А если не секрет - то зачем тебе это? |
| Автор: Vit 1.6.2002, 19:24 |
| SelStart - метод чтобы поставить каретку на нужную позицию, но при этом номер строки прийдется вычислить.
|
| Автор: Song 2.6.2002, 14:06 |
| SetCaretPos() |
| Автор: Vit 2.6.2002, 15:06 | ||
| Нет! Так не пойдет, этот метод не public, его можно вытащить например в потомках, но просто так использовать нельзя. А можно так:
|
| Автор: Song 2.6.2002, 15:17 |
| Вы не правы. И метод АПИ - SetCaretPos() и собственый метод от мемо: TCustomMemo.SetCaretPos() будут работать без проблем. Я пробовал |
| Автор: Vit 2.6.2002, 15:25 |
| Сорри, я думал что речь идет о методе а не API функции, а по поводу метода тогда мне не совсем понятно: 1) MyMemo.SetCaretPos - компиллятор не пропускает 2) TCustomMemo(MyMemo).SetCaretPos - компиллятор не пропускает 3) Идет только так: type TFake=class(TCustomMemo); .... TFake(MyMemo).SetCaretPos() Ну так в этом случае я как раз и использую наследник TMemo вызывая в нем Protected методы родительского класса. |
| Автор: Song 2.6.2002, 15:31 |
| Конечно, для SetCaretPos() от TCustomMemo надо использовать наследника, однако, если это применительно только для этой задачи создавать наследника будет излишне, аналогичный метод АПИ работает с любым multiline контролом и даже гипатетически с TEdit |
| Автор: Vit 2.6.2002, 15:39 |
| А API я посмотрел - она не требует передачу Handle - она что работает с активным компонентом? Тогда ее ценность сильно теряется, так как нельзя перевести курсор при нажатии например кнопки, надо обязательно вначале ставить фокус на контрол. Моя функция будет работать и без фокуса... |
| Автор: Song 2.6.2002, 15:44 |
| EM_SETSEL возможно, а вот TCustomMemo.SelStart без фокуса никак нет... Вашему примеру я бы рекомендовал использовать TMemo.Perform - работает быстрее не захломляя текущую очередь сообщений для приложения. |
| Автор: Vit 2.6.2002, 15:46 |
| Ха еще интереснее! А ты попробуй эту функцию - она действительно переводит курсор, но есть 2 но: 1) координаты то не в строках а в пикселях наверное (во всяком случае у меня курсор становится между строк) 2) само memo не идентифицирует эти действия, курсор переносится, но стоит нажать стрелку вправо или влево курсор переносится относительно изначальной позиции а не измененной. |
| Автор: Vit 2.6.2002, 15:47 |
| TCustomMemo.SelStart замечательно работает и без курсора в "background" - ты не увидишь результаты работы визуально, но реально обращение к методам и свойствам подтвердит что все работает. |
| Автор: Song 2.6.2002, 15:56 |
| Возможно, просто моё подозрение было вызвано тем, что выделить участок текста (SetLength >o ) нельзя без передачи фокуса на визуальный компонент. |
| Автор: Vit 2.6.2002, 16:00 | ||
Совершенно согласен, использование Perform более родной способ для Дельфи чем посылка сообщений напрямую, а на счет скорости не уверен, по сути ретрансляция идет та же самая, Perform по сути просто VCL надстройка над посылкой сообщений, как я понимаю. |
| Автор: Song 2.6.2002, 16:07 |
| Perform: Perform then passes the message record to the WindowProc method for processing. SendMessage: The function calls the window procedure for the specified window and does not return until the window procedure has processed the message Сообщение посланное через SendMessage достигает CallBack ф-ии WindProc только после того как обработается в очереди сообщений. Отсюда можно сделать вывод что Perform быстрее, однако PostMessage() на практике тоже широко используется так как тоже не ставит сообщение в очередь. |
| Автор: Vit 2.6.2002, 16:19 |
| Просто идет речь о синхронной или асинхронной посылки сообщений... |
| Автор: Song 2.6.2002, 16:27 |
Выигрыш в постановке посылки сообщения. По опыту скажу что Perform работает быстрее чем SendMessage. |
| Автор: Vit 2.6.2002, 18:26 |
| Будем учитывать. PS. У тебя классная аватара, мне нравится. |
| Автор: Punk 3.6.2002, 14:48 |
| Ставлю вопрос ребром Как запретить переход на первую(!) строку мемо и уж тем более ее изменения Слабо? |
| Автор: Song 3.6.2002, 14:49 | ||
Нет Memo1.Enabled:=False |
| Автор: Vit 3.6.2002, 15:17 |
| Определять позицию каретки и при переходе ее на первую строку, водворять обратно, но вообще дело очень муторное, слишком много событий надо обрабатывать. Я бы вместо первой строки поставил просто edit в котором установил readonly:=true, оба memo и edit сделал бы совсем без рамок и тщательно совместил бы их, и поместил на панель, которая бы и эмулировала рамку вокруг компонентов - при этом пользователю казалось бы что там просто мемо, но на самом деле будет 2 компонента и ему будет затруднительно перейти на первую строку и сделать что-то. |
| Автор: Song 3.6.2002, 15:28 |
| ИМХО onKeyDown, onMouseDown |