Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как поставить каретку TMemo в нужную строку, Как поставить каретку TMemo в нужную стр 
:(
    Опции темы
Punk
Дата 1.6.2002, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.3.2002
Где: Абакан

Репутация: нет
Всего: нет



:withstupid
Как поставить каретку TMemo в нужную строку
PM MAIL   Вверх
Baa
Дата 1.6.2002, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Посылай нажатие клавишь перемещения...А если не секрет - то зачем тебе это?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Vit
Дата 1.6.2002, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



SelStart - метод чтобы поставить каретку на нужную позицию, но при этом номер строки прийдется вычислить.




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 2.6.2002, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



SetCaretPos()


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 2.6.2002, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Нет! Так не пойдет, этот метод не 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;



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 2.6.2002, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



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


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 2.6.2002, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Сорри, я думал что речь идет о методе а не API функции, а по поводу метода тогда мне не совсем понятно:

1)  MyMemo.SetCaretPos - компиллятор не пропускает

2)  TCustomMemo(MyMemo).SetCaretPos  - компиллятор не пропускает

3) Идет только так:

 type TFake=class(TCustomMemo);

....

 TFake(MyMemo).SetCaretPos()

Ну так в этом случае я как раз и использую наследник TMemo вызывая в нем Protected методы родительского класса.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 2.6.2002, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Конечно, для SetCaretPos() от TCustomMemo надо использовать наследника, однако, если это применительно только для этой задачи создавать наследника будет излишне, аналогичный метод АПИ работает с любым multiline контролом и даже гипатетически с TEdit  :)


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 2.6.2002, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



А API я посмотрел - она не требует передачу Handle - она что работает с активным компонентом? Тогда ее ценность сильно теряется, так как нельзя перевести курсор при нажатии например кнопки, надо обязательно вначале ставить фокус на контрол. Моя функция будет работать и без фокуса...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 2.6.2002, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



EM_SETSEL возможно, а вот TCustomMemo.SelStart без фокуса никак нет...

Вашему примеру я бы рекомендовал использовать TMemo.Perform - работает быстрее не захломляя текущую очередь сообщений для приложения.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 2.6.2002, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Ха еще интереснее! А ты попробуй эту функцию - она действительно переводит курсор, но есть 2 но:

1) координаты то не в строках а в пикселях наверное (во всяком случае у меня курсор становится между строк)
2) само memo не идентифицирует эти действия, курсор переносится, но стоит нажать стрелку вправо или влево курсор переносится относительно изначальной позиции а не измененной.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 2.6.2002, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



TCustomMemo.SelStart замечательно работает и без курсора в "background" - ты не увидишь результаты работы визуально, но реально обращение к методам и свойствам подтвердит что все работает.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 2.6.2002, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Возможно, просто моё подозрение было вызвано тем, что выделить участок текста (SetLength >o ) нельзя без передачи фокуса на визуальный компонент.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 2.6.2002, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



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

Совершенно согласен, использование Perform более родной способ для Дельфи чем посылка сообщений напрямую, а на счет скорости не уверен, по сути ретрансляция идет та же самая, Perform по сути просто VCL надстройка над посылкой сообщений, как я понимаю.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 2.6.2002, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



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() на практике тоже широко используется так как тоже не ставит сообщение в очередь.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 2.6.2002, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Просто идет речь о синхронной или асинхронной посылки сообщений...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
  Дата 2.6.2002, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



:)  Это понятно.
Выигрыш в постановке посылки сообщения. По опыту скажу что Perform работает быстрее чем SendMessage.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 2.6.2002, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Будем учитывать.

PS. У тебя классная аватара, мне нравится. ;-)


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Punk
Дата 3.6.2002, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.3.2002
Где: Абакан

Репутация: нет
Всего: нет



Ставлю вопрос ребром
Как запретить переход на первую(!) строку мемо и уж тем более ее изменения
Слабо?
PM MAIL   Вверх
Song
Дата 3.6.2002, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Цитата(Punk @ 03.6.2002, 15:48)
Ставлю вопрос ребром
Как запретить переход на первую(!) строку мемо и уж тем более ее изменения
Слабо?

Нет  :)
Memo1.Enabled:=False


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Vit
Дата 3.6.2002, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Song
Дата 3.6.2002, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



ИМХО onKeyDown, onMouseDown


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.