Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.015 c
2-1143368562
Mahab
2006-03-26 14:22
2006.04.09
Image


2-1143027125
s_t_d
2006-03-22 14:32
2006.04.09
Коды клавишей управления курсором


15-1142401868
Fidel
2006-03-15 08:51
2006.04.09
Продажа программы


2-1143017683
pkm
2006-03-22 11:54
2006.04.09
image.


15-1142402854
Думкин
2006-03-15 09:07
2006.04.09
Субъективизм и уверенность в абсолюте. И в программировании.





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