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

Вниз

Версия 2.80   Найти похожие ветки 

 
Vladimir Kladov ©   (2007-09-19 20:13) [0]

Новости от 19 сентября 2007 (KOL & MCK v2.80)

[*] Добавлена и установлена в качестве нового обработчика по умолчанию
процедура  прозрачности,  разработанная  Александром Карпинским a.k.a.
homm.  По сравнению с прежней процедурой (доступной включением символа
OLD_TRANSPARENT)   добавляет   лишь   около   60  байт,  но  при  этом
эффективнее,   т.к   значительно   уменьшает   количество   прорисовок
контролов.

[*] Процедура выравнивания контролов на форме по умолчанию выполняется
новым  вариантом,  разработанным  Александром  Карпинским a.k.a. homm.
Прежняя  процедура доступна с использованием символа OLD_ALIGN. (Новая
процедура  более  эффективна,  приводит  к  меньшему  числу  изменений
размеров контролов).

[*] С новым символом TLIST_FAST существенно изменяется алгоритм работы
и  размещения  в  памяти  элементов  базового  списка. В этом варианте
оптимизируется   работа  с  большими  списками,  в  основном  за  счёт
уменьшения   количества   перераспределений   памяти   и  последующего
уменьшения  дефрагментации кучи. Но этот алгоритм требует больше кода,
и может оказаться неоптимальным по скорости для каких-либо применений.
Для TList добавлено свойство ItemAddress.

[*]  С  новым  символом  SNAPMOUSE2DFLTBTN  алгоритм  процедур MsgBox,
ShowMsg,   ShowMessage  изменяется  таким  образом,  чтобы  обеспечить
автоматическую  установку курсора мыши на кнопку по умолчанию - если в
системе   выставлена  такая  опция  для  мыши.  Аналогично,  изменения
работают для ShowQuestion / ShowQuestionEx (из KOLadd).

[-]  Исправлена работа стандартного OpenDirDlg при назначенном событии
OnSelChanged для Windows95 (не становилась доступной кнопка OK), и для
UNICODE_CTRLS с этим же событием исправлены типы данных.

[+] Добавлены средства для упрощения разработки кнопок с произвольными
дочерними  элементами  (для  помещения  на  кнопки, например, картинок
вместе с текстом):
-  в  MCK  для  всех  контролов  добавлено свойство времени разработки
AcceptChildren.  Включение  его  в  TRUE позволяет во время разработки
положить на этот контрол дочерние элементы.
-  в  KOL  добавлена  функция,  а  в  MCK  -  соответствующее свойство
MouseTransparent,  использование  которого для контрола перенаправляет
все сообщения мыши к родительскому (или лежащему слоем ниже) контролу.
-  в  KOL объект TImageShow для вывода изображения использует свойства
ClientLeft,  ClientTop  для  смещения  изображения  при  выводе (в MCK
соответствующие   свойства  MarinLeft  и  MarginTop  опубликованы  для
зеркала TKOLImageShow).
- в MCK для кнопки опубликовано свойство Border.

[*] Файл visual_xp_styles.inc изменён автором, MTsvDN:
1. Отрисовка всех элементов (точнее, заднего фона для каждого элемента).
2. Исправлено создание шрифта.
3. Исправлена прорисовка границ панели.
4. Исправлен 2ой клик на сплиттере.
5. Оптимизирован код, за счет этого размер уменьшился на 3кБ.
6. Добавлена обработка TextAlign для GroupBox.
7. Исправлена работа с UNICODE и ANSI.
8. Маленькое исправление для радиобокса.
9. Отрисовка сплиттера приближена к стандартному.

[*]  Для memory stream при прямой установке Size по умолчанию значение
не   округляется   теперь  в  большую  сторону  до  очередной  границы
CapacityMask, а используется как есть. Прежнее поведение можно вернуть
символом OLD_MEMSTREAMS_SETSIZE.

[-]  Работа  свойств  AnchorXXXX  исправлена  для нового варианта кода
(оставлен  по  умолчанию, и прежний вариант так же доступен с символом
ANCHORS_WM_SIZE) .

[-]  Исправлена ошибка в обработчике сообщения WM_WINDOWPOSCHANGED для
toolbar-контрола  (возвращалось  true  вместо  false).  Эта  ошибка не
давала правильно выравнивать дочерние контролы на тулбаре.

[-]   По   совету   MTsvDN,  в  процедуре  WndProc_RichEdTransp_Update
добавлена  обработка  сообщения  WM_CHAR,  что предотвращает появление
"следов"  от  каретки  во  время  печатанья  в  прозрачном  rich edit-
контроле.

[-]  Исправлена  ошибка  с  невозможностью  компиляции  асм-версии при
наличии символа USE_DROPDOWNCOUNT.

[*]  MCK  Свойство  FixFlatXP  для  тулбара  реализовано более дешёвым
средством,  не  требующим  включения  прозрачности: установкой пустого
обработчика  события  OnTBCustomDraw, введённым несколько ранее. Как и
прежде,  FixFlatXP  предназначено  для  устранения  черного  фона  при
включённым  темах  и подключённом манифесте, для "плоских" тулбаров (с
опцией tboFlat).

[-] В генераторе кода MCK исправлена опечатка MCKControls -> MCKCtrls.

[*] Существенно переработан компонент KOLPng:
-  добавлена  возможность  загрузки  1/8, 1/4 или 1/2 изображения, что
может   существенно   сократить   время   построения  мини-эскиза  для
interlaced-изображений  (для  не-interlaced  эффект  менее  заметен, и
некоторое   ускорение   обнаруживается   только   для   очень  больших
изображений, за счёт меньшего потребления памяти);
- выполнена оптимизация некоторых критичных участков, с использованием
ассемблера, в том числе MMX.


 
homm ©   (2007-09-19 22:12) [1]

> [0] Vladimir Kladov ©   (19.09.07 20:13)
> [*] Процедура выравнивания контролов на форме по умолчанию
> выполняется
> новым  вариантом,  разработанным  Александром  Карпинским
> a.k.a. homm.

Владимир, вы что-то путаете :) Это не я.


 
homm ©   (2007-09-19 22:15) [2]

> [0] Vladimir Kladov ©   (19.09.07 20:13)
> [-]   По   совету   MTsvDN,  в  процедуре  WndProc_RichEdTransp_Update
> добавлена  обработка  сообщения  WM_CHAR

А вот это мое :)


 
Jon ©   (2007-09-19 23:44) [3]

MCK v2.80 package (http://kolmck.net/mck.zip) contains an old version of err.pas :o


 
exero ©   (2007-09-20 11:34) [4]

1. Не работает Transparent - если GRAPHCTL_XPSTYLES и подключен манифест (на форму кинул граш панель - на нее обычную панельку у нее Transparent = True).
2. Если решать проблему с прозрачным RichEdit"ом - то след каретки остается еще и в случае если ее положение менять с помощью клика мыши.


 
exeron   (2007-09-20 11:44) [5]

3. Тулбар не прозрачен, если подключен манифест.


 
exero ©   (2007-09-20 12:19) [6]

Кстати, все забываю отписать:
в KOLGrushControls.pas подправить функцию WndProcGRush:
.............
       WM_SETTEXT:
           begin
           PGRushControl(Ctl_).SetAllNeedUpdate;
---->>   Ctl_.Invalidate; <<-------------- Добавить эту строку
           end;


 
mdw ©   (2007-09-20 12:35) [7]

Владимир, вы поправили в:
Так же  непонял в KOL.pas в
{$ELSE newcode}
procedure ComboboxDropDown( Sender: PObj );
....
//DropDownCount := CB.DropDownCount;
DropDownCount := 8;
...
Но тогда теряется смысл использовать DropDownCount - по любому, всегда = 8. Может наоборот?:
...
DropDownCount := CB.DropDownCount;
//DropDownCount := 8;
..


 
mdw ©   (2007-09-20 12:36) [8]


> Так же  непонял в KOL.pas в

- не читать. Не заметил когда редактировал...:)


 
mdw ©   (2007-09-20 12:59) [9]

PAS_VERSION
procedure ApplyImageLists2ListView( Sender: PControl );
...
 Sender.Style := Sender.Style and not $4FFC
                 or Flags or ListViewStyles[ Sender.fLVStyle ];
нужно поменять $4FFC на $403F, как и в ASM_VERSION:

 Sender.Style := Sender.Style and not $403F
                 or Flags or ListViewStyles[ Sender.fLVStyle ];

Иначе, при переключении LVStyle, с lvsList переключиться на другой нельзя.


 
MTsv DN ©   (2007-09-20 15:52) [10]

Привет...

> 1. Не работает Transparent - если GRAPHCTL_XPSTYLES и подключен манифест (на форму кинул граш панель - на нее обычную панельку у нее Transparent = True).
Просмотрел... Используй пока edgeStyle := esTransparent

> 3. Тулбар не прозрачен, если подключен манифест.
А у меня прозрачен... Тем более, что я ничего по поводу ToolBar"а не делал...


 
MTsv DN ©   (2007-09-20 15:58) [11]

> Просмотрел... Используй пока edgeStyle := esTransparent
Или замени в visual_xp_styles.inc:
if Sender.fedgeStyle <> esTransparent then
на
if (Sender.fedgeStyle = esTransparent) or (Sender.fTransparent) then else


 
exero ©   (2007-09-20 18:46) [12]

>Или замени в visual_xp_styles.inc...
Спасибо, именно так и поступлю.

> 3. Тулбар не прозрачен, если подключен манифест.
>А у меня прозрачен... Тем более, что я ничего по поводу ToolBar"а не >делал...
У меня был непрозрачен вне зависимости от GRAPHCTL_XPSTYLES. Завтра выложу тестовый проектик где это проявлялось - сейчас под рукой delphi нет.


 
Sapersky   (2007-09-20 19:29) [13]

Относительно переписывания на asm вообще и KOLPng в частности. Попробуйте вот такой вариант PaethPredictor/FilterRow:

function PaethPredictor(a, b, c: Integer): Integer;
var
 pa, pb, pc: Integer;
begin
 { a = left, b = above, c = upper left }
 pa := System.abs(b - c);      { distances to a, b, c }
 pb := System.abs(a - c);
 pc := System.abs(a + b - c * 2);

 { return nearest of a, b, c, breaking ties in order a, b, c }
 if (pa <= pb) and (pa <= pc) then
   Result := a
 else
   if pb <= pc then
     Result := b
   else
     Result := c;
end;

procedure TChunkIDAT.FilterRow;
var
 pp : Byte;
 Offs : Integer;
 Col : DWORD;
 p1, p2 : PByteArray;
begin
 {Test the filter}
 case Row_Buffer[RowUsed]^[0] of
   {No filtering for this line}
   FILTER_NONE: begin end;
   {AND 255 serves only to never let the result be larger than one byte}
   {Sub filter}
   FILTER_SUB: begin // cur = cur + left
     p1 := @Row_Buffer[RowUsed][Offset + 1];
     Offs := -Offset;
     FOR Col := Offset + 1 to Row_Bytes DO begin
       p1[0] := (p1[0] + p1[Offs]) and 255;
       Inc(PByte(p1));
     end;
   end;
   {Up filter}
   FILTER_UP: begin
     p1 := @Row_Buffer[RowUsed][1];
     p2 := @Row_Buffer[not RowUsed][1];
     FOR Col := 1 to Row_Bytes DO begin
       p1[0] := (p1[0] + p2[0]) and 255;
       Inc(PByte(p1)); Inc(PByte(p2));
     end;
   end;
   {Average filter}
   FILTER_AVERAGE: begin
     p1 := @Row_Buffer[RowUsed][1];
     p2 := @Row_Buffer[not RowUsed][1];
     For Col := 0 to Offset-1 do begin
       p1[0] := (p1[0] + p2[0] div 2) and 255;
       Inc(PByte(p1)); Inc(PByte(p2));
     end;
     Offs := -Offset;
     For Col := Offset to Row_Bytes-1 do begin
       p1[0] := (p1[0] + ( p1[Offs] + p2[0] ) div 2) and 255;
//      cur =    (cur +   ( left +     above) div 2) and 255;
       Inc(PByte(p1)); Inc(PByte(p2));
     end;
   end;
   {Paeth filter}
   FILTER_PAETH:
   begin
     {Initialize}
     p1 := @Row_Buffer[RowUsed][1];
     p2 := @Row_Buffer[not RowUsed][1];
     For Col := 0 to Offset-1 do begin
       pp := PaethPredictor(0, p2[0], 0);
       p1[0] := (pp + p1[0]) and 255;
       Inc(PByte(p1)); Inc(PByte(p2));
     end;
     Offs := -Offset;
     For Col := Offset to Row_Bytes-1 do begin
       pp := PaethPredictor(p1[Offs], // left
                            p2[0], // above
                            p2[Offs]); // above-left
       p1[0] := (pp + p1[0]) and 255;
       Inc(PByte(p1)); Inc(PByte(p2));
     end;
   end;

 end {case};
end;


 
Vladimir Kladov ©   (2007-09-20 20:38) [14]

У меня тулбар тоже прозрачный. Ждем пример. Прочее я поправил, но до завтра как нибудь доживем уже, пятница как никак.


 
Vladimir Kladov ©   (2007-09-20 20:52) [15]

Я насчёт paeth-предиктора не совсем понял: имеется в виду что такой вариант быстрее чем на асме? Что-то сомневаюсь я. В любом случа, paeth большой погоды (обычно) не делает. Жаль, что его вообще придумали. Нормальные компрессоры на больших картинках его избегают.


 
homm ©   (2007-09-20 21:31) [16]

> [15] Vladimir Kladov ©   (20.09.07 20:52)
> Жаль, что его вообще придумали.

+1 :)


 
Sapersky   (2007-09-20 23:21) [17]

Там главное не PaethPredictor, который практически аналогичен стандартному, а FilterRow. И таки да, быстрее, до 15% (Cel 2.8).


 
exero ©   (2007-09-21 07:53) [18]

Как и обещал - неработающая прозрачность http://up.spbland.ru/files/07092144/
Как выяснилось манифест в данном случае на прозрачность не влияет.
Должен признать, что это не вполне обычный способ - хотя и ничего особенного в нем нет. В обычном случае проблем действительно не возникает.


 
exero ©   (2007-09-21 07:59) [19]

когда tboFlat = False - то с прозрачностью проблем нет


 
Vladimir Kladov ©   (2007-09-21 14:22) [20]

Насчет paeth. Видите ли в ассемблерном варианте у меня я избавился от лишних if-ов в начале цикла, но немного другим способом. Кроме того, у меня там не делается call для вызова paeth, он встроен внутрь цикла, причем весь на регистрах. Так что мой вариант всяко быстрее вашего, причем наверняка не на несколько процентов.

по прозрачности тулбаров: приду, смотреть буду, что там и как.


 
Vladimir Kladov ©   (2007-09-21 16:06) [21]

Как я и думал. Убираете FixFlatXP, и при отсутствии манифеста - будет прозрачным тулбар. Поставите манифест - станет в стиле XP, но не прозрачным. Если все-таки нужен прозрачный, убираете tboFlat. Но тогда при отключенных темах прозрачность для тулбара останется, а кнопки будут выпуклые в стиле классики.

Если нужен именно GRush, то элементарно решается заменой тулбара панелью с кнопками, что я и проделал в ToGRush.

Собственно, я не понял, при чем тут новая версия KOL, разве аналогичных траблов, но в других сочетаниях, не было раньше. В новой версии FixFlatXP работает не за счёт дорогой по коду прозрачности, а за счет установки OnTBCustomDraw.


 
Sapersky   (2007-09-21 16:29) [22]

Так что мой вариант всяко быстрее вашего, причем наверняка не на несколько процентов.

Я ни на чём не настаиваю, но неужели долго проверить?
Для большего реализма добавлю: быстрее с 24 bpp, с 8 bpp чуть медленнее (но большие картинки, на которых имеет смысл бороться за скорость, обычно именно 24 bpp).
Вообще результат несколько неожиданный для меня самого, могу только предполагать, что причина в использовании вами строковых asm-команд. Вроде бы это наибыстрейший вариант на i486, но не на современных CPU.
А с раскидыванием переменных по регистрам и дельфийский оптимизатор неплохо справляется, во всяком случае на небольших функциях (поэтому и оставлен call; ещё, как оказалось, большое значение имеет тип передаваемых a,b,c).


 
Vladimir Kladov ©   (2007-09-23 20:00) [23]

2Sapersky: а вы правы, снимаю фуражку. Ваш вариант быстрее на 5%. Был.

Но. Вам повезло: начало цикла случайно попало на границу 8 байт. И я был ленив, каюсь. Не ожидал от Delphi и пентиума такой прыти. После переписывания по-нормальному мне удалось сделать на 10% быстрее всё же, чем в вашем варианте.

Кстати PaethPredictor( 0, b, 0 ) = b. Впрочем первый цикл все равно ни на что не влияет. И and 255 к байту тоже не имеет смысла. Без него ваш вариант чуть быстрее. А вот выравнивать на границу слова начала цикла Delphi все-таки не умеет. после небольших изменений в коде процедуры выше, ваш вариант сразу стал чуть медленнее, чем в начале. И строковые команды работают быстрее, чем пара MOV+INC ESI/EDI. Это я тоже проверил.

Как протестирую (и поправлю при нужде) прочие фильтры, выложу новый вариант.


 
exero ©   (2007-09-24 07:50) [24]


> Как я и думал. Убираете FixFlatXP, и при отсутствии манифеста
> - будет прозрачным тулбар. Поставите манифест - станет в
> стиле XP, но не прозрачным. Если все-таки нужен прозрачный,
>  убираете tboFlat. Но тогда при отключенных темах прозрачность
> для тулбара останется, а кнопки будут выпуклые в стиле классики.

Спасибо за информацию.

> Если нужен именно GRush, то элементарно решается заменой
> тулбара панелью с кнопками, что я и проделал в ToGRush.

Подключил я ToGrush - картинки пропали - не полноценная замена получилась - так что не вариант.

>Собственно,
>  я не понял, при чем тут новая версия KOL, разве аналогичных
> траблов, но в других сочетаниях, не было раньше. В новой
> версии FixFlatXP работает не за счёт дорогой по коду прозрачности,
>  а за счет установки OnTBCustomDraw.

Да собственно говоря не причем - просто кое-что работает не так, как мне хотелось - вот и все.


 
mdw ©   (2007-09-24 17:10) [25]


> [-]  Исправлена ошибка в обработчике сообщения WM_WINDOWPOSCHANGED
> дляtoolbar-контрола  (возвращалось  true  вместо  false).
>   Эта  ошибка недавала правильно выравнивать дочерние контролы
> на тулбаре.

Владимир, оно может и ошибка, но теперь не выравниваются контролы, лежащие рядом с тулбаром, если у них TabOrder больше TabOrder"a тулбара (caTop, caBottom) или выравнивание caClient.


 
Vladimir Kladov ©   (2007-09-24 18:14) [26]

Насчёт тулбара я такого не замечал, гляну. Вообще, попробуйте OLD_ALIGN. Мне пришлось на него перейти в своём последнем проекте (3 дня прошло и не помню в чём загвоздка была. Надо включить снова NEW_, чтобы вспомнить. Но что-то сердитое).

А переход на WM_SIZE - проблему решает?

Я тут вообще с выравниванием меток подумал надо давать им TabOrder всё-таки.


 
mdw ©   (2007-09-24 18:41) [27]

C OLD_ALIGN все нормально работает.


 
misha_shar ©   (2007-09-27 07:53) [28]

Если на панели тулбар панель и тулбар то в версии 2.80 все наезжает друг на друга и не помогает OLD_ALIGN даже ручное размещение Controlov
не помогает происходит пропадание картинок и надписей на тулбаре.
Пришлось вернуться к версии 2.78


 
Vladimir Kladov ©   (2007-09-27 15:35) [29]

на панели тулбар панель и тулбар

Вот это как понимать? У меня обычно тулбар на панели, ничего не наезжает. Тем более не теряются картинки.


 
Vladimir Kladov ©   (2007-09-27 18:34) [30]

Ну так, что, будет минимальный проект для демонстрации проблемы? Или все-таки нет инкакой проблемы? Я сделал тестовй проект, и у меня все нормально выравнивается, и в new_align и в old_align.


 
mdw ©   (2007-09-27 19:00) [31]

Кстати, Владимир, по поводу [25], нужен мин. проект или уже разобрались?


 
Vladimir Kladov ©   (2007-09-27 19:55) [32]

А я что пишу? Сжу и жду, когда вы уже предоставите. См. мой предыдущий пост, номер не знаю.


 
mdw ©   (2007-09-28 11:54) [33]

Владимир, послал Вам письмо на vk<собака>kolmck.net


 
Vladimir Kladov ©   (2007-09-28 16:15) [34]

Есть в KOL такая строчка:
Result := TRUE; // this prevents Align working for child controls of Toolbar !
Так вот в 2.80 она закомментарена (и тогда же появился комментарий). Если раскомментарить, то всё нормально - в вашем случае. придётся делать условную компиляцию. Иногда важнее дочек выравнивать, а сам тулбар уже на панели и ему ничего не страшно.


 
Sapersky   (2007-10-05 14:38) [35]

Но. Вам повезло: начало цикла случайно попало на границу 8 байт. И я был ленив, каюсь. Не ожидал от Delphi и пентиума такой прыти. После переписывания по-нормальному мне удалось сделать на 10% быстрее всё же, чем в вашем варианте.

Начало цикла - это инструкция, на которую выполняется переход с конечной проверки? Тогда повезло вам, а у меня в тестовом примере адрес оказался кратен только 4. Вообще, действительно, Delphi никакого выравнивания здесь не делает, и этот адрес достаточно свободно "плавает" (не оказывая заметного влияния на результаты тестов).

Посмотрел обновлённую версию. Да, на большинстве картинок быстрее; другой вопрос, какой ценой достигнуты эти 5-10% и стоят ли они того. Хотя свой вариант я тоже написал не сразу, в CPU window пришлось заглядывать неоднократно, но думаю, что соотношение "затраченные усилия / результат" у него всё же лучше.
Не настаиваю (в свете недавней ветки об отказе от asm) ни на каких "волевых решениях", просто демонстрирую возможности альтернативного метода :)
Единственная просьба - по возможности выносить asm-код в отдельные функции, а то на FilterRow смотреть страшно.



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

Форум: "KOL";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.247 c
2-1213080987
андр.
2008-06-10 10:56
2008.07.13
MS SQL 2000


11-1189856395
Robt
2007-09-15 15:39
2008.07.13
ComboBox


15-1211838002
Kerk
2008-05-27 01:40
2008.07.13
Таможня, так ее...


15-1211906510
Админ
2008-05-27 20:41
2008.07.13
Управление золотовалютными резервами Российской Федерации


2-1213242326
Toropov
2008-06-12 07:45
2008.07.13
Как организовать помощь (Help) в своей программе?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский