![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевести коодинаты курсора в координаты каретки
DelphiLexx © (2006-03-23 13:40:00)Возникла следующ. проблема: хочу сделать чтобы при наведении курсора мыши на слово текста хранимого в редакторе подобного TMemo над ним выскакивал hint.
Умеется есть мой класс по отображению hint'a с заданной позицией и сообщением, но сообщение hint'a формируется относительно того на какое слово мы поставили курсор, поэтому я должен узнать строку и столбец в котором находится
слово. Но как Перевести коодинаты курсора в координаты каретки (т.е. в строку и столбец).
SpellCaster (2006-03-27 14:14:00) [1]Имхо, если компонент - не виндовый и управляет отображением текста самостоятельно, то тут только править исходник. Или покопаться в методах класса, может, там будут методы вроде LineAtPosition.
Amoeba (2006-03-27 14:07:00) [2]
> Какие шрифты относятся к моноширинным шрифтам.
Courier New, к примеру.
DelphiLexx (2006-03-27 14:03:00) [3]
> коэффициенты kr и kc нужно подобрать другие
> работает только с моноширинным шрифтом
А как производить подбор - методом подгона или как?
Какие шрифты относятся к моноширинным шрифтам.
DelphiLexx (2006-03-27 13:36:00) [4]
> Извините, но Вы преувеличиваете количество моих свободного
> времени и сил.
Даю исходники компонента TfsSyntaxMemo наследник от TCustomControl:
http://www.rsdn.ru:80/File/26841/fs_synmemo.rar
Наиль (2006-03-24 23:09:00) [5]Для Мемо чуток проще.
вместо Integer(@p) нужно написать MakeLParam(p.X,p.Y)
begin...end (2006-03-24 18:25:00) [6]> DelphiLexx © (24.03.06 16:55) [17]
Т.е. Вы предлагаете мне скачать трёхмегабайтный файл со всеми исходниками FastReport'а, чтобы я самостоятельно выяснил, наследником чего является TfsSyntaxMemo?
Извините, но Вы преувеличиваете количество моих свободного времени и сил.
DelphiLexx (2006-03-24 16:55:00) [7]
> Разве все наследники TCustomControl служат для редактирования
> текста?
Конкретно я хочу заточить под TfsSyntaxMemo - компонент библиотеки FastReport'a. Исходники FasReporta можно взять здесь: http://up.spbland.ru/files/06032472/
Leonid Troyanovsky (2006-03-24 15:48:00) [8]
> DelphiLexx © (24.03.06 15:18) [14]
> А для наследника TCustomControl.
> DelphiLexx © (24.03.06 12:43) [12]
> код заточить под компонент наследника от TCustomEditor,
Дык, он так скоро сточится до TObject.
И причем тут RICHEDIT?
Можем мы рассчитывать на что-то более членораздельное -
что, где, когда и при каких обстоятельствах?
--
Regards, LVT.
begin...end (2006-03-24 15:45:00) [9]> DelphiLexx © (24.03.06 15:18) [14]
Разве все наследники TCustomControl служат для редактирования текста?
DelphiLexx (2006-03-24 15:18:00) [10]
> Для 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 12:58:00) [11]Для 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 12:43:00) [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
perat (2006-03-24 12:08:00) [13]я сделал так:
{$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
Наиль (2006-03-24 01:21:00) [14]// Получить номер символа под мышью (от начала текста)
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 00:19:00) [15][Error] Unit1.pas(35): Unsafe code only allowed in unsafe procedure
и вообще в справке не могу найти про EM_***
можешь коменты к последним 4 строкам написать?
Наиль (2006-03-23 22:04:00) [16]Попробуй такой код
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-23 21:54:00) [17]можно попробовать что-то вроде этого
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 нужно подобрать другие
работает только с моноширинным шрифтом
DelphiLexx (2006-03-23 15:37:00) [18]
> Ты уже их просмотрел в хелпе ?
Да нет, не смотрел.
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
MBo (2006-03-23 15:22:00) [19]>Какое именно сообщение.
Ты уже их просмотрел в хелпе ?
DelphiLexx (2006-03-23 15:15:00) [20]
> для Memo и RichEdit - с помощью EM_*** - сообщений
Какое именно сообщение.