Конференция "KOL" » Версия 2.89 [Delphi]
 
  • Vladimir Kladov © (20.03.10 19:32) [0]
    Сделал слияние изменений за 2 года. См. на сайте kolmck.net, архивы kol.zip, mck.zip, koladd.zip. Прежние архивы доступны с суффиксом 288 в имени.

    Новости от 30 марта 2010 г. (KOL & MCK v2.89)
    [*]
    UNI
    Добавлен символ условной компиляции FORCE_ALTERNATEFILENAME для использования альтернативных имен файлов и путей для UNICODE версии.
    Исправления для лучшей поддержки UNICODE версии в методах и функциях FBitBtnGetCaption, NewMDIChild, TGraphicTool.SetFontName, ExcludeAmpersands.

    [+]
    Добавлен метод TCanvas.OffsetAndRotate для упрощения манипуляций с преобразованием мировых координат канвы.
    VK
    [+]
    Добавлен метод TControl.TBClear для удаления всех кнопок на тулбаре и свойство TControl.TBButtonLParam для доступа к значению LParam кнопки на тулбаре.
    D[u]fa
    [+]
    Добавлена функция Extended2StrDigits( D: Double; n: Integer ), которая при форматировании обеспечивает ровно n цифр после десятичной точки.
    VK
    [+]
    Добавлен метод TIniFile.ValueDouble для чтения и записи вещественных чисел в ини-файле.
    VK
    [*]
    Тип TWindowsVersion расширен значением wvSeven (для функции WinVer, которая теперь отличает версию Windows 7 как отдельную версию ОС).

    [+]
    D200X
    Добавлен inc-файл с определениями зеркальных типов MCK для лучшей поддержки D2006-D2010 и в случае этих версий о включается в KOL.pas.
    KOLDEF.inc: обеспечены определения для Delphi 2010 (ver210 компилятора).
    D[u]fa
    [-]
    Исправлена функция NormalizeUnixText для случая первого символа перехода строки (#10).

    [-]
    Исправлена утечка памяти в методе TDirList.ScanDirectory.
    D[u]fa
    [-]
    Исправлено создание пункта меню с флажком (checkmark) - метод method TMenu.Insert.
    shilou
    [-]
    Исправлен метод TMenu.RemoveSubMenu.

    [-]
    Исправлена функция WndFuncCombo для случая, когда определен символ KEY_PREVIEW (для обеспечения предварительной обработки в обработчике формы, когда KeyPreview = TRUE)

    [-]
    Исправлена функия WndProcNotify для предотвращения бесконечного цикла при передаче сообщения дочернему контролу.
    Galkov
    [-]
    UNI
    Исправлена утечка памяти в методе TControl.CreateWindow для UNICODE_CTRLS.

    [-]
    Исправлена функция WndProcTransparent (условие двойной буферизации формы).

    [-]
    Исправлена функция TControl.SetCurIndex (обеспечено присваивание значения fCurIndex для таб-контрола, несоответствие его реальному могло приводить к исключению access violation)

    [+]
    delphicommctrl.inc: добавлены определения TBIF_BYINDEX и для header-контрола (HDM_, HDN_ и др.)

    [-]
    ASM
    Исправлен метод TCanvas.Arc для ASM-версии.
    VK
    [-]
    visual_xp_styles: исправлена функция CheckThemes для случая DLL.
    Устранены утечки ресурсов в функции WndXPMessage.
    D[u]fa
    [+]
    KolAdd
    Для случая, когда определен символ EXTERNAL_KOLDEFS, он включает файлы PROJECT_KOL_DEFS.INC и EXTERNAL_DEFINES.INC.

    [*]
    UNI
    KOLadd.pas, KOLDirDlgEx.pas: Множество исправлений для лучшей поддержки UNICODE_CTRLS.
    MCK: изменения в генерации кода для лучшей поддержки UNICODE_CTRLS (TKOLToolbar.SetupParams, PCharStringConstant)

    [*]
    MCK
    Изменена генерация констант для пунктов меню: теперь они декларируются как безтиповые, т.е. неизменяемые константы.


  • Jon © (20.03.10 21:06) [1]
    Thank you very, very much!
  • AndreyRus © (21.03.10 09:41) [2]
    C Богом!
  • Dy1 (21.03.10 11:13) [3]
    по сравнению с последними 2.88 установка прошла идеально :)
  • mdw (22.03.10 16:00) [4]
    Сравнил с тем что у меня. Кое что нашел.

    KOLAdd.pas

    procedure TAction.LinkMenuItem(Menu: PMenu; MenuItemIdx: integer);
    {$IFDEF _FPC}
    var
     arr1_DoOnMenuItem: array[ 0..0 ] of TOnMenuItem;
    {$ENDIF _FPC}
    begin
    //У меня используется MenuId, а не MenuItemIdx. Т.к. в случае динамического меню с индексом работает не корректно
      LinkCtrl(Menu, ckMenu, Menu.Items[MenuItemIdx].MenuId, UpdateMenu);
      //LinkCtrl(Menu, ckMenu, MenuItemIdx, UpdateMenu);
     {$IFDEF _FPC}
     arr1_DoOnMenuItem[ 0 ] := DoOnMenuItem;
     Menu.AssignEvents(MenuItemIdx, arr1_DoOnMenuItem);
     {$ELSE}
     Menu.AssignEvents(MenuItemIdx, [ DoOnMenuItem ]);
     {$ENDIF}
    end;

    KOL.pas

    1.
    В оконной функции WndProc_LVCustomDraw, зачем-то вызывается Sender.Canvas;, соответственно в программу включается код для Canvas. Хотя дальше он и не нужен. Если кому потребуется Canvas для отрисовки итема, он к нему и сам обратится в OnLVCustomDraw.
    function WndProc_LVCustomDraw( Sender: PControl; var Msg: TMsg;
                                  var Rslt: Integer ): Boolean;
    ...
         Sender.Canvas; //!!!!!!!!!!!
         Rslt := Sender.FOnLVCustomDraw( Sender, {Sender.fPaintDC} NMCustDraw.nmcd.hdc,
              NMCustDraw.nmcd.dwDrawStage, ItemIdx, SubItemIdx, NMCustDraw.nmcd.rc,
              ItemState, TColor( NMCustDraw.clrText ), TColor( NMCustDraw.clrTextBk ) );
    ...


    2.
    В ветке http://pda.delphimaster.net/?id=1249457352&n=10 писал про TIcon, но Владимир или не увидел, или не понял или проигнорировал, тогда почему? Еще раз.
    ...
    function ReadIcon : Boolean;
    ....
           if BIH.biBitCount = 16 then
         begin
           if BIH.biCompression = BI_BITFIELDS then Stream2Stream(Mem, Strm, 12)
           else
             for I := 0 to 2 do
             begin
               J := InitColors[ I ];
               Mem.Write( J, 4 );
             end;
         end;


    Объясняю зачем это. Столкнулся с 16 битными иконками, в которых палитра уже лежит непосредственно внутри (BIH.biCompression = 3 {BI_BITFIELDS}).
    Обычно BIH.biCompression = 0 и 12 байт палитры добавляются (for i:=0...Mem.Write( J, 4 );...), а если BIH.biCompression = 3 то их нужно прочитать.
     Ну и также далее при чтении маски:
    ...    
        BIH.biBitCount := 1;
        BIH.biPlanes := 1;
        BIH.biClrUsed := 0;
        BIH.biCompression:= 0;
    ...
    Если нужно могу выложить\прислать пример такой иконки. Собственно в WinCe они почти все такие. И в ресурсах и в *.ico. Win XP их читает, MSVS тоже, а вот Delphi, ну и KOL - фиг!

    3.
    Еще такое предложение. Добавить в TStrList метод FindFirst(). А то TStrList.Find() ищет просто вхождение строки в список, А зачастую нужно именно первое. Соответственно код:

    function TStrList.FindFirst(const S: AnsiString; var Index: Integer): Boolean;
    begin
       Result := Find(S, Index);
       if Result then
         while (Index-1 > 0) and (AnsiCompareStr( AnsiString(PAnsiChar( fList.Items[ Index-1 ] )), S ) = 0) do Dec(Index);
    end;


    Еще в MirrorKOLPackageD6.dpk попало лишнее:

     {$R 'Components\MH\MCKMHXP.dcr'}
    .....
     KOLadd in 'KOLadd.pas',
     KolGif in 'KolGif.pas',
     MCKGif in 'MCKGif.pas',
     MCKMHXP in 'Components\MH\MCKMHXP.pas',
     MCKTracker in 'Components\KOLTracker\MCKTracker.pas',
     mckCCtrls in 'mckCCtrls.pas',
     mckDatePicker in 'Components\DatePicker\mckDatePicker.pas';
    Пустячек, но все же....:)
  • mdw (22.03.10 16:06) [5]

    > Еще в MirrorKOLPackageD6.dpk попало лишнее:   {$R 'Components\MH\MCKMHXP.
    > dcr'}.....  KOLadd in 'KOLadd.pas',  KolGif in 'KolGif.pas',
    >   MCKGif in 'MCKGif.pas',  MCKMHXP in 'Components\MH\MCKMHXP.
    > pas',  MCKTracker in 'Components\KOLTracker\MCKTracker.pas',
    >   mckCCtrls in 'mckCCtrls.pas',  mckDatePicker in 'Components\DatePicker\mckDatePicker.
    > pas';Пустячек, но все же....:)


    Не все лишнее, не посмотрел внимательно. Но многое попало видимо случайно (MHXP, Tracker, Gif и т.д...)
  • Vladimir Kladov © (22.03.10 20:44) [6]
    С пакетом для Delphi6 это я действительно немного переборщил, попал мой "полносборный" dpk-шник, который я ставлю для своих проектов. Позже вычищу. Я так понимаю, D6 используют не все.

    Пример иконки можно.

    Добавить в TStrList метод FindFirst(). А то TStrList.Find() ищет просто вхождение строки в список, А зачастую нужно именно первое. Соответственно код:

    function TStrList.FindFirst(const S: AnsiString; var Index: Integer): Boolean;
    begin
      Result := Find(S, Index);
      if Result then
        while (Index-1 > 0) and (AnsiCompareStr( AnsiString(PAnsiChar( fList.Items[ Index-1 ] )), S ) = 0) do Dec(Index);
    end;
    Это можно. Только сначала еще понять, что это за AnsiString(PAnsiChar(... у меня там в коде. Явно должно замедлять процесс. Там еще todo позабытый стоит.

    Насчет  WndProc_LVCustomDraw я посмотрю. Кажется, зачем-то это было все-таки нужно и без него что-то не работало. Не зря же там такой строгий комментарий.

    TAction.LinkMenuItem - TAction я не использую, это исключительно не моя инициатива. Если считаете так более правильно, сделаем по-вашему. Если у кого-то есть возражения, пусть высказываются.
  • Vladimir Kladov © (22.03.10 21:06) [7]
    Посмотрел DemoLVCustomDraw. После небольшик поправок в коде все пошло и без обращения к Canvas в KOL.pas. Буду смотреть еще.
  • mdw (23.03.10 14:53) [8]

    > Пример иконки можно.

    несколько иконок положил в архив
    kolnmck.kolmck.net/Icons.zip


    > Посмотрел DemoLVCustomDraw. После небольшик поправок в коде
    > все пошло и без обращения к Canvas в KOL.pas. Буду смотреть
    > еще.

    У меня обращение к Canvas уже давно закоментированно, каких либо проблем не замечал.
  • Vladimir Kladov © (23.03.10 20:11) [9]
    несколько иконок положил в архив
    Что-то не плучается загрузить, и с вашим исправлением тоже: ---------------------------
    Form1
    ---------------------------
    Can not create DIB section, error: 0, The operation completed successfully.
    ---------------------------
    OK  
    ---------------------------
    Т.е. DIB загрузился, маска загрузилась, прежде чем вызывать CreateIconIndirect, код пытается получить хэндлы загруженных битмаов - ImgBmp и MskBmp. И вот так ломается вызов CreateDIBSection. Что-то еще изменяли или у вас новая версия виндов? У меня ХР 32бита.
  • Vladimir Kladov © (23.03.10 20:15) [10]
    А, кажется, догоняю: для MskBmp наверное надо почистить biCompression, это на нем не может дескриптор получить. С ImgBmp все как раз в порядке. Кстати, система эти иконки никак не показывает, ни в папке, ни в системном Preview. С трудом (криво) изобразил только Irfan.
  • Vladimir Kladov © (23.03.10 20:20) [11]
    А, у вас же так и написано. А я и не заметил. Да, теперь грузится. Я сейчас выложу обновленный KOL.pas отдельно, ссылку сюда брошу.
  • Vladimir Kladov © (23.03.10 20:33) [12]
    http://kolmck.net/KOL289+.rar

    Внутри лежит проект для тестирования скорости TStrList(Ex).Find, T(W)StrList(Ex).IndexOf для всех 4 случаев. Переделал, чтобы учитывалось, как сортировалось - с учетом регистра или без, Ansi или просто Ascii. Find для TWStrList е делал.
  • mdw (24.03.10 12:22) [13]

    > Кстати, система эти иконки никак не показывает, ни в папке,
    >  ни в системном Preview.
    >

    Странно. У меня показывает....  Выглядит вот так:
    kolnmck.kolmck.net/Untitled-1.jpg

    OS: WinXP 32, SP3 (сборка 2600.xpsp.080413-2111).
  • mdw (24.03.10 12:24) [14]

    > Странно. У меня показывает....  Выглядит вот так:

    Я собственно поэтому и ковыряться с ними стал: система открывает, а программа - фиг! Обидно..:)
  • mdw (24.03.10 12:36) [15]

    > http://kolmck.net/KOL289+.rarВнутри лежит проект для тестирования
    > скорости TStrList(Ex).Find, T(W)StrList(Ex).IndexOf для
    > всех 4 случаев. Переделал, чтобы учитывалось, как сортировалось
    > - с учетом регистра или без, Ansi или просто Ascii. Find
    > для TWStrList е делал.

    Спасибо. Потестирую, если что еще найту, отпишу.
  • Dufa © (24.03.10 13:17) [16]
    Dy1, а на какую версию делфи прежняя не вставала?

    Vladimir Kladov, почему бы не перейти на свн? было гораздо проще..

    СВН версию смешал с 2.89
  • QAZ (24.03.10 14:18) [17]
    неушто пришло счастие и автор сел на безSOLевую диету и вспомнил про свое дитя?
  • mdw (24.03.10 15:11) [18]
    Вот поправил малях:

    function TStrList.Find(const S: AnsiString; var Index: Integer): Boolean;
    var
     L, H, I, C: Integer;
    begin
     Result := FALSE;
     if FCount = 0 then Exit;
    ....

    Без этой проверки падает, если список пустой.
  • Vladimir Kladov © (24.03.10 15:54) [19]
    По мне так лучше пусть падает. 1 раз на отладке упадет, программист обеспечит правильную последовательность вызовов, и все. В любом случае Find нельзя вызывать на неотсортированном списке, а проверить, что в нем далали изменения после сортировки - никак не возможно, опять же вся надежа на программиста. Но если вы считаете так более правильным, сделаем так. Хотя я бы предпочел Assert и однозначное падение, хотя оно и так однозначное, т.к. указатели на функции = nil.
 
Конференция "KOL" » Версия 2.89 [Delphi]
Есть новые Нет новых   [134430   +2][b:0][p:0.003]