Главная страница
    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.053 c
6-1101386016
aret99
2004-11-25 15:33
2005.02.06
БД в интернете.


1-1106677482
Aldor_
2005-01-25 21:24
2005.02.06
Можно ли с помощью GDI получить полноэкранный режим?


1-1106270038
jcrush
2005-01-21 04:13
2005.02.06
Разбивка сообщения по 70 символов..


1-1106547631
Alien_D
2005-01-24 09:20
2005.02.06
Алгоритм рекурсивного спуска по дереву...


14-1106221834
1008
2005-01-20 14:50
2005.02.06
Есть предложение





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский