Конференция "KOL" » Версия 2.89 [Delphi]
 
  • mdw (24.03.10 16:20) [20]
    Владимир, вот кусок кода где сегодня словил AV. Получается, что перед вызовом Find(), нужно всегда проверять Count > 0?  Тогда все же проще сразу вставить в метод эту проверку.
       
       ListIdUnusedSwatches:= NewStrList;
       ListIdUnusedSwatches.Text := inddDocument.GetUnusedSwatchesId;
       ListIdUnusedSwatches.AnsiSort(False);


       for i:= 1 to ColorCount do begin
       ...
         ColorStorage.IsInDocument:= not ListIdUnusedSwatches.Find(ColorStorage.ColorId, FindIndex);

      ...
      end;

     
    В этом примере я понятия не имею пустой список ListIdUnusedSwatches или нет. Единственный вариант проверять перед каждым вызовом Find() пустой он или нет....
  • Vladimir Kladov © (24.03.10 16:59) [21]
    Согласен, пусть будет. Еще что-нибудь? До выходных жду, потом оформлю как 2.90, как раз круглое число будет.
  • mdw (24.03.10 17:49) [22]

    > потом оформлю как 2.90, как раз круглое число будет.

    :)
    У меня вроде пока усё.:)
    Сегодня собрал, выложил софт, если в ближайшее время благодарные пользователи не возопят, то критических ошибок нет, т.к. используют непрерывно и интенсивно. Хотя там, в основном математика, интерфейса - одна панель с меню для выбора действия... но уже часа 4 работает без ошибок :)
  • MTsv DN (24.03.10 18:15) [23]
    1.
    function RemoveSpaces( const S: AnsiString ): AnsiString;


    Заменит на KOLString.

    2.
    themelib = 'uxtheme';


    Предлагаю добавить ".dll". Не помню где, но получал ошибку.

    3. Функция
    function ExtractFilePath( const Path : KOLString ) : KOLString


    Я правил для себя так:
    function ExtractFilePath(const Path: KOLString): KOLString;
    var
     i: Integer;
    begin
     for i := Length(Path) - 1 downto 1 do begin
       if (Path[i] = '\') then begin
         Result := Copy(Path, 1, i);
         Exit;
       end;
     end;
     Result := Path;
    end;


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

    4. WndProcToolbarCtrl
    Строчку
    if WinVer >= wvNT then // todo: check it.

    надо закомментировать, иначе краш системы (до ресета) в Windows 98 (если кому интересно)
  • MTsv DN (24.03.10 18:28) [24]
    KOL_ASM.inc
    ==========
    1. Это вообще не понятно:
    function AnsiEq( const S1, S2 : AnsiString ) : Boolean;
    procedure TDirList.ScanDirectoryEx(const DirPath, Filters: KOLString;



    2. Вот асм версия для WinVer:
    function WinVer : TWindowsVersion;
    asm
     MOVSX EAX, byte ptr [SaveWinVer]
     INC   AH     // если <> 0 после инкремента, то AL содержит вычисленную версию
     JNZ   @@exit
     CALL  GetVersion // EAX < 0 для платформы 9х, иначе NT; AL=MajorVersion; AH=MinorVersion
     XCHG  EDX, EAX
     XOR   EAX, EAX
     TEST  EDX, EDX
     XCHG  DL, DH    // DH=MajorVersion; DL=MinorVersion

     JL    @@platform_9x
     MOV   AL, wvNT
     CMP   DX, $0400
     JZ    @@save_exit

     INC   AL // wvY2K
     CMP   DX, $0500
     JZ    @@save_exit

     INC   AL // wvXP
     CMP   DX, $0501
     JZ    @@save_exit

     INC   AL // wvWin2003Server
     CMP   DX, $0502
     JZ    @@save_exit

     INC   AL // wvVista
     CMP   DX, $0600
     JZ    @@save_exit

     INC   AL // wvSeven
     CMP   DX, $0601
     JZ    @@save_exit
    @@platform_9x:
     CMP   DH, 4
     JB    @@save_exit // wv31
     INC   AL // wv95
     CMP   DX, $040A
     JB    @@save_exit
     INC   AL // wv98
     CMP   DX, $045A
     JB    @@save_exit
     INC   AL // wvME
    @@save_exit:
     MOV   byte ptr [SaveWinVer], AL
    @@exit:
    end;        

  • MTsv DN (24.03.10 18:33) [25]
    Если кому интересно. Файл MCKAppExpert200x. Заменить:
    dlg.Filter     := '*.dpr';


    на
    dlg.Filter     := 'DPR files|*.dpr';



    dlg.Filter := '*.pas';


    на
    dlg.Filter := 'PAS files|*.pas';


    Для корректной работы в Windows 7
  • Vladimir Kladov © (24.03.10 19:11) [26]
    ExtractFilePath
    Это не пойдет. Сравните вашу версию и из KOL.pas. Сразу примеры - путь 'C:aaa.txt' - не вернет ваша 'C:', для пути 'aaa.txt' правильно возвращать пустую строку. Кроме того, очень важно, чтобы можно было без всяких дополнительных проверок гарантированно получить ExtractFilePath и прибавить имя файла. Как отдельную функцию, типа ExtractFilePathFast - пожалуйста. Но даже в этом случае мне кажется боле корректным при отсутствии '\' возвращать пустую строку, а не саму входную.

    WndProcToolbarCtrl
    А, вот зачем там комментарий. К сожалению, не могу проверить сейчас не на чем, даже виртуалки под рукой нет. Пока пусть будет закомментарено тогда.

    function AnsiEq - почему непонятно? Я параметр на KOLString поменял глядя на реализацию. -> AnsiCompareStrNoCase(S1,S2:KOLString). Иначе лишние конверсии строк замедляют в случае UNICODE_CTRL.

    procedure TDirList.ScanDirectoryEx - аналогично, от реализации.

    function WinVer : TWindowsVersion; - а если так:

    function WinVer : TWindowsVersion;
    asm
    MOVSX EAX, byte ptr [SaveWinVer]
    INC   AH     // если <> 0 после инкремента, то AL содержит вычисленную версию
    JNZ   @@exit
    CALL  GetVersion // EAX < 0 для платформы 9х, иначе NT; AL=MajorVersion; AH=MinorVersion
    XCHG  EDX, EAX
    XOR   EAX, EAX
    TEST  EDX, EDX
    XCHG  DL, DH    // DH=MajorVersion; DL=MinorVersion

    JL    @@platform_9x
    MOV   AL, wvNT
    CMP   DX, $0400
    JZ    @@save_exit

    INC   AL // wvY2K
    SUB   DX, $0500
    JZ    @@save_exit

    INC   AL // wvXP
    //CMP   DX, $0501
    DEC   DX
    JZ    @@save_exit

    INC   AL // wvWin2003Server
    //CMP   DX, $0502
    DEC   DX
    JZ    @@save_exit

    INC   AL // wvVista
    CMP   DX, $0600 - $0502
    JZ    @@save_exit

    INC   AL // wvSeven
    //CMP   DX, $0601
    //DEC   DX
    JMP   @@save_exit
    @@platform_9x:
    CMP   DH, 4
    JB    @@save_exit // wv31
    INC   AL // wv95
    CMP   DX, $040A
    JB    @@save_exit
    INC   AL // wv98
    CMP   DX, $045A
    JB    @@save_exit
    INC   AL // wvME
    @@save_exit:
    MOV   byte ptr [SaveWinVer], AL
    @@exit:
    end;              


    ?
  • MTsv DN (24.03.10 19:29) [27]
    ExtractFilePath
    > путь 'C:aaa.txt'
    Я дико извиняюсь...а что такой путь возможен? 8) С таким же успехом можно любую строчку как путь в качестве примера привести.

    > function AnsiEq - почему непонятно? Я параметр на KOLString поменял глядя на реализацию. -> AnsiCompareStrNoCase(S1, S2:KOLString). Иначе лишние конверсии строк замедляют в случае UNICODE_CTRL.
    Вы не поняли. Вопрос был: почему в KOL_ASM.inc все еще используется AnsiString.
    То же самое для procedure TDirList.ScanDirectoryEx.

    WinVer
    Как угодно, если Ваш код работает. У меня щас не на чем проверить. Просто Вы асм-версию отключили, вот решил "подкинуть" рабочий код.
  • Vladimir Kladov © (24.03.10 19:57) [28]
    Вообще-то при каких-то условиях путь такой возможен. Вот код (VCL):
    procedure TForm1.Button1Click(Sender: TObject);
    var SL: TStringList;
    begin
       SL := TStringList.Create;
       TRY
           SL.LoadFromFile( 'C:aaa.txt' );
           SL.SaveToFile( ExtractFilePath( Application.ExeName ) + 'aaa.txt' );
       FINALLY
           SL.Free
       END;
    end;


    Работает. Пользователь, зная, что такой путь работает, может набрать его вручную, сохранить в ini-файле и т.д.

    почему в KOL_ASM.inc все еще используется AnsiString.
    Не понял. У меня в KOL_ASM.inc:
    function AnsiEq( const S1, S2 : KOLString ) : Boolean;
    asm
           CALL     AnsiCompareStrNoCase
           TEST     EAX, EAX
           SETZ     AL
    end;


    Прямой вызов функции
    function AnsiCompareStrNoCase(const S1, S2: KOLString): Integer;

    и преобразование результата.

    А для второго
    {$IFDEF ASM_UNICODE}
    procedure TDirList.ScanDirectoryEx

    , т.е. ассемблер отрубается для UNICODE_CTRLS. Как и раньше было, собственно.

    WinVer Мне тоже не на чем, да я и не собираюсь ставить Висту-Семерку. Просто если выйдет (не дай, не дай) версия 8, то предложенная Вами версия станет показывать что-то типа WinME, будет смешно :)
  • Vladimir Kladov © (24.03.10 20:06) [29]
    А нет, не WinME. Выйдет за пределы диапазона значений. Будет что-то типа Seven+3.
  • MTsv DN (24.03.10 20:24) [30]
    почему в KOL_ASM.inc все еще используется AnsiString


    Пардон. Ошибся.
  • vampir_infernal (25.03.10 00:53) [31]
    Спасибо, Владимир!

    KOL.PAS
    строка 13256

    {$IFDEF _D2006orHigher}
    {$I MCKfakeClasses200x.inc} // Dufa
    {$ENDIF}



    А в архиве с KOL2.89 поставляется MCKfakeClasses.inc. Или я что-то пропустил?
  • vampir_infernal (25.03.10 01:12) [32]
    Видать, я всё-таки что-то пропустил :) SVN лежит, где взять этот MCKfakeClasses200x.inc ?
  • Hallif © (25.03.10 02:49) [33]
    KOL.pas
    Описание: различие interface/implementation объявлений параметров функций:
    interface
    function SeekMemStream( Strm: PStream; {$IFNDEF STREAM_COMPAT} const {$ENDIF} MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize;


    implementation
    function SeekMemStream( Strm: PStream; const MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize;


    аналогично и для
    SetSizeMemStream,
    ReadMemStream,
    WriteMemStream,
    WriteExMemoryStream
    в KOL_ASM.inc объявления совпадают.
  • Hallif © (25.03.10 05:45) [34]
    KOL.pas
    Метод SetName обекта TObj.
    Описание: переопределение значения константы NewName в теле метода.
    Компилятор: D140,D200,FPC2xx.
    ...
     if FOwnerObj.fNamedObjList = nil then
        FOwnerObj.fNamedObjList := NewList;
     FName := NewName;
     {$IFDEF UNIQUE_NAMES}
     for i := 0 to FOwnerObj.fNamedObjList.Count-1 do
     begin
       if PObj( FOwnerObj.fNamedObjList.Items[ i ] ).FName = NewName then
       begin
          FName := '';  
           //                NewName := ''; Old code
         break;
       end;
     end;
     {$ENDIF}
          //                 FName := NewName; Old code
     if FName = '' then
        FOwnerObj.fNamedObjList.Remove( @ Self )
     else
     if FOwnerObj.fNamedObjList.IndexOf( @ Self ) < 0 then
        FOwnerObj.fNamedObjList.Add( @ Self );
    ...

  • Hallif © (25.03.10 12:24) [35]
    #issue_289
    KOL_ASM.inc
    Описание: различие interface/implementation объявлений параметров функций, предполагалось:

    kol_asm.implementation [4183]
    function TStream.Write(var Buffer; {$IFNDEF STREAM_COMPAT} const {$ENDIF} Count: TStrmSize): TStrmSize;

    //Dimaxx ©   (28.10.08 02:41)

    kol_asm.implementation [4190]
    function TStream.Seek({$IFNDEF STREAM_COMPAT} const {$ENDIF} MoveTo: TStrmMove; MoveMethod: TMoveMethod): TStrmSize;

    //Dimaxx ©   (28.10.08 02:41)
  • Vladimir Kladov © (25.03.10 16:37) [36]
    По поводу SetName - это для оптимизации?
    Посмотрите, что будет в этом случае (определены символы Use_names, Unique_names):

    procedure TForm1.Button3Click(Sender: PObj);
    begin
       ShowMessage( 'before: <' + Button3.Name + '>' );
       Button3.SetName( Form, 'A' );
       ShowMessage( 'after: <' + Button3.Name + '>' );
    end;

  • Vladimir Kladov © (25.03.10 16:39) [37]
    Там надо const убрать из декларации.
  • Vladimir Kladov © (27.03.10 17:07) [38]
    Больше замечаний не будет, как я понимаю. Буду оформлять выпуск.
 
Конференция "KOL" » Версия 2.89 [Delphi]
Есть новые Нет новых   [134430   +3][b:0.001][p:0.035]