Главная страница
    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.042 c
14-1105972475
Cosinus
2005-01-17 17:34
2005.02.06
Хм... Время включения заставки в NT-системах...


1-1106317905
Zevs_a
2005-01-21 17:31
2005.02.06
Иерархические структуры


14-1106138020
vajo
2005-01-19 15:33
2005.02.06
Шрифты


1-1106561676
Zodor
2005-01-24 13:14
2005.02.06
Delphi 8 or delphi2005


1-1106291256
Fantom
2005-01-21 10:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский