Текущий архив: 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.5 MB
Время: 0.02 c