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

Вниз

Легкий HilightMemo   Найти похожие ветки 

 
Vladimir Kladov   (2005-08-29 15:19) [0]

У меня практически готов облегченный HilightMemo, код на 100К меньше, чем в VMHSyntaxEdit получается, глюков по моим ощущениям тоже меньше (там не не понравилось что: undo/redo глючит, буквы справа в конце каждого токена режутся). Нет у меня unicode, но это как раз несложно переделать если позарез, да и кода у меня всего 1 модуль из < 2000 строк, подцветка сделана событием, компонент городить не надо. Зеркала тоже нет пока, может еще приделаю. Сегодня залью, вместе с версией KOL 2.11.


 
RA ©   (2005-08-29 15:47) [1]

Хорошие новости!


 
thaddy   (2005-08-29 15:51) [2]

Shorter than TOM ( incomplete, I know) interface version (200 lines)?

Great job! tnx!


 
Vladimir Kladov   (2005-08-29 20:34) [3]

Нет все самому довелось сделать, целых 3 для старался. И скорость наверняка все равно выше, чем в том томбе. Раскраска идет при отрисовке, с лёта.

Так я кажись все выложил, жду баг-репортов, недовольных свистов, и т.д. Кстати, люди, я вернулся на Delphi5, и чувствую себя намного лучше. Он просто летает...


 
thaddy   (2005-08-29 20:42) [4]

I am impressed! this was the first thing I tried.
Extremely usefull!
D5? my favorite still D4 ( because I have a full license to D4 and only pro level for D5). It flies, even under new Vista beta.


 
ECM ©   (2005-08-29 22:11) [5]

>Так я кажись все выложил, жду баг-репортов, недовольных свистов, и т.д.
Щас...
Навскидку: Опять остался неисправленным MCKfakeClasses.inc
(KOL 2.10 -> kolmck210to211.upd)
Ерунда конечно, но опять будет куча вопросов, что не собирается основной пакет MCK...:(


 
thaddy   (2005-08-29 22:19) [6]

I agree, to a certain extend.
This can indeed be solved easily.
But remember, most new users are too lazy to read *any* code. It seems to me that users who can write *without* mck and use the mck have less problems. It seems that users who only use the mck are causing problems.
I suggest a hidden directive:
{$READ_DOCS_FAQ_AND_COMMENTS} that is hidden somewhere in an include file and only switched on on first installation ;)

then:

{$INFNDEF $READ_DOCS_FAQ_AND_COMMENTS}
{$DEFINE GET_EDUCATION_FIRST}
{$ENDIF}


 
miek ©   (2005-08-30 10:24) [7]

>Кстати, люди, я вернулся на Delphi5, и чувствую себя намного лучше. Он просто летает...

Есть какие-нибудь важные фичи в D6, которых не в В5? По-моему, встроенный ассемблер там хуже, а это плохо.


 
thaddy   (2005-08-30 14:50) [8]

Use uneven numbers. except for 2 wich was good: D1,2,3,5,7...
Never use 4 or 6 or 8 (Although my favorite is still 4, for legal reasons and speed)


 
Vladimir Kladov   (2005-08-30 16:08) [9]

Ну багов (мелких) я уже нашел парочку. Сегодня положу версию, вот только автокомплешн доделаю для него.


 
Vladimir Kladov   (2005-08-30 16:13) [10]

Мне тоже был нужен MMX когда я уходил на D6 а потом на D7. Но теперь мне это не надо, у меня свой PCAsm, он компилит на лету, понимает MMX, макросы, и все то, без чего асм просто не нужен. Ущербным и недоделанным BASM"ом пользоваться я в своих проектах перестал. Я еще и от Opera8 хочу отказаться. Вот тормоза наделали. Буду искать дистриб какой-нибудь 5-й оперы, мож завалялся где на старых дисках...


 
homm   (2005-08-30 18:07) [11]

Opera 8 рулит :)


 
homm   (2005-08-30 18:10) [12]

Кстати, владимир как часто вы читаете почту. Два дня назад я послал интересное решение прорисовки для GradientPanel, но нечего не услышал в ответ, если вы не получили письма, дайте знать тут. Я изложу суть.


 
Vladimir Kladov   (2005-08-30 21:15) [13]

я то читаю, но до меня ее фильтруют несколько спам-фильтров, и окончательно когда мне высвечивается несколько заголовков, я отмечаю для прочтения только те, в которых нормальная тема. Ну вот скажите, что вы в теме сообщения написали? По-русски просьба не писать в теме, если пользуетесь аутглюком. Он похоже не знает что русский язык в заголовке должен кодироваться в КОИ-8. Пишите тему по английски. И лучше, чтобы там сразу было KOL или MCK, тоже английскими буквами.


 
homm   (2005-08-30 21:20) [14]

тема первого - WndProcGradient improvement from "homm"
тема второго - WndProcGradient improvement from "homm" part 2

Нужно еще рас переслать?


 
Vladimir Kladov   (2005-08-30 21:21) [15]

Новая версия HilightMemo выложена, и уже с автокомплешн и исправлением кучи мелких багов. Если чего найдете, пишите сразу на мыло, или сюда, я не возражаю, я - лицо заинтересованное, мне надо, чтобы он праильно работал, в моем проекте.


 
Vladimir Kladov   (2005-08-30 21:29) [16]

Нет не попадался. Может у вас почтовый адрес или домен в черный список попал? Попробуйте еще раз.


 
homm   (2005-08-30 21:33) [17]

Готово.


 
Vladimir Kladov   (2005-08-30 21:34) [18]

Ничего нету. Ну ладно, до завтра подожду. Пока.


 
homm   (2005-08-30 22:10) [19]

Предлагаю тогда текстовой вариант

http://www.homm86.harod.ru/latters.zip


 
Vladimir Kladov   (2005-08-31 22:40) [20]

сейчас неспешно выкладывается новая версия hilightMemo. Баги подчищены, скорость улучшена (работа с большим текстом и автокомплешн, удаление большого выделения). Сейчас вроде пашет, но от нареканий не откажусь.

2 письма от homm я утром видел в списке приемки, и даже поставил крыжик на приемку (перепутать было невозможно, в списке только они 2 и были, то ли спамеры прошлой ночью спали). После чего письма эти благополучно исчезли. Куда, не знаю. Наверное они большие были. У меня ограничение на размер письма. Так что буду по ссылке смотреть как время выдастся. А на словах нельзя сообщить, на сколько ( 1) исходного кода 2) результирующего кода ) эти добавки в градиентную панель потянут? А то может не стоит загружать?


 
homm   (2005-09-02 18:34) [21]

Показывать все заголовки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


 
homm   (2005-09-02 18:35) [22]

Показывать все заголовки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:36) [23]

результирующий код увеличивается на 400 байт, но этос добпвлением 2-х заливок (это по последней версии)


 
Vladimir Kladov   (2005-09-02 19:57) [24]

Нет скорость меня не интересовала. Имеется существенное различие в том, как обрабатывается halftone в 9х и NT+. В итоге в разрешении 64К цветов получаем несколько полос, с явными границами между ними. А вы пробовали свой вариант в разрешении 64К цветов? Что-то меня смущает, что используется pf24bit. Во многих случаях винде нужны дополнительные усилия, чтобы превратить этот формат в то, что реально имеется. Ни одна новая видеокарта не использует 24 бита в качестве родного разрешения, либо 32, либо 16 бит. Следовательно, нужно преобразование.


 
homm   (2005-09-02 20:39) [25]

Владимир, я естественно пробовал в 16 битах, если бы я не понял того, что вы написали с самого начала, то предложил бы срезать ветвь с NT. pf24bit вас смущает, и вы беспокоитесь об "дополнительных усилиях", притом что прежний вариант работает реально в 11 раз медленее.


 
homm   (2005-09-02 20:44) [26]

ЗЫ Видео у меня ДжиФорс ЭмИкс 400 на 64 М. Конечно это не "новая видеокарта", но тоже испоьлзует 32 бита. А собственно и не настаиваю на pf24bit, пусть будет 32 ...


 
Vladimir Kladov   (2005-09-02 20:46) [27]

А куда сешить? Он один раз должен отрисоваться и не перерисовываться пока что-нибудь не испортится, например движением чужого окна. Поэтому я иговорю: скорость второстепенна, для KOL важнее размер кода. Корректность тоже нужна, конечно. Если оно одинаково работает на 98 и NT, и не делает полосок, то возьмем ваш вариант. С размером я может похимичу чего-нибудь.


 
homm   (2005-09-02 22:34) [28]

> А куда спешить?

Такой глупости от Вас я не ожидал... А если пользователь может изменять размер окна (Align=Client), или цвет заливки меняется динамически. А прорисовка комбинации GradientStyle=gsRombic и GradientLayout=glTopLeft по вашему тоже не нуждается в ускорении?

ЗЫ Я тут старые темы почитал, не у меня одного проблемы с отправкой Вам писем...


 
Vladimir Kladov   (2005-09-12 19:32) [29]

