Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Легкий HilightMemo [Delphi, Windows, KOL]


Страницы:   1 2

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) результирующего кода ) эти добавки в градиентную панель потянут? А то может не стоит загружать?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо