Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RichEdit, Выделение ссылок как в WebBrowser'е 
:(
    Опции темы
Felt
Дата 6.8.2004, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.6.2004

Репутация: нет
Всего: нет



Привет.
В окне редактирования кода Delphi в любой момент времени можно нажать клавишу Ctrl и, поместив указатель мыши над объектом, добиться выделения слова. Как можно добиться такого выделения в редакторе RichEdit, причем при отпускании Ctrl текст вновь должен восстановиться?
Минут пять назад написал код, но тут же нашел в нем глюки: первое слово выделяться не хочет, когда происходит изменение стиля слова возникает выделение текста, которое должно быть незаметным.
Код

procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
Caret, P: TPoint;
n: Integer;
begin
if (ssCtrl in Shift) then
begin
 Caret:=RichEdit1.CaretPos; //Чтобы потом поставить курсор на место
 P.X:=X;
 P.Y:=Y;
 with RichEdit1 do
  begin
   //Вернет номер символа, над которым находится курсор
   SelStart:=Perform(EM_CHARFROMPOS, 0, LongInt(@P));
   while (Text[SelStart]<>' ') or (SelStart=1) do
    SelStart:=SelStart-1;
   n:=SelStart+1;
   while Text[n]<>' ' do
    n:=n+1;
   SelLength:=n-SelStart-1;
   SelAttributes.Style:=[fsUnderLine]; //Выделяем
   CaretPos:=Caret; //Ставим курсор на место, где он и был
  end;
end;
end;


Да... В моем примере меняется стиль любого слова, мне же нужно, чтобы такими выделениями обладали только зарезервированные слова, например, Delphi, Basic, C++, Pascal...
PM MAIL   Вверх
Felt
Дата 8.8.2004, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.6.2004

Репутация: нет
Всего: нет



Тишина...
Может кто хочет предложить свой вариант решения?
PM MAIL   Вверх
Ripper
Дата 8.8.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: 1
Всего: 23



в SynEdit вроде есть выделение ссылок... поставь его, хороший компонент


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
p0s0l
Дата 8.8.2004, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Лучше сделать проверку в таймере, чтобы отловлять нажатие/отжатие Ctrl, а то если делать через MouseMove, то чтобы сработало нажатие Ctrl, надо сдвигать мышь...
Вот, накидал примерный вариант как это должно быть:
Код
type
 TSelInfo = record
   _SelStart, _SelLength : integer;
   _HighLight : boolean;
 end;

var OldSel : TSelInfo;
const EmptySel : TSelInfo = ();
const BreakChars = [' ', #10, #13, ',', '.'];
const ReservedWords : array [0..4] of string =
   ('Basic', 'C++', 'Pascal', 'Delphi', 'Vingrad');

procedure TForm1.Timer2Timer(Sender: TObject);
var
 Caret, P : TPoint;
 Sel : TSelInfo;
 W : string;
 i : integer;

 procedure SetStyle (S : TSelInfo; fs : TFontStyles; cl : TColor);
 begin
   with RichEdit1 do
   begin
     SelStart := S._SelStart;
     SelLength := S._SelLength;
     SelAttributes.Style := fs;
     SelAttributes.Color := cl;
   end;
 end;

begin
 Sel := EmptySel;
 with RichEdit1, Sel do
 begin
   if WindowFromPoint(Mouse.CursorPos) = Handle then
   begin
     P := RichEdit1.ScreenToClient(Mouse.CursorPos);

     _SelStart := Perform(EM_CHARFROMPOS, 0, LongInt(@P));
     while (_SelStart > 0) and (not (Text[_SelStart] in BreakChars)) do Dec(_SelStart);
     _SelLength := 1;
     while (_SelStart + _SelLength < GetTextLen) and (not (Text[_SelStart + _SelLength] in BreakChars)) do Inc(_SelLength);
     W := UpperCase(Copy(Text, _SelStart+1, _SelLength-1));
     for i := Low(ReservedWords) to High(ReservedWords) do
       if UpperCase(ReservedWords[i]) = W then
       begin
         _HighLight := (GetAsyncKeyState(VK_CONTROL) and $80000000) <> 0;
         Break;
       end;
   end;

   if (_SelStart <> OldSel._SelStart) or
      (_SelLength <> OldSel._SelLength) or
      (_HighLight <> OldSel._HighLight) then
   begin
     Caret := CaretPos; // ×òîáû ïîòîì ïîñòàâèòü êóðñîð íà ìåñòî
     SetStyle (OldSel, [], clBlack);
     if _HighLight then
     begin
       SetStyle (Sel, [fsUnderline], clBlue);
       Cursor := crHandPoint;
     end
     else
     begin
//        else SetStyle (Sel, [], clBlack);
       Cursor := crDefault;
     end;
     OldSel := Sel;
     CaretPos := Caret; // Ñòàâèì êóðñîð íà ìåñòî, ãäå îí è áûë
   end;
 end;
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.