Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
ВнизКак у 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c