Главная страница
    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.054 c
1-1106200829
kyn66
2005-01-20 09:00
2005.02.06
Как убрать значек приложения из трея


4-1103448057
banderas
2004-12-19 12:20
2005.02.06
Drag&amp;Drop файлов


8-1098510580
mr.Faga
2004-10-23 09:49
2005.02.06
Как нарисовать фоновую картинку на TTabSheet


14-1106217962
Зигмунд
2005-01-20 13:46
2005.02.06
Завтра пятница. ;) => Предпятничные вопросы.


1-1106402537
Павел
2005-01-22 17:02
2005.02.06
Панель в TreeList





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