![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Легкий HilightMemo [Delphi, Windows, KOL]
Vladimir Kladov © (2005-08-29 15:19:00)У меня практически готов облегченный HilightMemo, код на 100К меньше, чем в VMHSyntaxEdit получается, глюков по моим ощущениям тоже меньше (там не не понравилось что: undo/redo глючит, буквы справа в конце каждого токена режутся). Нет у меня unicode, но это как раз несложно переделать если позарез, да и кода у меня всего 1 модуль из < 2000 строк, подцветка сделана событием, компонент городить не надо. Зеркала тоже нет пока, может еще приделаю. Сегодня залью, вместе с версией KOL 2.11.
Grom PE (2006-01-17 04:34:00) [1]1. По-моему вы меня не совсем поняли: я знаю принцип расцветки, раскрашиваю именно по строкам, и она довольно хорошо работает. Но когда окно разворачивается на весь экран, начинает тормозить. Особенно неприятно то, что курсор перестает мигать при прокрутке вверх (давим кл. вверх) и его не видно.
2. Ладно уж.
Vladimir Kladov (2006-01-15 20:32:00) [2]1. подсветка работает построчно в момент рисования строки. Просто не надо весь файл просматривать, чтобы строку нарисовать. Пример есть.
2. пометить один раз строки, и повторно не просматривать.
Grom PE (2006-01-15 09:00:00) [3]Ладно. Я нашел обновление, а остальное, что нужно было, сделал сам.
Вопросы:
1. Как максимально ускорить подсветку синтаксиса, как нужнописать процедуру подсветки?
2. Как сделать подсветку многострочного комментария оптимальным способом?
Grom PE (2006-01-09 12:03:00) [4]Подскажите, где можно скачать последнюю версию. А то, получается, на прошлое жалуюсь.
Vladimir Kladov (2006-01-08 21:56:00) [5]23.11.05
У меня автокомплешн работает, я как раз помню, что то обновление его исправляло. Начсет мыши не понял, вроде не падает. Никакой правки в MouseMove нет.
Grom PE (2006-01-08 15:58:00) [6]Здравствуйте.
А HilightMemo давно обновлялся?
В моей версии HilightMemo присутствуют некоторые "неправильности":
1. Если поступить так, как сказал mdw в [33] и нажать <пробел>, то получается смертельно - программа вылетает.
Это исправимо в MouseMove (не помню точно, не могу сейчас проверить) - добавляетсяif x<0 then x:=0иif y<0 then y:=0.
2. При отсутствии директивы для фиксированного горизонтального скроллбара и при прогрутке мышкой за вертикальный, около самого низа начинает скакать - горизонтальный то исчезает, то появляется.
3. Не мог бы кто узнать, почему при включенной AutoComplete окошко появляется на 1 миллисекунду и исчезает, то есть не работает?
mdw (2005-09-20 14:56:00) [7]Еще баг.
Если выделить мышкой справа налево строку и увести ее запределы KOLHilightEdit то Х-позиция каретки получается отрицательная и сответственно она (каретка) уходит за пределы KOLHilightEdit. Не смертельно, но смотрится не очень красиво..
mdw (2005-09-20 10:25:00) [8]2 Кладов
ctrl+ins в KOLHilightEdit не работает, его там и нет, собственно. Что-то Владимир напутал это версия недельной давности, хотя пример для OnScanToken и добавил.
Да, вот еще. Глюк, не глюк не знаю, но во многих редакторах так:
При комбинации Ctrl+левая\правая стрелка каретка прыгает на начало\конец следующего слова. В KOLHilightEdit, в случае если она стоит на середине слова, то текущее пропускается. И в начале\конце строки тоже останавливать бы ее нужно. Понятно объяснил? Ну в общем поиграйтесь с комбинацией Ctrl+левая\правая стрелка в KOLHilightEdit и любом редакторе, поймете.
Vladimir Kladov (2005-09-16 19:41:00) [9]Обновлены KOLHilightEdit (ctrl+ins), приложения MultiClipBrd (опять выход из гибернации, теперь и на 2000 и на ХР должно работать в том числе на ноутбуках), и Zoomer3 (паролирование и переименование файлов, в том числе групповое по шаблону с автоперенумерацией в позиции #, + фиксы). За выходные соберусь может сделаю обновление.
Vladimir Kladov (2005-09-13 18:40:00) [10]еще одно маленькое обновление по сабжу, заодно выложил поправленный MultiClipbrd 1.6 (у ноутбука работают еще кой-какие сообщения, я их не предусматривал - по WM_POWERBROADCAST).
Vladimir Kladov (2005-09-12 19:32:00) [11]Маленькое обновление в связи с обнаружением небольшого числа мелких багов.
homm (2005-09-02 22:34:00) [12]> А куда спешить?
Такой глупости от Вас я не ожидал... А если пользователь может изменять размер окна (Align=Client), или цвет заливки меняется динамически. А прорисовка комбинации GradientStyle=gsRombic и GradientLayout=glTopLeft по вашему тоже не нуждается в ускорении?
ЗЫ Я тут старые темы почитал, не у меня одного проблемы с отправкой Вам писем...
Vladimir Kladov (2005-09-02 20:46:00) [13]А куда сешить? Он один раз должен отрисоваться и не перерисовываться пока что-нибудь не испортится, например движением чужого окна. Поэтому я иговорю: скорость второстепенна, для KOL важнее размер кода. Корректность тоже нужна, конечно. Если оно одинаково работает на 98 и NT, и не делает полосок, то возьмем ваш вариант. С размером я может похимичу чего-нибудь.
homm (2005-09-02 20:44:00) [14]ЗЫ Видео у меня ДжиФорс ЭмИкс 400 на 64 М. Конечно это не "новая видеокарта", но тоже испоьлзует 32 бита. А собственно и не настаиваю на pf24bit, пусть будет 32 ...
homm (2005-09-02 20:39:00) [15]Владимир, я естественно пробовал в 16 битах, если бы я не понял того, что вы написали с самого начала, то предложил бы срезать ветвь с NT. pf24bit вас смущает, и вы беспокоитесь об "дополнительных усилиях", притом что прежний вариант работает реально в 11 раз медленее.
Vladimir Kladov (2005-09-02 19:57:00) [16]Нет скорость меня не интересовала. Имеется существенное различие в том, как обрабатывается halftone в 9х и NT+. В итоге в разрешении 64К цветов получаем несколько полос, с явными границами между ними. А вы пробовали свой вариант в разрешении 64К цветов? Что-то меня смущает, что используется pf24bit. Во многих случаях винде нужны дополнительные усилия, чтобы превратить этот формат в то, что реально имеется. Ни одна новая видеокарта не использует 24 бита в качестве родного разрешения, либо 32, либо 16 бит. Следовательно, нужно преобразование.
homm (2005-09-02 18:36:00) [17]результирующий код увеличивается на 400 байт, но этос добпвлением 2-х заливок (это по последней версии)
homm (2005-09-02 18:35:00) [18]Показывать все заголовкиDate: Mon, 29 Aug 2005 20:01:40 +0600
From: aLeXandr <homm86@mail.ru>
To: bonanzas@online.sinor.ru
Subject: WndProcGradient improvement from "homm" part 2
Владимир, я все по поводу темы вчерашнего письма. Для чего вообще было разделение в
функции WndProcGradient на 9х и NT системы? Для увеличения быстродействия в 9х. Поправте
если я не прав. Я увеличил скорость прорисовки на NT системах, и теперь она не уступает от
скорости прорисовки в 9х. Вывод - долой это теперь не нужное ветвление.
Кроме того, тем же методом запросто реализуются еще две заливки. Из верхнего левого угла в
противоположный и из верхнего правого угла в противоположный. Предлогаемый мной сегодня
вариант отрисовки работает в 49 (сорок девять!) раз быстрее, чем практически не
отличающееся по расположению цвета ( при условии хотя бы примерного сохранения соотношения
сторон 1:1) и значительно хуже выглядящей в 16 битах комбинации свойств:
GradientStyle=gsRombic и GradientLayout=glTopLeft.
Кстати тут еще баг в MCK. Если GradientLayout отличен от glTop, то создается
GradientPanelEx с GradientStyle=gsHorizontal если в дезвйнере выставлен gsVertical.
TGradientStyle = ( gsVertical, gsHorizontal, gsRectangle, gsElliptic, gsRombic,
gsTopToBottom, gsBottomToTop );
. . .
. . .
. . .
function WndProcGradient( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
var PaintStruct: TPaintStruct;
Bmp: PBitmap;
CR: TRect;
I: Integer;
R, G, B: Integer;
R1, G1, B1: Integer;
C: TColor;
W, H, WH: Integer;
OldPaintDC: HDC;
Pattern: PBitmap;
pdc: HDC;
pw: integer;
begin
case Msg.message of
WM_PAINT, WM_PRINTCLIENT:
begin
result := false;
CR := Self_.ClientRect;
case Self_.fGradientStyle of
gsHorizontal: begin
W := CR.Right;
H := 1;
WH := W;
pw := 32;
end;
gsVertical: begin
W := 1;
H := CR.Bottom;
WH := H;
pw := 32
end;
gsTopToBottom,
gsBottomToTop: begin
W := CR.Bottom + CR.Right;
H := 1;
WH := W;
pw := 1 + (CR.Bottom div 16);
if pw > 6 then
pw := 6;
end;
else exit; // <-- impartant if user change GradientStyle to not supported
by this object
end;
OldPaintDC := Self_.fPaintDC;
Self_.fPaintDC := Msg.wParam;
if Self_.fPaintDC = 0 then
Self_.fPaintDC := BeginPaint( Self_.fHandle, PaintStruct );
Bmp := NewDIBBitmap( W, H, pf24bit );
C := Color2RGB( Self_.fColor1 );
R := C shr 16;
G := (C shr 8) and $FF;
B := C and $FF;
C := Color2RGB( Self_.fColor2 );
R1 := C shr 16;
G1 := (C shr 8) and $FF;
B1 := C and $FF;
for I := 0 to WH-1 do begin
C := (( R + (R1 - R) * I div WH ) shl 16) or
(( G + (G1 - G) * I div WH ) shl 8) or
( B + (B1 - B) * I div WH );
if Self_.fGradientStyle = gsVertical then
Bmp.DIBPixels[ 0, I ] := C
else
Bmp.DIBPixels[ I, 0 ] := C;
end;
if Self_.fGradientStyle = gsVertical then
Pattern := NewBitMap(pw, H)
else
Pattern := NewBitMap(W, pw);
pdc := Pattern.Canvas.Handle;
SetStretchBltMode( pdc, HALFTONE);
SetBrushOrgEx( pdc, 0, 0, nil );
StretchBlt( pdc, 0, 0, Pattern.Width, Pattern.Height, Bmp.Canvas.Handle,
0, 0, W, H, SRCCOPY );
case Self_.fGradientStyle of
gsHorizontal: for i := 0 to (CR.Bottom div pw) do
Pattern.Draw(Self_.fPaintDC, 0, i*pw);
gsVertical: for i := 0 to (CR.Right div pw) do
Pattern.Draw(Self_.fPaintDC, i*pw, 0);
gsTopToBottom: for i := 0 to ((CR.Bottom + pw -1) div pw)-1 do
Pattern.Draw(Self_.fPaintDC, -i*pw, i*pw);
gsBottomToTop: for i := 0 to ((CR.Bottom + pw -1) div pw)-1 do
Pattern.Draw(Self_.fPaintDC, -CR.Bottom + i*pw, i*pw);
end;
Bmp.Free;
Pattern.Free;
if Msg.wParam = 0 then
EndPaint( Self_.fHandle, PaintStruct );
Self_.fPaintDC := OldPaintDC;
Rslt := 0;
Result := True;
Exit;
end;
end;
Result := False;
end;
ЗЫ Чуть не забыл во вложении пример всего этого.
--
____________________________________________________________
С уважением,
Карпинский Александр | mailto:homm86@mail.ru
homm (2005-09-02 18:34:00) [19]Показывать все заголовкиDate: Sun, 28 Aug 2005 21:00:59 +0600
To: bonanzas@online.sinor.ru
Subject: WndProcGradient improvement from "homm"
From: aLeXandr <homm86@mail.ru>
Владимир, я предлагаю при отрисовке WM_PAINT для GradienPanel использовать временное
хранилище для небольшой полосы правильно растянутого изображения для NT систем. Вот пример:
function WndProcGradient( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
var PaintStruct: TPaintStruct;
Bmp: PBitmap;
CR: TRect;
I: Integer;
R, G, B: Integer;
R1, G1, B1: Integer;
C: TColor;
W, H, WH: Integer;
W9x: Boolean;
Br: HBrush;
//Save: Integer;
OldPaintDC: HDC;
Pattern: PBitmap;
pdc: HDC;
const pw = 32;
begin
case Msg.message of
WM_PAINT, WM_PRINTCLIENT:
begin
OldPaintDC := Self_.fPaintDC;
Self_.fPaintDC := Msg.wParam;
if Self_.fPaintDC = 0 then
Self_.fPaintDC := BeginPaint( Self_.fHandle, PaintStruct );
CR := Self_.ClientRect;
W9x := WinVer < wvNT;
W := 1;
H := CR.Bottom;
WH := H;
Bmp := nil;
if Self_.fGradientStyle = gsHorizontal then
begin
W := CR.Right;
H := 1;
WH := W;
end;
if not W9x then begin
Bmp := NewDIBBitmap( W, H, pf32bit );
if Self_.fGradientStyle = gsVertical then
Pattern := NewBitMap(pw, H)
else
Pattern := NewBitMap(W, pw);
end;
C := Color2RGB( Self_.fColor1 );
R := C shr 16;
G := (C shr 8) and $FF;
B := C and $FF;
C := Color2RGB( Self_.fColor2 );
R1 := C shr 16;
G1 := (C shr 8) and $FF;
B1 := C and $FF;
for I := 0 to WH-1 do
begin
C := ((( R + (R1 - R) * I div WH ) and $FF) shl 16) or
((( G + (G1 - G) * I div WH ) and $FF) shl 8) or
( B + (B1 - B) * I div WH ) and $FF;
if W9x then
begin
if Self_.fGradientStyle = gsVertical then
CR.Bottom := CR.Top + 1
else
CR.Right := CR.Left + 1;
Br := CreateSolidBrush( C );
Windows.FillRect( Self_.fPaintDC, CR, Br );
DeleteObject( Br );
if Self_.fGradientStyle = gsVertical then
Inc( CR.Top )
else
Inc( CR.Left );
end
else
begin
if Self_.fGradientStyle = gsVertical then
Bmp.DIBPixels[ 0, I ] := C
else
Bmp.DIBPixels[ I, 0 ] := C;
end;
end;
if not W9x then
begin
pdc := Pattern.Canvas.Handle;
SetStretchBltMode( pdc, HALFTONE);
SetBrushOrgEx( pdc, 0, 0, nil );
StretchBlt( pdc, 0, 0, Pattern.Width, Pattern.Height, Bmp.Canvas.Handle,
0, 0, W, H, SRCCOPY );
if Self_.fGradientStyle = gsHorizontal then begin
for i := 0 to (CR.Bottom div pw) do
Pattern.Draw(Self_.fPaintDC, 0, i*pw)
end else begin
for i := 0 to (CR.Right div pw) do
Pattern.Draw(Self_.fPaintDC, i*pw, 0);
end;
Bmp.Free;
Pattern.Free;
end;
if Msg.wParam = 0 then
EndPaint( Self_.fHandle, PaintStruct );
Self_.fPaintDC := OldPaintDC;
Rslt := 0;
Result := True;
Exit;
end;
end;
Result := False;
end;
К сожалению код становится длинее почти на 512 байт, но скорость отрисовки на моем уже не
молодом Celeron 563 увеличилась в 11,5 раз! как для 16, так и для 32 бит, а визуально
разница видна только под лупой.
--
____________________________________________________________
С уважением,
Карпинский Александр | mailto:homm86@mail.ru
Vladimir Kladov (2005-08-31 22:40:00) [20]сейчас неспешно выкладывается новая версия hilightMemo. Баги подчищены, скорость улучшена (работа с большим текстом и автокомплешн, удаление большого выделения). Сейчас вроде пашет, но от нареканий не откажусь.
2 письма от homm я утром видел в списке приемки, и даже поставил крыжик на приемку (перепутать было невозможно, в списке только они 2 и были, то ли спамеры прошлой ночью спали). После чего письма эти благополучно исчезли. Куда, не знаю. Наверное они большие были. У меня ограничение на размер письма. Так что буду по ссылке смотреть как время выдастся. А на словах нельзя сообщить, на сколько ( 1) исходного кода 2) результирующего кода ) эти добавки в градиентную панель потянут? А то может не стоит загружать?