Маленькое обновление в связи с обнаружением небольшого числа мелких багов.


 
Vladimir Kladov   (2005-09-13 18:40) [30]

еще одно маленькое обновление по сабжу, заодно выложил поправленный MultiClipbrd 1.6 (у ноутбука работают еще кой-какие сообщения, я их не предусматривал - по WM_POWERBROADCAST).


 
Vladimir Kladov   (2005-09-16 19:41) [31]

Обновлены KOLHilightEdit (ctrl+ins), приложения MultiClipBrd (опять выход из гибернации, теперь и на 2000 и на ХР должно работать в том числе на ноутбуках), и Zoomer3 (паролирование и переименование файлов, в том числе групповое по шаблону с автоперенумерацией в позиции #, + фиксы). За выходные соберусь может сделаю обновление.


 
mdw ©   (2005-09-20 10:25) [32]

2 Кладов
ctrl+ins в KOLHilightEdit не работает, его там и нет, собственно. Что-то Владимир напутал это версия недельной давности, хотя пример для OnScanToken и добавил.

Да, вот еще. Глюк, не глюк не знаю, но  во многих редакторах так:
При комбинации Ctrl+левая\правая стрелка каретка прыгает на начало\конец следующего слова.  В KOLHilightEdit, в случае если она стоит на середине слова, то текущее пропускается. И в начале\конце строки тоже останавливать бы ее нужно. Понятно объяснил? Ну в общем поиграйтесь с комбинацией Ctrl+левая\правая стрелка в  KOLHilightEdit и любом редакторе, поймете.


 
mdw ©   (2005-09-20 14:56) [33]

Еще баг.
Если выделить мышкой справа налево строку и увести ее запределы KOLHilightEdit то Х-позиция каретки получается отрицательная и сответственно она (каретка) уходит за пределы KOLHilightEdit. Не смертельно, но смотрится не очень красиво..


 
Grom PE ©   (2006-01-08 15:58) [34]

Здравствуйте.
А HilightMemo давно обновлялся?
В моей версии HilightMemo присутствуют некоторые "неправильности":

1. Если поступить так, как сказал mdw в [33] и нажать <пробел>, то получается смертельно - программа вылетает.
Это исправимо в MouseMove (не помню точно, не могу сейчас проверить) - добавляется if x<0 then x:=0 и if y<0 then y:=0.

2. При отсутствии директивы для фиксированного горизонтального скроллбара и при прогрутке мышкой за вертикальный, около самого низа начинает скакать - горизонтальный то исчезает, то появляется.

3. Не мог бы кто узнать, почему при включенной AutoComplete окошко появляется на 1 миллисекунду и исчезает, то есть не работает?


 
Vladimir Kladov   (2006-01-08 21:56) [35]

23.11.05
У меня автокомплешн работает, я как раз помню, что то обновление его исправляло. Начсет мыши не понял, вроде не падает. Никакой правки в MouseMove нет.


 
Grom PE ©   (2006-01-09 12:03) [36]

Подскажите, где можно скачать последнюю версию. А то, получается, на прошлое жалуюсь.


 
Grom PE ©   (2006-01-15 09:00) [37]

Ладно. Я нашел обновление, а остальное, что нужно было, сделал сам.
Вопросы:

1. Как максимально ускорить подсветку синтаксиса, как нужно писать процедуру подсветки?

2. Как сделать подсветку многострочного комментария оптимальным способом?


 
Vladimir Kladov   (2006-01-15 20:32) [38]

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

2. пометить один раз строки, и повторно не просматривать.


 
Grom PE ©   (2006-01-17 04:34) [39]

1. По-моему вы меня не совсем поняли: я знаю принцип расцветки, раскрашиваю именно по строкам, и она довольно хорошо работает. Но когда окно разворачивается на весь экран, начинает тормозить. Особенно неприятно то, что курсор перестает мигать при прокрутке вверх (давим кл. вверх) и его не видно.

2. Ладно уж.



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

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

Наверх




Память: 0.6 MB
Время: 0.063 c
8-1143532496
kmi
2006-03-28 11:54
2006.11.05
Как сохранить TBitmap в jpg-файл с разрешением 300 dpi


15-1160767066
ProgRAMmer Dimonych
2006-10-13 23:17
2006.11.05
Помогите с задачей, плз


2-1161145836
valcerou
2006-10-18 08:30
2006.11.05
Обработка данных html в Delphi


15-1160653660
Сергей М.
2006-10-12 15:47
2006.11.05
С -> D


15-1160972947
Александр10
2006-10-16 08:29
2006.11.05
Win XP