Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Текст под мышом в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
3-1104832769
Roter
2005-01-04 12:59
2005.02.06
Проблема вычитки identity полей из БД


1-1106565839
Aleks
2005-01-24 14:23
2005.02.06
String


1-1106401615
infom
2005-01-22 16:46
2005.02.06
Каким образом лучше сохранять несколько потоков в один файл ?


14-1105957338
vopros
2005-01-17 13:22
2005.02.06
Отключилась панель Домашняя страница в explorer


1-1106642719
Aleksandr.
2005-01-25 11:45
2005.02.06
Как создать две разные настройки Делфи?