Форум: "Потрепаться";
Текущий архив: 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