![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Экзотический" TMemo [D6, D7, WinXP]
pirate © (2006-05-04 17:53:00)В общем, у нас с друзьями есть одна задумка-
Интерактивная книга.
Сама изюминка в том, что пользователь мог бы читая какой либо сложный текст нажать на непонятное слово и посмотреть дополнительную информацию: значение в столковом словаре, синонимы, иллюстрация и т.п.
Суть проблемы такова:
Я не разу не создавал компоненты, а обычным TMemo я уже запарился: достиг того, что программа знает на какое слово наведен курсор мыши, но еслт минус: все работает, если текст не был "прокручен" скроллбаром, иначе я не могу узнать на сколько строчек он прокручен и из этого вытекает то, что наводимое слово определяется не верно.
(Все дело в том, что я могу узнать на какую строчку наведена мышка считая от верха компонента. А если текст прокручен, то верх TMemo вовсе не начало текста.)
Чем можете мне помочь?
(Подкиньте толковых идей, а то у меня уже мозги плавятся..)
Заранее премного благодарен.
Юрий Зотов (2006-05-05 08:07:00) [1]> pirate
Набросок "на скорую руку":
const
Letters = ['A'..'Z', 'a'..'z', 'Ё', 'ё', 'А'..'я'];
procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
S: string;
L, R: integer;
begin
S := Memo1.Text;
L := $FFFF and SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0, (Y shl 16) or X);
if L < Length(S) then
Inc(L);
R := L;
while (L > 0) and (S[L] in Letters) do
Dec(L);
Inc(L);
while (R <= Length(S)) and (S[R] in Letters) do
Inc(R);
Label1.Caption := Copy(S, L, R - L)
end;
А вообще, Вы изобретаете велосипед - уже давно существует, например, QDictionary ( http://www.anplex.ru) и, скорее всего, другие подобные программы. Причем QDictionary использует не сообщение EM_CHARFROMPOS, а технологию Active Accessibility, благодаря чему умеет работать не только с окнами классов Edit и RichEdit, но и с HTML-окнами (а последняя версия - и с окнами MS Office). И хотя программа изначально предназначена для перевода, но имеет редактируемый словарь, в который ничто не мешает вставить любое описание.
А разработка компонентов, хоть Вы о ней и пишете, тут совершенно ни при чем - поэтому обсуждение закрываю.
pirate (2006-05-04 18:29:00) [2]Нет. Есть проблема: книга уже готова в виде текста и она просто огромна.
Эту идею я уже отбросил.
MBo (2006-05-04 18:28:00) [3]А вообще это смахивает на гипертекстовые ссылки - так и использовать нужно соответствующие технологии
pirate (2006-05-04 18:24:00) [4]DimaBr (04.05.06 18:14) [1]
Положение курсора:
LineNumber := Memo1.Perform(EM_LINEFROMCHAR, -1, 0);
Я имел ввиду курсор мыши, а не каретку. Каретку я и сам знаю, как посмотреть.
Имеется ввиду что мы наводим мышку на слово, щелк и вуаля: все что можно с ним сделать у нас перед глазами.
MBo (2006-05-04 18:15:00) [5]>я не могу узнать на сколько строчек он прокручен и из этого вытекает то, что наводимое слово определяется не верно.
Исследуй EM_*** сообщения в MSDN или WinSDK хелпе
DimaBr (2006-05-04 18:14:00) [6]Положение курсора:
LineNumber := Memo1.Perform(EM_LINEFROMCHAR, -1, 0);
Цитата с начала страницы:
Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.