Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];

Вниз

TRichEdit Подавление мерцания?   Найти похожие ветки 

 
Flex   (2003-05-27 13:21) [0]

Сталкнулся с проблемой мерцания с TRichEdit. При быстром вводе с клавиатуры, строка иногда начинает мерцать, потом вроде нет, а потом снова мерцает.

Нашел один интересный вариант решения этой проблемы.

В классе TCustomRichEdit модуля ComCtrls изменяете код

procedure TCustomRichEdit.WMPaint(var Message: TWMPaint);
var
R, R1: TRect;
begin
if GetUpdateRect(Handle, R, True) then
begin
with ClientRect do R1 := Rect(Right - 3, Top, Right, Bottom);
if IntersectRect(R, R, R1) then InvalidateRect(Handle, @R1, True);
end;
if Painting then
Invalidate
else begin
Painting := True;
try
inherited;
finally
Painting := False;
end;
end;
end;


на

procedure TCustomRichEdit.WMPaint(var Message: TWMPaint);
begin

inherited

end;


И всё. При быстром вводе текста с клавиатуры перестает мерцать TRichEdit.

Я подозреваю, что возникнет проблема с ранними версиями RichEdit
например RICHED20.DLL

Думаю, что код корректно работает только с RICHED32.DLL

Естественно проблему можно решить проверяя версию RICHEDIT при инициализации модуля...

Вот код, который нужно вписать, всё в тот же модуль.

type
TRichEditVersion = 1..3;

var
RichEditVersion: TRichEditVersion;

const
RichEdit10ModuleName = "RICHED32.DLL";
RichEdit20ModuleName = "RICHED20.DLL";

initialization
RichEditVersion := 1;
OldError := SetErrorMode(SEM_NOOPENFILEERRORBOX);
try

FLibHandle := LoadLibrary(RichEdit20ModuleName);
if (FLibHandle > 0) and (FLibHandle < HINSTANCE_ERROR) then
FLibHandle := 0;

if FLibHandle = 0 then
begin
FLibHandle := LoadLibrary(RichEdit10ModuleName);
if (FLibHandle > 0) and (FLibHandle < HINSTANCE_ERROR) then
FLibHandle := 0;
end
else
begin
RichEditVersion := 2;
Ver.dwOSVersionInfoSize := SizeOf(Ver);
GetVersionEx(Ver);
with Ver do
begin
if (dwPlatformId = VER_PLATFORM_WIN32_NT) and
(dwMajorVersion >= 5) then
RichEditVersion := 3;
end;
end;
finally
SetErrorMode(OldError);
end;


Все же у меня вопрос, если используя возможности простого наследования WM_PAIN без всяких перересовок, мы получаем нормальный RichEdit, какого фига это не предусмотренно по умолчанию?

Или этим кодом я вношу какие-то серьезные глюки?


 
ВинХех   (2003-05-27 20:56) [1]

Это лучне в отдельный package пихнуть, а не в ComCtrls.

На счет


> Все же у меня вопрос, если используя возможности простого
> наследования WM_PAIN без всяких перересовок, мы получаем
> нормальный RichEdit, какого фига это не предусмотренно по
> умолчанию?


Не знаю :((



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

Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.009 c
8-26624
Lex.
2003-02-25 21:17
2003.06.09
MP3


1-26548
Пубертанец
2003-05-28 09:24
2003.06.09
Word и Delphi


1-26600
Rise
2003-05-28 16:34
2003.06.09
StringGrid


1-26422
Still Swamp
2003-05-27 14:30
2003.06.09
array


1-26443
anbezr
2003-05-29 10:26
2003.06.09
Получить размер памяти, занятый приложением





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский