Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.10;
Скачать: CL | DM;

Вниз

Как у TRichEdit убрать выделение?   Найти похожие ветки 

 
Всеволод Соловьёв ©   (2003-06-28 23:11) [0]

При подсвечивании слов (симвлов/строк етц) в ричэдите приходится изменять SelStart, SelLength, а потом SelAttributes. Но при изменении SelStart и SelLength перескакивает курсор с одного места на другое и изменяется выделение. Но это выделение некрасиво и очень раздражает. Решено было убрать. Были перепробованы методы:
1) Rich.HideSelection := True;
2) API-шная HideCaret(Rich.Handle);
3) Пробовал даже делать еще один компонент (ран-тайм, Parent := nil, чтоб не видно было), присваивать RichDynamic := Rich; делать все манипуляции, а потом обратно присваивать. Но получается, что сам компонент один, но два на него указателя. Скопировать не получиловь. Assign ругается на невозможность преобразования TRichEdit в TRichEdit (В справке точно то же написано).
4) Ползание по исходному коду понимания дела не дало. В справке не было найдено. В различных ФАКах и поиском тоже не было найдено.
Я вижу два пути решения:
I. Должен же где-то RichEdit хранить форматирование каждого символа? При ползании по сорцу его я не нашел такого. Там все сводится к message"ам.
II. Как-нибудь приостановить отрисовывание ричэдита на момент выполнения процедуры.
Подскажите, как пройти по любому из этих путей. Прохождение обоих и помощь листингами (особенно с комментариями) оскорблением не считается :)


 
Songq   (2003-06-28 23:15) [1]

По II: TRichEdit.Lines.BeginUpdate/EndUpdate
А также LockWindowUpdate()


 
jack128 ©   (2003-06-28 23:17) [2]


> Там все сводится к message"ам.

так и есть. RichEdit винда сама реализововает

По второму пункту

LockWindowUpdate(RichEdit1.Handle);
// Форматируй текст
LockWindowUpdate(0);



 
Всеволод Соловьёв ©   (2003-06-28 23:21) [3]

Все! спасибо, помогло LockWindowUpdate(RichEd.Handle);
Покорнейше благодарю :)
То что ричэдит сама винда реализовывает это я сразу понял, как только в хелп залез и на иерархию посмотрел: происходит от WinControl :)


 
Всеволод Соловьёв ©   (2003-06-28 23:23) [4]

2Song
>TRichEdit.Lines.BeginUpdate/EndUpdate
Может я неправльно делал, но это у меня вызывало Access Violation


 
Novice ©   (2003-06-28 23:28) [5]

У Sha © :) есть компонент TLogger - наследник TRichEdit.
Там сделано так:

function TLogger.LogLinesBeginUpdate: integer;
begin;
Result:=Perform(EM_SETEVENTMASK, 0, 0);
Perform(WM_SETREDRAW, 0, 0);
end;

procedure TLogger.LogLinesEndUpdate(EventMask: integer);
begin;
Perform(WM_SETREDRAW, 1, 0);
InvalidateRect(Handle, nil, true);
Perform(EM_SETEVENTMASK, 0, EventMask);
end;


А между вызовом этих функций изменяй цвета и все такое.


 
Всеволод Соловьёв ©   (2003-06-29 12:07) [6]

Novice © (28.06.03 23:28)
да уже все сделано... LockWindowUpdate.
разбираюсь щас с исходником, может сделаю компонент-наследник, в котором можно будет получить доступ к форматированию каждой буквы отдельно (через массив).


 
Просто прохожий ©   (2003-06-29 12:46) [7]

Всеволод Соловьёв © (29.06.03 12:07)
Плюс предложенного метода заключается в том, что он отключает не только отрисовку, но и нотификацию. Это самый быстрый, известный
мне, вариант обновления RichEdita.


 
Всеволод Соловьёв ©   (2003-06-29 12:51) [8]

Ну хорошо, но что именно вставлять на место EventMask?
procedure TLogger.LogLinesEndUpdate(EventMask: integer);
begin;
Perform(WM_SETREDRAW, 1, 0);
InvalidateRect(Handle, nil, true);
Perform(EM_SETEVENTMASK, 0, EventMask);
end;


 
Просто прохожий ©   (2003-06-29 16:42) [9]

Результат от первой функции передавай во вторую процедуру.



Страницы: 1 вся ветка

Текущий архив: 2003.07.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
7-31553
CJC
2003-04-26 23:04
2003.07.10
Тест ОЗУ-ПЗУ-CPU


1-31301
Sergei Nevazhnyi
2003-06-25 18:03
2003.07.10
Работа с canvas в D7


14-31399
II
2003-06-24 13:03
2003.07.10
Кто нибуть знаком с математикой оптимизации рецептов комбикормов?


8-31370
lexa
2003-03-23 17:58
2003.07.10
Как заставить MediaPlayer играть mp3


14-31493
leonidus
2003-06-07 13:40
2003.07.10
Запуск моей программы из контекстного меню IE, как в ReGet`е