Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Надо получить позицию символа в мемо при движении мышки... [D7]


Silence ©   (2005-07-01 16:42:00) 

Мужики, помогите с САБЖЕМ!


Cardinal   (2005-07-01 18:06:00) [1]


> Наш отдел держит сказанное вами мнение при себе :-\

Все понятно, сочувствую


> Оно попроще будет. Мне так почему-то ка-а-тся.

Зато у меня нагляднее, виден весь алгоритм. Вместе с практической пользой функция преследует учебную цель :-)

P.S. Ладно, сдаюсь, ваша лучше :-)


Silence   (2005-07-01 17:48:00) [2]

Наш отдел держит сказанное вами мнение при себе :-\


Digitman   (2005-07-01 17:41:00) [3]


> так стукнуло в голову одному человеку


думается, захворал он на голову, этот "человек")


begin...end   (2005-07-01 17:27:00) [4]

> Cardinal ©   (01.07.05 17:08) [5]

function MemoPosByPoint(P: TPoint; Memo: TMemo): Integer;
begin
 Result := Memo.Perform(EM_CHARFROMPOS, 0, MAKELPARAM(P.X, P.Y)) and $FFFF
end.


Оно попроще будет. Мне так почему-то ка-а-тся.


Silence   (2005-07-01 17:24:00) [5]

2 Cardinal спасибо

В мемо я вывожу имена через запятую, так стукнуло в голову одному человеку


Digitman   (2005-07-01 17:14:00) [6]


> надо получить его имя, ну а для имени надобна позиция символа


проще заполнить именами список TListView и в обработчике OnMouseMove вызывать GetItemAt(), который вернет эл-т списка с готовымименем в св-ве Caption

и никакая "позиция символа" не нужна


Cardinal   (2005-07-01 17:12:00) [7]

Кто спросит зачем, так я псевдографический редактор писал, там мышкой как в пайнте рисовать можно было благодаря этой функции


Cardinal   (2005-07-01 17:08:00) [8]

Вот функция когда-то писал, должна работать для шрифтов не
моноширинных, для любых:

function memoposbypoint(p: tpoint; memo: tmemo): integer;
var
 b,x,y,n,i: integer;
 c: tcanvas;
begin
c := tcanvas.Create;
c.Font := memo.Font;
b := c.TextHeight('W');
y := round(p.Y div b + 1);
n := 0;
x := 0;
if memo.Lines.Count >= y then
 for i := 1 to length(memo.Lines[y-1]) do
   if length(memo.Lines[y-1]) >= i then
     begin
     b := c.TextWidth(memo.Lines[y-1][i]);
     inc(n,b);
     if n > p.X then
       begin
       x := i;
       break;
       end;
     end;
result := 0;
for i := 0 to y-2 do
 inc(result,length(memo.Lines[i]));
inc(result,x);
c.Free;
end;


begin...end   (2005-07-01 16:58:00) [9]

> Silence   (01.07.05 16:50) [2]

EM_CHARFROMPOS


Digitman   (2005-07-01 16:55:00) [10]


> вывожу в мемо


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


Silence   (2005-07-01 16:50:00) [11]

Я составляю строку с именами людей и вывожу в мемо. Надо по наведению на имя курсора показать информацию о человеке, а для этого надо получить его имя, ну а для имени надобна позиция символа


Digitman   (2005-07-01 16:46:00) [12]

любопытно, зачем это может понадобиться ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо