-
Новости от 21марта 2008 (KOL & MCK v2.87)
[+] Добавлены функции NextPowerOf2, ToRadix, FromRadiStr,
InsertSeparators, Str2File.
[*] UNICODE_CTRLS: обновлены функции IndexOfChar, IndexOfCharsMin,
IndexOfStr (с использованием типа KOLString).
[+] Добавлены функции CrackStack_MapInResource и CrackStack_MapInFile
(могут использоваться при отладке).
[-] Исправлена функция NormalizeUnixText.
[-] Свойство TStream.Size исправлено для memory stream для случая
присваивания значения 0 пустому потоку данных.
[+] Исправлена функция TWStrList.SetText (by mdw). Решил создать отдельную тему... Ошибки при подключенной UNICODE_CTRLS1. function CrackStack_MapInResource( const MapName: String; Max_length: Integer; HandleSuspiciousAddresses: Boolean ): String; Строка: Resource2Stream( MapStrm, hInstance, PChar( MapName ), RT_RCDATA ); 2е ошибки: несоответствие типов Char и WideChar... Еще насколько я понимаю надо в функции, String на KOLString заменить... 2. function ToRadix( number: Radix_Int; radix: Integer; min_digits: Integer ): KOLString; Ошибка: несовпадает объявление. 3. function InsertSeparators( const s: KOLString; chars_between: Integer; Separator: KOLChar ): KOLString; Ошибка: несовпадает объявление. 4. function IndexOfChar( const S : KOLString; Chr : KOLChar ) : Integer; Строка: F := StrScanLen( P, Chr, Length( S ) ); Ошибка: несоответствие типов Char и WideChar... Вообще функция IndexOfChar как то странно поддержку UNICODE осуществляет... function IndexOfChar( const S : KOLString; Chr : KOLChar ) : Integer; var P, F : PChar; begin P := PChar( S ); {$IFDEF INPACKAGE} F := StrScan( P, Chr ); {$ELSE} F := StrScanLen( P, Chr, Length( S ) ); {$ENDIF} Result := -1; if (F = nil) or (S = '') then Exit; Result := Integer( F ) - Integer( P ) {$IFDEF INPACKAGE} + 1 {$ENDIF}; if {(Result > Length(S)) or} (S[ Result ] <> Chr) then Result := -1; end; Кроме объявления ничего и нет. В самом начале строка S - WideString приводится к PChar...да и потом Ansi-версия StrScanLen откуда-то взялась...Еще один вопрос.
А чем собственно результат IndexOfChar(S, Chr) отличается от Pos(Chr, S)? Или я чего-то недопонимаю?
В любом случае, в 2.87 IndexOfChar не работает с UNICODE.
-
-
скинул б сюда исправление, видимо у Владимира времени нету просто...
-
> скинул б сюда исправление
Всё есть по ссылке. Это очень небольшой фикс, но лично для меня очень важный.
-
А меня все так и интересует вопрос: А чем собственно результат IndexOfChar(S, Chr) отличается от Pos(Chr, S)? Или я чего-то недопонимаю?
-
либо что б не юзать встроенную функцию Pos, либо для поддержки уникода, либо чтоб параметры местами поменять, либо я хз =)
-
Перемена параметров тут не при чем. Вопрос в другом. Результат IndexOfChar(S, Chr) и Pos(Chr, S) чем-нибудь отличается?
-
Не уловил суть вопроса.. я так понял обновление кол у тебя есть, а почему бы не проверить?) лично я не обновлялся
-
Pos ведь с подстрокой работает ? или в дельфях есть оптимизация на Pos(char...) ??? значит IndexOf должен быстрее работать.
-
Ну, т.е. результат один и тот же... Да, работает с подстрокой, и медленнее, поэтому по совету mdw, заменил код в IndexOfChar на:
Result := -1;
if S = '' then exit;
for I := 1 to Length(S) do
begin
if S[I] = Chr then
begin
Result := I;
break;
end;
end;
-
Где новая версия? Что то не нашел.
-
На сайте Кладова лежит обновление...
-
KOL.pas (2.87) строка 39975 procedure TTrayIcon.SetTrayIcon(const Value: DWORD);
Move( FTooltip[1], NID.szTip[0], Min( 63, L ) );
почему-то не корректно работает при UNICODE_CTRLS, копирует только половину символов строки с текстом подсказки.
-
Интересно и где же это его сайт?
-
-
to MTsv DN replace repne scasb in StrScanLen to
REPNE SCASB
REPNE SCASW
would be a lesser dirty workaround. sure make the Char in defination changed to KOLChar first.
-
I am sorry, first line should be {$IFNDEF UNICODE_CTRLS}
-
Кажется, "официального" исправления этих ошибок не будет. MTsv DN, может быть стоит пофиксить это всё и прикрутить к версии KOL, той, что на сайте?
-
столкнулся с неприятным эффектом. на клиентской машине не влезший в чекбокс текст (из-за другой ширины текста судя по скриншоту) сделал этот самый чекбокс многострочным. Однако у меня четко указано, что wordwrap:=false. в редакторе свойств, а не в коде конечно же. я так полагаю это следствие политики "невмешательства" активно используемой в KOL? и глюк вышел из того факта, что умолчания у двух систем разные. Мне делать wordwrap:=false принудительно своим кодом? раз уж МСК ленится.
-
Что-то Владимир пропал, с марта тишина...:( Ау!!!
Нашел еще баг. В KOLAdd.pas с опцией TLIST_FAST. Наткнулся в PTree, но и в PBits и, кажется в PFastStrListEx, то же самое. Заключается в следующем. Там (в KOLAdd.pas) активно используется приведение: PCrackList( fList ).fXXXX или PCrackList( fChildren ).fXXXX Что и приводит к краху, если элементов списка больше 256. Нужно или обращаться к свойствам списка и PCrackList вообще убирать, или при создании списка ставить: {$IFDEF TLIST_FAST}fList.UseBlocks:= False;{$ENDIF} Пока поправил у себя так, а как лучше сделать Владимир пусть принимает решение...
|