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

Вниз

Перевести коодинаты курсора в координаты каретки   Найти похожие ветки 

 
DelphiLexx ©   (2006-03-23 13:40) [0]

Возникла следующ. проблема: хочу сделать чтобы при наведении курсора мыши на слово текста хранимого в редакторе подобного TMemo над ним выскакивал hint.
Умеется есть мой класс по отображению hint"a с заданной позицией и сообщением, но сообщение hint"a формируется относительно того на какое слово мы поставили курсор, поэтому я должен узнать строку и столбец в котором находится
слово. Но как Перевести коодинаты курсора в координаты каретки (т.е. в строку и столбец).


 
Anatoly Podgoretsky ©   (2006-03-23 13:52) [1]

Каретка и курсор между собой не связаны.


 
MBo ©   (2006-03-23 14:07) [2]

для Memo и RichEdit - с помощью EM_*** - сообщений


 
DelphiLexx ©   (2006-03-23 15:15) [3]


> Каретка и курсор между собой не связаны

Ребята из Borland"a каким-то образом в своём проекте смогли это осуществить. см рис.
http://www.rsdn.ru:80/File/26841/Hint.JPG
Вот мне нужно осуществить что-то подобное.


 
DelphiLexx ©   (2006-03-23 15:15) [4]


> для Memo и RichEdit - с помощью EM_*** - сообщений

Какое именно сообщение.


 
MBo ©   (2006-03-23 15:22) [5]

>Какое именно сообщение.
Ты уже их просмотрел в хелпе ?


 
DelphiLexx ©   (2006-03-23 15:37) [6]


> Ты уже их просмотрел в хелпе ?

Да нет, не смотрел.
MBo, хотел бы ещё более детально объяснить напримере что мне нужно:
Есть процедура:

 procedure
   TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
   Y: Integer);
 begin
   
   {сюда поступают координаты мыши, например, 133x34}
   {т.е. курсор мыши стоит над словом "редакторе", что
     соотвествует позиции: 3-ья строка 25 - символ вот именно эти данные мне нужно вернуть,
     а лучше всего вернуть слово над котором стоит курсор мыши т.е. слово "редакторе" }
 end;

для понятности см. рис: http://www.rsdn.ru:80/File/26841/Cursor.JPG


 
perat ©   (2006-03-23 21:54) [7]

можно попробовать что-то вроде этого
procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
const kr=1.55;
     kc=0.8;
var x0,y0,yt,xt,fs,row,cell:integer;
begin
 x0:=memo1.top;
 y0:=memo1.Left;
 xt:=x-x0;
 yt:=y-y0;
 fs:=memo1.Font.Size;
 row:=round(yt/(fs*kr));
 cell:=round(xt/(fs*kc))+1;
 if (row<=memo1.Lines.Count) and (row>=0)
 and(cell<=length(memo1.Lines[row])) and (cell>0)
 then edit1.Text:=memo1.lines[row][cell];
end;

коэффициенты kr и kc нужно подобрать другие
работает только с моноширинным шрифтом


 
Наиль ©   (2006-03-23 22:04) [8]

Попробуй такой код
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
Var
a:integer;
p:TPoint;
begin
p.x:=x;
p.y:=y;
a:=RichEdit1.Perform(EM_CHARFROMPOS,0,Integer(@p)) and $ffff;
p.x:=RichEdit1.Perform(EM_LINEFROMCHAR,a,0);
p.y:=a-RichEdit1.Perform(EM_LINEINDEX,p.x,0);
With p do Caption:=format("x=%d, y=%d",[x,y]);
end;


 
perat ©   (2006-03-24 00:19) [9]

[Error] Unit1.pas(35): Unsafe code only allowed in unsafe procedure
и вообще в справке не могу найти про EM_***
можешь коменты к последним 4 строкам написать?


 
Наиль ©   (2006-03-24 01:21) [10]

// Получить номер символа под мышью (от начала текста)
a:=RichEdit1.Perform(EM_CHARFROMPOS,0,Integer(@p)) and $ffff;
// Получить номер строки
p.x:=RichEdit1.Perform(EM_LINEFROMCHAR,a,0);
// Получить номер символа от начала строки
// Из номера символа вычесть номер начала строки
p.y:=a-RichEdit1.Perform(EM_LINEINDEX,p.x,0);

> [Error] Unit1.pas(35): Unsafe code only allowed in unsafe procedure
У тебя D2005?
Советую посмотреть что такое unsafe procedure. В D7 такого нет.

Почему-то EM_CHARFROMPOS хелп реагирует, только если написать его в ручную в хелп-окне.


 
perat ©   (2006-03-24 12:08) [11]

я сделал так:
{$UNSAFECODE ON}
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); unsafe;

но  теперь ругается на @p
[Warning] Unit1.pas(40): Unsafe code "@ operator"
[Error] Unit1.pas(40): Invalid typecast


 
DelphiLexx ©   (2006-03-24 12:43) [12]


> Попробуй такой код
> procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift:
>  TShiftState; X,
>...
> a:=RichEdit1.Perform(EM_CHARFROMPOS,0,Integer(@p)) and $ffff;
> ...
> end;

Проблема данный код заточен только для RichEdit как этот код заточить под компонент наследника от TCustomEditor, этот код даже для memo уже не тянет.
Исходник, который я прикрепляю, как раз-то и рассматривает готовый проект для RichEdit: http://www.rsdn.ru:80/File/26841/WordInCursor.rar


 
begin...end ©   (2006-03-24 12:58) [13]

Для Memo:

var
 P: TSmallPoint;
begin
 P := TSmallPoint(Memo.Perform(EM_CHARFROMPOS, 0, MakeLParam(X, Y)));
 Dec(P.x, Memo.Perform(EM_LINEINDEX, P.y, 0));
end


 
DelphiLexx ©   (2006-03-24 15:18) [14]


> Для Memo:
>
> var
>  P: TSmallPoint;
> begin
>  P := TSmallPoint(Memo.Perform(EM_CHARFROMPOS, 0, MakeLParam(X,
>  Y)));
>  Dec(P.x, Memo.Perform(EM_LINEINDEX, P.y, 0));
> end


А для наследника TCustomControl.


 
begin...end ©   (2006-03-24 15:45) [15]

> DelphiLexx ©   (24.03.06 15:18) [14]

Разве все наследники TCustomControl служат для редактирования текста?


 
Leonid Troyanovsky ©   (2006-03-24 15:48) [16]


> DelphiLexx ©   (24.03.06 15:18) [14]
> А для наследника TCustomControl.
> DelphiLexx ©   (24.03.06 12:43) [12]
> код заточить под компонент наследника от TCustomEditor,


Дык, он так скоро сточится до TObject.

И причем тут RICHEDIT?

Можем мы рассчитывать на что-то более членораздельное -
что, где, когда и при каких обстоятельствах?

--
Regards, LVT.


 
DelphiLexx ©   (2006-03-24 16:55) [17]


> Разве все наследники TCustomControl служат для редактирования
> текста?

Конкретно я хочу заточить под TfsSyntaxMemo - компонент библиотеки FastReport"a. Исходники FasReporta можно взять здесь: http://up.spbland.ru/files/06032472/


 
begin...end ©   (2006-03-24 18:25) [18]

> DelphiLexx ©   (24.03.06 16:55) [17]

Т.е. Вы предлагаете мне скачать трёхмегабайтный файл со всеми исходниками FastReport"а, чтобы я самостоятельно выяснил, наследником чего является TfsSyntaxMemo?

Извините, но Вы преувеличиваете количество моих свободного времени и сил.


 
Наиль ©   (2006-03-24 23:09) [19]

Для Мемо чуток проще.
вместо Integer(@p) нужно написать MakeLParam(p.X,p.Y)


 
DelphiLexx ©   (2006-03-27 13:36) [20]


> Извините, но Вы преувеличиваете количество моих свободного
> времени и сил.

Даю исходники компонента TfsSyntaxMemo наследник от TCustomControl:
http://www.rsdn.ru:80/File/26841/fs_synmemo.rar


 
DelphiLexx ©   (2006-03-27 14:03) [21]


> коэффициенты kr и kc нужно подобрать другие
> работает только с моноширинным шрифтом

А как производить подбор - методом подгона или как?
Какие шрифты относятся к моноширинным шрифтам.


 
Amoeba ©   (2006-03-27 14:07) [22]


> Какие шрифты относятся к моноширинным шрифтам.

Courier New, к примеру.


 
SpellCaster   (2006-03-27 14:14) [23]

Имхо, если компонент - не виндовый и управляет отображением текста самостоятельно, то тут только править исходник. Или покопаться в методах класса, может, там будут методы вроде LineAtPosition.



Страницы: 1 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.036 c
15-1142604163
Misha123
2006-03-17 17:02
2006.04.09
Доступ к MySql


15-1142687201
Новочеркасский Волк
2006-03-18 16:06
2006.04.09
2 месяца не могу понять в чём ошибка?!?!?


2-1143458793
LionMen
2006-03-27 15:26
2006.04.09
Срочно!!!!


2-1143014377
Dmitrij_K
2006-03-22 10:59
2006.04.09
Путь в файлу


15-1142788979
LordOfRock
2006-03-19 20:22
2006.04.09
Настройка Апача