Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Коодинаты курсора в координаты каретки


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

Автор: _hunter 23.3.2006, 14:10
TCustomMemo.CaretPos

Автор: Delphist 23.3.2006, 15:33
Цитата(_hunter @ 23.3.2006, 14:10)
TCustomMemo.CaretPos

CaretPos возращает позицию каретки(курсора клавиатуры), а что мне нужно объясню напримере:
Есть процедура:
Код

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

см. рис. который прикреплен.

Автор: _hunter 23.3.2006, 15:50
оно и для записи доступно. а потом SelStart -- получиш часть своего слова.потом пробежаться влево/вправо, до разделителя -- получим слово...

Автор: Delphist 23.3.2006, 16:18
Цитата(_hunter @ 23.3.2006, 15:50)
оно и для записи доступно. а потом SelStart -- получиш часть своего слова.потом пробежаться влево/вправо, до разделителя -- получим слово...

Т.к. я из координат 133x34 получу 3:25?
Может чего я не понимаю - примерчик не мог бы набрасать?!

Автор: Alexeis 23.3.2006, 16:41
Что-то похожее уже обсуждали.

Сошлюсь на справку
Цитата

The EM_CHARFROMPOS message retrieves information about the character closest to a specified point in the client area of an edit control. You can send this message to either an edit control or a rich edit control.


как будто бы оно, но сам не проверял

Автор: Delphist 23.3.2006, 17:11
Цитата(alexeis1 @ 23.3.2006, 16:41)
Что-то похожее уже обсуждали.

Сошлюсь на справку
Цитата

The EM_CHARFROMPOS message retrieves information about the character closest to a specified point in the client area of an edit control. You can send this message to either an edit control or a rich edit control.


как будто бы оно, но сам не проверял

1) Как будет выглядеть SendMessage с этим сообщением?
2) Что непосредственно возвращает это собщение: слово над курсором или координаты курсора в координатах каретки?

Автор: Delphist 23.3.2006, 17:30
Цитата(alexeis1 @ 23.3.2006, 16:41)

Сошлюсь на справку
The EM_CHARFROMPOS message retrieves information about the character closest to a specified point in the client area of an edit control. You can send this message to either an edit control or a rich edit control.

Проверил я это сообщение - в итоге оно возвращает позицию символа. т.е: в редакторе memo
написал текст:
строка1
строка2 {на данной строке на букву р навёл курсор в итоге должен был получить строка: 2 столбец 3,
а получил строка 12, столбец 0.
Я даже понял как получилось 12: строка1+#13#10+строка2 и р как раз будет 12 символ}

?
Так как же пользоваться этим сообщением?

Код который я использовал для проверки:

Код

procedure
  TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  lResult: integer;
begin

  form1.Caption := 'Координаты курсора в редакторе Memo X: ' + IntToStr(X) +
    '  Y: ' + IntToStr(Y);
  lResult := SendMessage(Memo1.Handle, EM_CHARFROMPOS,
    0, MAKELPARAM(x, y));
  label1.Caption := 'строка: ' + IntToStr(Lo(lResult)) +
    ('  столбец: ') + IntToStr(Hi(lResult));
end;

Автор: _hunter 23.3.2006, 17:32
Цитата(Delphist @ 23.3.2006, 15:18 Найти цитируемый пост)
Т.к. я из координат 133x34 получу 3:25?
Может чего я не понимаю - примерчик не мог бы набрасать?!

запиши туда 133x34
потом
возьми SelStart.
что будет? ( только текст попроще впиши )

Цитата(Delphist @ 23.3.2006, 16:11 Найти цитируемый пост)
1) Как будет выглядеть SendMessage с этим сообщением?
2) Что непосредственно возвращает это собщение: слово над курсором или координаты курсора в координатах каретки?

так и будет выглядеть:
Код

lResult = SendMessage(      // returns LRESULT in lResult     (HWND) hWndControl,      // handle to destination control     (UINT) EM_CHARFROMPOS,      // message ID     (WPARAM) wParam,      // = 0; not used, must be zero    (LPARAM) lParam      // = (LPARAM) () lParam; );  

и возвращает координаты коретки
Добавлено @ 17:34
ты его неправильно использовал.
его на HI и LO - word' ы бить нужно.
можно в отладчике посмотреть

Автор: Delphist 23.3.2006, 17:54
Всё _hunter проблема решена надо вместо Lo и Hi использовать LoWord и HiWord

Автор: Delphist 24.3.2006, 12:56
Цитата(_hunter @ 23.3.2006, 17:32)
Код

lResult = SendMessage(      // returns LRESULT in lResult     (HWND) hWndControl,      // handle to destination control     (UINT) EM_CHARFROMPOS,      // message ID     (WPARAM) wParam,      // = 0; not used, must be zero    (LPARAM) lParam      // = (LPARAM) () lParam; );  

и возвращает координаты коретки ты его неправильно использовал. его на HI и LO - word' ы бить нужно.
можно в отладчике посмотреть

_hunter возникла новая проблема.
Я прикрепляю исходник, в котором реализовано возращения слова под курсором мыши, в качестве редактора, в котором хранится текст, берется TRichEdit, если я пытаюсь взять вместо TRichEdit'a — TMemo или TfsSyntaxMemo(TfsSyntaxMemo -наследник от TCustomControl), то слово не возвращается. Помоги исправить этот недастаток.

P.S. Если нужен TfsSyntaxMemo — это компонент библиотеки FastReport, то я выложу.

Автор: _hunter 24.3.2006, 13:08
справка гласит, что это сообщение работает только на виндовых контролах ( edit, RichEdit ). на самоклепах нужно по моей стратегии работать ( если есть поддержка аналогов CaretPos )

Автор: Alexeis 24.3.2006, 13:28
_hunter, если в самоклепах это сообщение не перехватывать, а их строить на базе стандартных, то все должно работать аналогично.

Автор: _hunter 24.3.2006, 13:40
дык и я о том же. но TMemo по иерархии лежит дальше чем TCustomControl. поэтому ( с большой долей вероятности ) можно утверждать что самоклеп склепан на самоклепном рисовальщике [ о как завернул... ]

Автор: Delphist 24.3.2006, 15:38
Цитата(_hunter @ 24.3.2006, 13:08)
справка гласит, что это сообщение работает только на виндовых контролах ( edit, RichEdit ). на самоклепах нужно по моей стратегии работать ( если есть поддержка аналогов CaretPos )

Обзор слов я хочу заточить под TfsSyntaxMemo - компонент библиотеки FastReport. Если она(там есть исходники TfsSyntaxMemo) нужна я могу выложить.

Автор: Alexeis 24.3.2006, 15:50
Лучше, канечно, выложить smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)