Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как поставить каретку TMemo в нужную строку


Автор: Punk 1.6.2002, 15:08
:withstupid
Как поставить каретку 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, его можно вытащить например в потомках, но просто так использовать нельзя.

А можно так:

Код

Function SetCaretPosition(memo:TMemo; x,y:integer);
 var i:integer;
begin
 i := SendMessage(memo.Handle, EM_LINEINDEX, y, 0) + x;
 SendMessage(memo1.Handle, EM_SETSEL, i, i);
end;

Автор: Song 2.6.2002, 15:17
Вы не правы. И метод АПИ - SetCaretPos() и собственый метод от мемо: TCustomMemo.SetCaretPos() будут работать без проблем.
Я пробовал  :rolleyes

Автор: 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
Цитата(Song @ 02.6.2002, 07:44)
Вашему примеру я бы рекомендовал использовать TMemo.Perform - работает быстрее не захломляя текущую очередь сообщений для приложения.

Совершенно согласен, использование 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
Цитата(Punk @ 03.6.2002, 15:48)
Ставлю вопрос ребром
Как запретить переход на первую(!) строку мемо и уж тем более ее изменения
Слабо?

Нет  :)
Memo1.Enabled:=False

Автор: Vit 3.6.2002, 15:17
Определять позицию каретки и при переходе ее на первую строку, водворять обратно, но вообще дело очень муторное, слишком много событий надо обрабатывать. Я бы вместо первой строки поставил просто edit в котором установил readonly:=true, оба memo и edit сделал бы совсем без рамок и тщательно совместил бы их, и поместил на панель, которая бы и эмулировала рамку вокруг компонентов - при этом пользователю казалось бы что там просто мемо, но на самом деле будет 2 компонента и ему будет затруднительно перейти на первую строку и сделать что-то.

Автор: Song 3.6.2002, 15:28
ИМХО onKeyDown, onMouseDown

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)