Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

Текст под мышом в RichEdit, например.   Найти похожие ветки 

 
OneFragLeft ©   (2005-01-19 19:29) [0]

Привет программеры и им сочуствующие, вот решил опять немного покодить и столкнулся с проблемой:
Как определить какая буква находится под указателем мыши, если я вожу им над RichEdit или Memo, но
не выделяю его. Проблема для меня оказалась нерешаемой, поэтому обращаюсь к вам. Хочу сделать что-то вроде
гиперссылки, но в риче или мэмо. Подскажите пожалуйста.

....OneFragLeftыч


 
P.N.P. ©   (2005-01-19 19:55) [1]

Вот, пришла мысль в голову -


procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 P:TPoint;
begin
 P:=Memo1.ScreenToClient(Mouse.CursorPos);
 P.Y:=(P.Y div (Memo1.Font.Height*-1));
 P.X:=(P.X div (Memo1.Font.Height*-1))+1;
 if ((P.X>-1)and(P.Y>-1)) and(P.Y<Memo1.Lines.Count)and(P.X<Length(Memo1.Lines[P.Y])) then
   ShowMessage(Memo1.Lines[P.Y][P.X]);
end;


Проверил, вроде как работает.


 
begin...end ©   (2005-01-19 19:58) [2]

> OneFragLeft ©   (19.01.05 19:29)

> Как определить какая буква находится под указателем мыши

Не знаю, как там в RichEdit, а в Memo, думаю, это можно сделать, послав ему сообщение EM_CHARFROMPOS с координатами курсора. Только как Вы потом будете гиперссылки делать в Memo - ума не приложу...


 
P.N.P. ©   (2005-01-19 20:09) [3]

До сих пор велосипеды пытаюсь изобретать =)
вот пример из faq (delphiworld):

uses
RichEdit;
 
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
var
 iCharIndex, iLineIndex, iCharOffset, i, j: Integer;
 Pt: TPoint;
 s: string;
begin
 with TRichEdit(Sender) do
 begin
   Pt := Point(X, Y);
   // Get Character Index from word under the cursor
   iCharIndex := Perform(Messages.EM_CHARFROMPOS, 0, Integer(@Pt));
   if iCharIndex < 0 then Exit;
   // Get line Index
   iLineIndex  := Perform(EM_EXLINEFROMCHAR, 0, iCharIndex);
   iCharOffset := iCharIndex - Perform(EM_LINEINDEX, iLineIndex, 0);
   if Lines.Count - 1 < iLineIndex then Exit;
   // store the current line in a variable
   s := Lines[iLineIndex];
   // Search the beginning of the word
   i := iCharOffset + 1;
   while (i > 0) and (s[i] <> " ") do Dec(i);
   // Search the end of the word
   j := iCharOffset + 1;
   while (j <= Length(s)) and (s[j] <> " ") do Inc(j);
   // Display Text under Cursor
   Caption := Copy(s, i, j - i);
 end;
end;


 
begin...end ©   (2005-01-19 20:12) [4]

А я вот только что написал пример для Memo. Но особо не прверял.

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 CharIndex: Integer;
begin
 with (Sender as TMemo) do
 begin
   CharIndex := Perform(EM_CHARFROMPOS, 0, X or (Y shl 16)) and $0000FFFF;
   if CharIndex < Length(Lines.Text) then
     Self.Caption := Lines.Text[CharIndex]
 end
end.


> [1] P.N.P. ©   (19.01.05 19:55)

> var
>  P:TPoint;

> P:=Memo1.ScreenToClient(Mouse.CursorPos);

Ну здрассьте... :-) А параметры обработчика (X, Y) зачем даны? :-)


 
OneFragLeft ©   (2005-01-19 20:13) [5]

P.N.P. ©   (19.01.05 20:09) [3]

Круто!!! Спасибо. Правда ещё не проверил, но.....
Пока ждал пришла в голову мысль использовать THTMLWiever и в нем перехватывать нажатие гиперссылки. Попробую оба варианта, но у THTMLWiever больше возможностей, имхо. Но всё равно спасибо большое.


 
P.N.P. ©   (2005-01-19 20:19) [6]

>begin...end ©   (19.01.05 20:12) [4]
да. точно. незаметил -)
пора отдыхать, крыша уже едет



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.038 c
1-1106229655
Павел
2005-01-20 17:00
2005.02.06
Как активировать дочернее окно в чужом приложении?


14-1106134833
Vlad Oshin
2005-01-19 14:40
2005.02.06
вопрос экономистам: цена на материнку и доски


14-1105886309
Fenik
2005-01-16 17:38
2005.02.06
Откуда на Титане метан?


14-1105289750
Fin
2005-01-09 19:55
2005.02.06
У кого самый дорогой или дешевый Интернет


3-1105367361
AlexTregubov
2005-01-10 17:29
2005.02.06
функции SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский