Конференция "KOL" » KOL v 3.00 [Delphi, Windows]
 
  • SPeller © (28.10.10 02:07) [220]

    > I suggest maybe a more generic switch like TARGET_EXE or
    > TARGET_DLL would help for these cases?

    I did not found how to determine which type of binary is producing in conditional symbols. If there is some way to do it - it should be used.
  • SPeller © (28.10.10 03:31) [221]
    Проблема: при сипользовании USE_MHTOOLTIP KOL не компилируется.
  • SPeller © (28.10.10 03:50) [222]
    Проблема: при использовании USE_GRAPHCTLS вываливается экзепшин при отрисовке в PaintGraphicChildren из-за мусора, возвращаемого TControl.GetChildCount.

    ЗЫ: Всегда использую PAS_VERSION
    ЗЫ: Версия U
  • zuker © (28.10.10 08:20) [223]
    проблема: Не грузится в KOLImageShow фрагмент изображения BITMAP_0 из файла ресурса (*.res)

    ImageList1.LoadBitmap('BITMAP_0',clWhite);
    ImageShow1.CurIndex:=0; ImageShow2.CurIndex:=1;
  • SPeller © (28.10.10 08:38) [224]
    Для Д2009 и выше нужно добавить:

    {$IFDEF _D2009orHigher}
    function CharInSet(C: AnsiChar; const CharSet: TSetOfChar): Boolean; overload; inline;
    function CharInSet(C: WideChar; const CharSet: TSetOfChar): Boolean; overload; inline;
    {$ENDIF}

    {$IFDEF _D2009orHigher}
    function CharInSet(C: AnsiChar; const CharSet: TSetOfChar): Boolean;
    begin
     Result := C in CharSet;
    end;

    function CharInSet(C: WideChar; const CharSet: TSetOfChar): Boolean;
    begin
     Result := (C < #$0100) and (AnsiChar(C) in CharSet);
    end;
    {$ENDIF}



    Это копипаст решения из сисутилс для случаев проверки string[n] in set. Поскольку set остался set of ansichar, а символы в string стали widechar - дельфи выдает ворнинг, типа, используйте CharInSet из SysUtils. Со вводом юникода они отметили ворнингами все места, где происходит неявное преобразование чего-либо касающегося строк и где может произойти потеря информации или данный код нужно переработать чтобы преобразования не было. И отсутствие ворнингов для меня правило хорошего тона при написании кода )

    Другие изменения для д2009 и выше (версия U):

    visual_xp_styles.inc:
    682:  S : KOLString;

    kol.pas:
    10198: function NewGraphLabel( AParent: PControl; const ACaption: KOLString ): PControl;

    11259: function Num2Bytes( Value : Double ) : KOLString;

    11278: function cHex2Int( const Value : KOLString) : Integer;

    11280: function Octal2Int( const Value: KOLString ) : Integer;

    11546: function StrIn( const S : AnsiString; const A : array of AnsiString ) : Boolean;

    соответствующие изменения заголовков функций в разделе реализации опущу

    20227:     if Value[ I ] in [ '0'..'7' ] then
    to
       {$IFDEF _D2009orHigher}
       if CharInSet(Value[I], ['0'..'7']) then
       {$ELSE}
       if Value[ I ] in [ '0'..'7' ] then
       {$ENDIF}

    20346:   if {$IFDEF UNICODE_CTRLS}WAnsiEq{$ELSE}StrEq{$ENDIF}( Copy( Value, 1, 2 ), '0x' ) then
  • Vladimir Kladov © (28.10.10 15:45) [225]
    при сипользовании USE_MHTOOLTIP KOL не компилируется.

    D:\D2010\bin>dcc32 -b d:\kol\kol.pas -DUSE_MHTOOLTIP
    Embarcadero Delphi for Win32 compiler version 21.0
    Copyright (c) 1983,2009 Embarcadero Technologies, Inc.
    d:\kol\KOLDEF.INC(254)
    d:\kol\KOLDEF.INC(254)
    d:\kol\delphidef.inc(48)
    d:\kol\delphicommctrl.inc(1569)
    d:\kol\KOL_ansi.inc(2317)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\MCKfakeClasses200x.inc(51)
    d:\kol\KOL_ansi.inc(2317)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOL_ASM.inc(14887)
    d:\kol\KOL.pas(65765)
    94007 lines, 0.64 seconds, 236025 bytes code, 69536 bytes data.

    D:\D2010\bin>dcc32 -b d:\kol\kol.pas -DUSE_MHTOOLTIP -DUNICODE_CTRL
    Embarcadero Delphi for Win32 compiler version 21.0
    Copyright (c) 1983,2009 Embarcadero Technologies, Inc.
    d:\kol\KOLDEF.INC(254)
    d:\kol\KOLDEF.INC(254)
    d:\kol\delphidef.inc(48)
    d:\kol\delphicommctrl.inc(1569)
    d:\kol\KOL_ansi.inc(2317)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\MCKfakeClasses200x.inc(51)
    d:\kol\KOL_ansi.inc(2317)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOLMHToolTip.pas(937)
    d:\kol\KOL_ASM.inc(14887)
    d:\kol\KOL.pas(65765)
    94007 lines, 0.58 seconds, 236025 bytes code, 69536 bytes data.



    Не пойму в каком Delphi, в 2010 компилируется, см. Версия V.
  • Vladimir Kladov © (28.10.10 16:38) [226]
    На сайте версия 3.00.W, исправления для Graph_ctls и ImgShow (asm).

    2Speller
    У нас есть WInChar, если кому нужен, и он появился до того, как в Delphi добавили CharInSet. Другое дело, что где-то по-прежнему может использоваться in [ ]. Но я вычищал все предупреждения, заменяя максимально эффективным >= and <=. Или говорите, где (при каких условиях) лезут ворнинги.

    Лучше не изменения давайте, а командную строку для компиляции, чтобы те же предупреждения (или ошибки) выскочили.
  • SPeller © (29.10.10 01:30) [227]

    > Другое дело, что где-то по-прежнему может использоваться
    > in [ ]

    Вот оно и используется в строке 20227, функция Octal2Int.


    > Лучше не изменения давайте, а командную строку для компиляции,
    >  чтобы те же предупреждения (или ошибки) выскочили.

    Попробую. Но предыдущие изменения и так понятны, последнее - это функция cHex2Int.


    > Не пойму в каком Delphi, в 2010 компилируется, см. Версия
    > V.

    Добавьте к своей строке -DDEBUG. В релизной версии у меня тоже компилируется, как оказалось.
  • SPeller © (29.10.10 01:32) [228]

    > У нас есть WInChar

    Но в нем кода в 4 раза больше чем в дельфийском варианте )
  • Vladimir Kladov © (29.10.10 04:33) [229]
    Вот код из D2010.SysUtils:
    function CharInSet(C: WideChar; const CharSet: TSysCharSet): Boolean;
    begin
     Result := (C < #$0100) and (AnsiChar(C) in CharSet);
    end;



    Вы считаете, это корректное решение? Например, для случая W in [ 'А'..'Я' ] ?
    Эту функцию правильнее было бы назвать CharInAnsiSet, и документировать детально, что проверять не-анси символы она не может.

    А кода в 4 раза больше в самой функции или в каждой точке вызова? (Вообще говоря, в 4 раза больше даже во многих точках вызова не может привести к фатальному росту кода во всем приложении, если только речь не о добавлении N Кбайт из-за динамических массивов).

    Копипастить в любом случае не имеет смысла: ее придется обложить IFDEF'ами, т.к. прежние версии Delphi не поймут. А смысл тогда какой? Такую функцию где угодно можно разместить, в любом модуле у себя. Если бы она еще автоматически действовала на запись W in [x..y,z] , так ведь код все равно надо свой переписывать, чтобы обращаться к charinset'у.
  • SPeller © (29.10.10 06:28) [230]

    > Вы считаете, это корректное решение? Например, для случая
    > W in [ 'А'..'Я' ] ?

    Может и не совсем корректное, но зато быстрое и инлайном ) А поменять на это можно в самом KOL, окружив ifdef-ом, тем более что вроде как только одно место всплыло (ворнинг дельфя выдает).
  • Vladimir Kladov © (29.10.10 09:01) [231]
    Почему инлайном? (Код я посмотреть не могу, IDE не запускается). А если инлайном, то будет ли оно инлайном, если код скопипастить?

    Вообще, есть вариант достаточно эффективный:
    - для проверок наличия диапазона заменять на (w >= 'А') and (w <= 'Я')
    - для проверок некоторых символов использовать pos( w, 'АБВ' ) > 0

    Т.е. я по-прежнему не вижу смысла, у себя придется писать код в виде
    if {$IFDEF _D2009orHigher} CharInSet( w, {$ELSE} (w in {$ENDIF} [ ... ]) then



    либо ориентироваться строго на _D2010. Или все-таки сделать вариант CharInSet для других версий, заменив тип TSysCharSet на свой или объявить его для старших версий
    TSysCharSet = Set of KOLChar;

    и рекомендовать пользоваться функцией вместо действительно инлайн-кода, который генерит in.

    А то, что одно место, я его сам поправлю. Только до дома дойду вечером, там D2010 "стоит" без IDE, с -DDEBUG откомпилирую, и поправлю.

    Я вообще считаю, что то, как Embarcadero сделало с переопределением String на UnicodeString - неправильно в корне. Это можно было сделать опцией по умолчанию, но обязательно нужна была директива, возвращающая все на свои места. Это точно такое же неправильное решение, как решение об использовании unicode-16: решение как в Linux использовать UTF-8 было бы намного правильнее с точки зрения совместимости. Таоке ощущение, что это было специально для обеспечения максимальной несовместимости.
  • Vladimir Kladov © (29.10.10 17:41) [232]
    Версия 3.00.X на сайте. Поправил с -DDEBUG и заодно где увидел все in [ ] для Char. Не стал трогать только явный AnsiChar in [ ]. Восстановил работу MCK в Delphi2/3.
  • SPeller © (29.10.10 18:14) [233]

    > А если инлайном, то будет ли оно инлайном, если код скопипастить?

    Вообще, инлайны с 2007 версии точно поддерживаются :) И они реальные инлайны. Мне очень понравились инлайновые методы в хелперах для записей. Например, делаем хелпер для TRect, добавляем ему инлайн метод Width, вставляем строчку кода и вуаля, в коде везде пишем rect.width, а в конечном бинарном коде получаем работу с Left и Right без вызовов функций. Одно плохо - IDE не любит такие штуки. В Дельфи ХЕ этот момент вроде доработали, но не тестировал еще, до конца ли (я им плавающую ошибку из-за хелперов год ловил, когда поймал - в багтрекере ответили что в ХЕ поправлено). На работе сейчас используем 2010, и там очень успешно применяем свойства объектов, get методом которых являются инлайн функции. Т.е. обращаемся к свойству, а в конечном коде инлайн разворачивается и работает например с полями без лишних вызовов.


    > Т.е. я по-прежнему не вижу смысла, у себя придется писать
    > код в виде

    Я не настаиваю, в общем то, на решении методом копипаста, просто предложил ) Если можно обойтись без лишних добавок, то я только за )


    > с переопределением String на UnicodeString - неправильно
    > в корне

    На сколько я понял из исходников - rtl можно откомпилить без нативной поддержки юникода. Там есть не мало {$IFDEF UNICODE}.


    > это было специально для обеспечения максимальной несовместимости

    На самом деле аккуратно написанный код не нуждается в правке при переходе на юникод, дельфийцы над этим поработали хорошо. Единственный момент - это когда выделяется память под строки, тут да, мало кто писал конструкции вида GetMem(ptr, Length(str) * Sizeof(Char)), умножать на размер символа не привыкли. Но рабочие бизнес-приложения без этого легко обходятся. У нас, например, с парой пустяковых правок нормально откомпилился и заработал большой проект. Бал на 2007, переводили на 2009.
  • Vladimir Kladov © (29.10.10 18:36) [234]

    > аккуратно написанный код

    Дело не только в аккуратности. Паскаль имеет много гитик, связанных с его низкоуровневостью. Я видел, народ был в панике из-за использования строк в качестве динамических массивов при обмене данными в ком-объектах. Потом, кому на протяжении 20 лет могло в голову прийти писать умножение на размер оф чар, если он всегда = 1 ? Супермазохизмом никто не страдает, да еще код загромождать. Кто теперь будет просматривать миллионы строк старого кода только потому, что новые хозяева решили изменить незыблемую казалось бы аксиому. Да если и будет, сколько времени пройдет, пока будут устранены все такие неаккуратности. rtl перекомпилировать - это они сами пусть сначала попробуют. Я лично все равно не собираюсь на d20xx переходить, моя организация тоже - ей надо обеспечивать поддержку для платформы nt4/win2k, на висту/семерку/восьмерку никто здесь переходить не планирует до 2020 года точно. А если будут переходить, то уже не на delphi точно. C#, J#. Опцию надо было оставлять для совместимости, чтобы клиентов не терять хотя бы.
  • Jon © (30.10.10 00:33) [235]

    dcc32.exe -b KOL.pas -dUNICODE_CTRLS;

    Borland Delphi Version 15.0
    Copyright (c) 1983,2002 Borland Software Corporation
    KOLDEF.INC(257)
    KOLDEF.INC(257)
    delphidef.inc(48)
    delphicommctrl.inc(1569)
    KOL_unicode.inc(1185)
    KOL_unicode.inc(1185)
    KOL.pas(21882) Error: Undeclared identifier: 'EAX2PChar'
    KOL.pas(21883) Error: Undeclared identifier: 'EDX2PChar'
    KOL.pas(21984) Error: Undeclared identifier: 'EAX2PChar'
    KOL.pas(21985) Error: Undeclared identifier: 'EDX2PChar'
    KOL.pas(45664) Error: Undeclared identifier: 'EDX2PChar'
    KOL.pas(45854) Error: Undeclared identifier: 'EDX2PChar'
    KOL.pas(46553) Error: Undeclared identifier: 'RemoveStr'
    KOL_ASM.inc(2614) Error: Undeclared identifier: 'EDX2PChar'
    KOL_ASM.inc(9325) Error: Undeclared identifier: 'RemoveStr'
    KOL_ASM.inc(9535) Error: Undeclared identifier: 'RemoveStr'
    KOL_ASM.inc(10573) Error: Undeclared identifier: 'RemoveWStr'
    KOL_ASM.inc(10703) Error: Undeclared identifier: 'EDX2PChar'
    KOL_ASM.inc(10801) Error: Undeclared identifier: 'EmptyString'
    KOL_ASM.inc(14930)
    KOL.pas(65488)

  • Vladimir Kladov © (30.10.10 09:36) [236]
    3.00.Y - теперь и в Delphi3 можно использовать ключ -DUNICODE_CTRLS.

    Finally I created bat files to compile from different compilers using most often problem keys. May be this will help in future modifications.
  • Dufa © (30.10.10 14:56) [237]
    Новый вариант TStrList.IndexOfName падает =\
    пока не разобрался почему и когда именно..
  • Dufa © (30.10.10 15:17) [238]
    Постейший код падает


     list := NewStrListFromString('a=1'+crlf+'b=2');
     writeln(list.IndexOfName('a')); - тут и валится
     writeln(list.IndexOfName('b'));
     writeln(list.IndexOfName('c'));
     list.Free;

  • Dufa © (30.10.10 15:17) [239]
    Забыл сказать, что старый вариант(IndexOfName_old) - работает
 
Конференция "KOL" » KOL v 3.00 [Delphi, Windows]
Есть новые Нет новых   [134430   +2][b:0.001][p:0.003]