-
Сделал слияние изменений за 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
Изменена генерация констант для пунктов меню: теперь они декларируются как безтиповые, т.е. неизменяемые константы.
-
Thank you very, very much!
-
C Богом!
-
по сравнению с последними 2.88 установка прошла идеально :)
-
Сравнил с тем что у меня. Кое что нашел. KOLAdd.pasprocedure 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.pas1.В оконной функции 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';
Пустячек, но все же....:)
-
> Еще в 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 и т.д...)
-
С пакетом для 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 я не использую, это исключительно не моя инициатива. Если считаете так более правильно, сделаем по-вашему. Если у кого-то есть возражения, пусть высказываются.
-
Посмотрел DemoLVCustomDraw. После небольшик поправок в коде все пошло и без обращения к Canvas в KOL.pas. Буду смотреть еще.
-
> Пример иконки можно.
несколько иконок положил в архив kolnmck.kolmck.net/Icons.zip
> Посмотрел DemoLVCustomDraw. После небольшик поправок в коде > все пошло и без обращения к Canvas в KOL.pas. Буду смотреть > еще.
У меня обращение к Canvas уже давно закоментированно, каких либо проблем не замечал.
-
несколько иконок положил в архив Что-то не плучается загрузить, и с вашим исправлением тоже: --------------------------- Form1 --------------------------- Can not create DIB section, error: 0, The operation completed successfully. --------------------------- OK --------------------------- Т.е. DIB загрузился, маска загрузилась, прежде чем вызывать CreateIconIndirect, код пытается получить хэндлы загруженных битмаов - ImgBmp и MskBmp. И вот так ломается вызов CreateDIBSection. Что-то еще изменяли или у вас новая версия виндов? У меня ХР 32бита.
-
А, кажется, догоняю: для MskBmp наверное надо почистить biCompression, это на нем не может дескриптор получить. С ImgBmp все как раз в порядке. Кстати, система эти иконки никак не показывает, ни в папке, ни в системном Preview. С трудом (криво) изобразил только Irfan.
-
А, у вас же так и написано. А я и не заметил. Да, теперь грузится. Я сейчас выложу обновленный KOL.pas отдельно, ссылку сюда брошу.
-
http://kolmck.net/KOL289+.rarВнутри лежит проект для тестирования скорости TStrList(Ex).Find, T(W)StrList(Ex).IndexOf для всех 4 случаев. Переделал, чтобы учитывалось, как сортировалось - с учетом регистра или без, Ansi или просто Ascii. Find для TWStrList е делал.
-
> Кстати, система эти иконки никак не показывает, ни в папке, > ни в системном Preview. >
Странно. У меня показывает.... Выглядит вот так: kolnmck.kolmck.net/Untitled-1.jpg
OS: WinXP 32, SP3 (сборка 2600.xpsp.080413-2111).
-
> Странно. У меня показывает.... Выглядит вот так:
Я собственно поэтому и ковыряться с ними стал: система открывает, а программа - фиг! Обидно..:)
-
> http://kolmck.net/KOL289+.rarВнутри лежит проект для тестирования > скорости TStrList(Ex).Find, T(W)StrList(Ex).IndexOf для > всех 4 случаев. Переделал, чтобы учитывалось, как сортировалось > - с учетом регистра или без, Ansi или просто Ascii. Find > для TWStrList е делал.
Спасибо. Потестирую, если что еще найту, отпишу.
-
Dy1, а на какую версию делфи прежняя не вставала?
Vladimir Kladov, почему бы не перейти на свн? было гораздо проще..
СВН версию смешал с 2.89
-
неушто пришло счастие и автор сел на безSOLевую диету и вспомнил про свое дитя?
-
Вот поправил малях:
function TStrList.Find(const S: AnsiString; var Index: Integer): Boolean; var L, H, I, C: Integer; begin Result := FALSE; if FCount = 0 then Exit; ....
Без этой проверки падает, если список пустой.
-
По мне так лучше пусть падает. 1 раз на отладке упадет, программист обеспечит правильную последовательность вызовов, и все. В любом случае Find нельзя вызывать на неотсортированном списке, а проверить, что в нем далали изменения после сортировки - никак не возможно, опять же вся надежа на программиста. Но если вы считаете так более правильным, сделаем так. Хотя я бы предпочел Assert и однозначное падение, хотя оно и так однозначное, т.к. указатели на функции = nil.
-
Владимир, вот кусок кода где сегодня словил 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() пустой он или нет....
-
Согласен, пусть будет. Еще что-нибудь? До выходных жду, потом оформлю как 2.90, как раз круглое число будет.
-
> потом оформлю как 2.90, как раз круглое число будет.
:) У меня вроде пока усё.:) Сегодня собрал, выложил софт, если в ближайшее время благодарные пользователи не возопят, то критических ошибок нет, т.к. используют непрерывно и интенсивно. Хотя там, в основном математика, интерфейса - одна панель с меню для выбора действия... но уже часа 4 работает без ошибок :)
-
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 надо закомментировать, иначе краш системы (до ресета) в Windows 98 (если кому интересно)
-
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 JNZ @@exit
CALL GetVersion XCHG EDX, EAX
XOR EAX, EAX
TEST EDX, EDX
XCHG DL, DH
JL @@platform_9x
MOV AL, wvNT
CMP DX, $0400
JZ @@save_exit
INC AL CMP DX, $0500
JZ @@save_exit
INC AL CMP DX, $0501
JZ @@save_exit
INC AL CMP DX, $0502
JZ @@save_exit
INC AL CMP DX, $0600
JZ @@save_exit
INC AL CMP DX, $0601
JZ @@save_exit
@@platform_9x:
CMP DH, 4
JB @@save_exit INC AL CMP DX, $040A
JB @@save_exit
INC AL CMP DX, $045A
JB @@save_exit
INC AL @@save_exit:
MOV byte ptr [SaveWinVer], AL
@@exit:
end;
-
Если кому интересно. Файл MCKAppExpert200x. Заменить: dlg.Filter := '*.dpr'; на dlg.Filter := 'DPR files|*.dpr'; dlg.Filter := '*.pas'; на dlg.Filter := 'PAS files|*.pas'; Для корректной работы в Windows 7
-
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 JNZ @@exit
CALL GetVersion XCHG EDX, EAX
XOR EAX, EAX
TEST EDX, EDX
XCHG DL, DH
JL @@platform_9x
MOV AL, wvNT
CMP DX, $0400
JZ @@save_exit
INC AL SUB DX, $0500
JZ @@save_exit
INC AL DEC DX
JZ @@save_exit
INC AL DEC DX
JZ @@save_exit
INC AL CMP DX, $0600 - $0502
JZ @@save_exit
INC AL JMP @@save_exit
@@platform_9x:
CMP DH, 4
JB @@save_exit INC AL CMP DX, $040A
JB @@save_exit
INC AL CMP DX, $045A
JB @@save_exit
INC AL @@save_exit:
MOV byte ptr [SaveWinVer], AL
@@exit:
end; ?
-
ExtractFilePath > путь 'C:aaa.txt' Я дико извиняюсь...а что такой путь возможен? 8) С таким же успехом можно любую строчку как путь в качестве примера привести.
> function AnsiEq - почему непонятно? Я параметр на KOLString поменял глядя на реализацию. -> AnsiCompareStrNoCase(S1, S2:KOLString). Иначе лишние конверсии строк замедляют в случае UNICODE_CTRL. Вы не поняли. Вопрос был: почему в KOL_ASM.inc все еще используется AnsiString. То же самое для procedure TDirList.ScanDirectoryEx.
WinVer Как угодно, если Ваш код работает. У меня щас не на чем проверить. Просто Вы асм-версию отключили, вот решил "подкинуть" рабочий код.
-
Вообще-то при каких-то условиях путь такой возможен. Вот код (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; и преобразование результата. А для второго
procedure TDirList.ScanDirectoryEx , т.е. ассемблер отрубается для UNICODE_CTRLS. Как и раньше было, собственно. WinVer Мне тоже не на чем, да я и не собираюсь ставить Висту-Семерку. Просто если выйдет (не дай, не дай) версия 8, то предложенная Вами версия станет показывать что-то типа WinME, будет смешно :)
-
А нет, не WinME. Выйдет за пределы диапазона значений. Будет что-то типа Seven+3.
-
почему в KOL_ASM.inc все еще используется AnsiString Пардон. Ошибся.
-
Спасибо, Владимир! KOL.PAS строка 13256
А в архиве с KOL2.89 поставляется MCKfakeClasses.inc. Или я что-то пропустил?
-
Видать, я всё-таки что-то пропустил :) SVN лежит, где взять этот MCKfakeClasses200x.inc ?
-
KOL.pas Описание: различие interface/implementation объявлений параметров функций: interface function SeekMemStream( Strm: PStream; const MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize; implementation function SeekMemStream( Strm: PStream; const MoveTo: TStrmMove; MoveFrom: TMoveMethod ): TStrmSize; аналогично и для SetSizeMemStream, ReadMemStream, WriteMemStream, WriteExMemoryStream в KOL_ASM.inc объявления совпадают.
-
KOL.pas Метод SetName обекта TObj. Описание: переопределение значения константы NewName в теле метода. Компилятор: D140,D200,FPC2xx. ...
if FOwnerObj.fNamedObjList = nil then
FOwnerObj.fNamedObjList := NewList;
FName := NewName;
for i := 0 to FOwnerObj.fNamedObjList.Count-1 do
begin
if PObj( FOwnerObj.fNamedObjList.Items[ i ] ).FName = NewName then
begin
FName := '';
break;
end;
end;
if FName = '' then
FOwnerObj.fNamedObjList.Remove( @ Self )
else
if FOwnerObj.fNamedObjList.IndexOf( @ Self ) < 0 then
FOwnerObj.fNamedObjList.Add( @ Self );
...
-
#issue_289 KOL_ASM.inc Описание: различие interface/implementation объявлений параметров функций, предполагалось: kol_asm.implementation [4183]function TStream.Write(var Buffer; const Count: TStrmSize): TStrmSize; //Dimaxx © (28.10.08 02:41) kol_asm.implementation [4190]function TStream.Seek( const MoveTo: TStrmMove; MoveMethod: TMoveMethod): TStrmSize; //Dimaxx © (28.10.08 02:41)
-
По поводу SetName - это для оптимизации? Посмотрите, что будет в этом случае (определены символы Use_names, Unique_names): procedure TForm1.Button3Click(Sender: PObj);
begin
ShowMessage( 'before: <' + Button3.Name + '>' );
Button3.SetName( Form, 'A' );
ShowMessage( 'after: <' + Button3.Name + '>' );
end;
-
Там надо const убрать из декларации.
-
Больше замечаний не будет, как я понимаю. Буду оформлять выпуск.
|