![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Версия 2.83 [Delphi, KOL/MCK, Windows]
Vladimir Kladov © (2007-10-12 23:32:00)
Новости от 12 октября 2007 (KOL & MCK v2.83)
[-] Исправлен метод TList.Assign. Спасибо mdw за bug-репорты касаемо
TList и символа TLIST_FAST.
[-] Для символа TLIST_FAST, исправлено свойство TStrList.Text и
использующие его методы LoadFromFile, SaveToFile и.т.д.
[-] Для ASM_VERSION, исправлена функция CallTControlCreateWindow (не
возвращала полученный от CreateWindow результат. Это приводило к багам
в случае частого пересоздания окон).
[+] ToGRush усовершенствован: исправлен scrollbar, все scrollbar-ы
включая в выпадающем списке combo, теперь могут быть замещены для
стиля GRush, кнопка со стрелкой в combo так же в стиле GRush.
Так же, в KOL: добавлен стиль esSolid к списку типа TEdgeStyle (для
панелей), чтобы позволить создание простой панели esNone без
прозрачности вместо GRush-панели, при необходимости (обычная панель
всё-таки намного быстрее, и больше подходит для случаев больших
панелей, которые еще и могут изменять свой размер. Установкой
соответствующего общему стилю цвета (Color) вполне можно добиться
единства внешнего вида, тем не менее).
Так же, в MCK: для ряда контролов, могущих иметь внутренние линейки
прокрутки, доступно свойство OverrideScrollbars. Значение его true по
умолчанию, но генерируемый код заключается в скобки {$IFDEF
OVERRIDE_SCROLLBARS}...{$ENDIF}. Т.о., для замены скроллбаров при
использовании ToGRush, достаточно добавить символ OVERRIDE_SCROLLBARS
к опциям проекта. Писатели компонентов (контролов с внутренними
скроллами) должны так же присвоить TRUE полю fHasScrollbars2Override
(protected), для обеспечения генерации соответствующего кода.
Разумеется, всегда можно вызывать функцию OverrideScrollbars в своём
коде (если не используется MCK или контрол в зеркале не поддерживает
свойство OverrideScrolbars).
См так же новую версию KOLDirDlgEx (в архиве KOLadd.zip), который
использует возможность переопределения прокруток на стиль GRush, когда
включён символ USE_GRUSH.
[*] Свойство ParentWindow теперь всегда возвращает дескриптор
родительского окна, независимо от того, является ля родительское окно
"своим" или "чужим" (установленным функцией API SetParent).
[-] Процедуры TControl.DoSetFocus и WndProcForm (asm-версии)
исправлены (обнаружены небольшие баги, ранее себя серьёзно не
проявлявшие, но мешавшие корректной работе заменителей прокруток в
стиле GRush).
[-] TControl.SetCaption - исправлена asm-версия: у LabelEffect
заголовок не изменялся при присваивании значения (не вызывался метод
Invalidate. Вместо того, вызывался лишний Invalidate для обычной
метки).
[+] Для форм со свойством CanResize = FALSE, соответствующий пункт
системного меню теперь делается недоступным.
ANTPro (2007-10-25 19:37:00) [1]> [31] Barloggg (25.10.07 11:49)
Мега сложная функция :)
function RenameFile(const OldName, NewName: string): Boolean;
begin
Result := MoveFile(PChar(OldName), PChar(NewName));
end;
mdw (2007-10-25 13:07:00) [2]
> дык елы палы НЕТУ функции RenameFile в kol.pasзато есть
> в SysUtils.pas, а это, извините, уже VCL.
Зато в Windows есть MoveFile.
Barloggg (2007-10-25 11:49:00) [3]
> ANTPro © (24.10.07 19:15) [27]
> > [26] Barloggg (24.10.07 18:16)
> Чем это не устраивает?
>function RenameFile(const OldName, NewName: string): Boolean;
дык елы палы НЕТУ функции RenameFile в kol.pas
зато есть в SysUtils.pas, а это, извините, уже VCL.
> Vladimir Kladov © (24.10.07 22:04) [28]
> Если у вас не WIN и не GDI, то зачем их включать. Не проще
> ли найти константу и поставить в параметре числовое значение,
> которое её соответствует.
Ну, я так и сделал (см [26]), но нафига спрашивается нужны тогда константы? только дезориентируют.
А зачем сделано это:
> Если у вас не WIN и не GDI
Vladimir Kladov (2007-10-24 22:29:00) [4]Видел уже, вчера расшифровывал вашу шифрограимму :)
homm (2007-10-24 22:07:00) [5]> [28] Vladimir Kladov © (24.10.07 22:04)
> в 2.84 будет.
Владимир, а вот это будет? (вдруг не видели…)
http://www.delphimaster.ru/cgi-bin/forum.pl?n=10&id=1163789456
Vladimir Kladov (2007-10-24 22:04:00) [6]В скроолбокс забыл включить. Точнее, по ошибке включил в скролбаре вместо скролбокса. У себя поправил уже, в 2.84 будет.
Если у вас не WIN и не GDI, то зачем их включать. Не проще ли найти константу и поставить в параметре числовое значение, которое её соответствует.
ANTPro (2007-10-24 19:15:00) [7]> [26] Barloggg (24.10.07 18:16)
Чем это не устраивает?
function RenameFile(const OldName, NewName: string): Boolean;
Barloggg (2007-10-24 18:16:00) [8]эмм... а как средствами КОЛ переименовать файл?
я увидел процедуру DoFileOP которая вроде как должна этим заниматься.
правда она по скобкой WIN_GDI.
Указал эту директиву.
Но дельфи не может найти константу FO_RENAME!
Нашел ее поиском. оказалось что эта константа спрятана под еще одной директивой WIN. Лады, ввел эту директиву тоже.
Но и тогда она не нашлась!
Даже в книгу полез. Там вообще про файловые операции - ни слова.
Дальнейшее разглядывание выявило, что эта константа вообще находится в секции implementation.
Это, извините, зачем? План не просто хитрый, но еще и крепкий? или эта процедура только для внутренних целей предназначена?
Заменив константы их значениями требуемое поведение кода было достингуто, но недоумение осталось.
Barloggg (2007-10-24 16:46:00) [9]и кстати у группбокса тоже
Barloggg (2007-10-24 16:44:00) [10]хм. а почему по умолчанию для ScrollBox выключен AcceptChildren?
Это какой-то хитрый план?
Vladimir Kladov (2007-10-23 19:29:00) [11]А нет, тогда я пришёд к тому что лучше обращать. Наверное просто из соображений экономии кода. Ав от сейчас - с тлист-фаст, экономии кода не получается. Но он и не для экономии кода, вообще. Надо все-таки обрашать, мало ли где еще ружжо выстрелит. К обновлению перепишу цикл по-простому.
Vladimir Kladov (2007-10-23 18:30:00) [12]Лучше поставить от последнего к первому. Я еще как сейчас помню, лет так 9-10 назад, когда этот цикл, задумался на минуту: надо ли обращать порядок уничтожения. И мне тогда показалось, что не надо. Оказалось спустя 10 лет что всё-таки было надо :))
Vladimir Kladov (2007-10-23 18:14:00) [13]Нет, майн не тестировал У меня как-то так получилось, что майн меню перекрашивать не пришлось. Значит, если поменять порядок, то работает? Да, так вроде пашет, даже что-то рисует если код добавить.
По TLIST_FAST пробежал с грабляси (ctrl+F), еще до кучи нашёл. В обновлении будет. В основном это для контролов если дочерних > 256, так что не особо печально. Но есть места в DirList'е, а там почти наверняка может оказаться > 256 файлов в директории.
mdw (2007-10-23 16:22:00) [14]Владимир, опять про TLIST_FAST.
Возникла ошибка при разрушении меню при кол-ве элементов >= 256. Причина в TList.ReleaseObjects. Там цикл разрушения идет от 0 to Count. Т.е. сперва разрушается 0 элемент, затем 1 и т.д. Но при разрушении меню происходит удаление этого пункта из списка. Результат понятен...
В общем нужно или в TList.ReleaseObjects объекты разрушать с последнего к первому (тогда и TList.Release тоже). Так наверное правильно будет. Вот примерно так поправил:
procedure TList.ReleaseObjects;
...
{$IFDEF TLIST_FAST}
if fUseBlocks and Assigned( fBlockList ) then
begin
for i := fBlockList.Count div 2 - 1 downto 0 do
begin
CountCurrent := Integer( fBlockList.fItems[ i*2+1 ] );
BlockStart := Pointer(Integer(fBlockList.fItems[ i*2 ]) + (CountCurrent-1)*4);
for j := CountCurrent-1 downto 0 do
begin
if BlockStart^ <> 0 then begin
PObj( Pointer( BlockStart^ ) ).Free;
Dec( BlockStart );
end;
end;
end
else
{$ENDIF}
...
Или в function NewMenu(..)добавить Result.FItems.fUseBlocks:= False;
mdw (2007-10-23 14:30:00) [15]Еще баг для TLIST_FAST, ASM_VERSION.
Валится в TStrList.IndexOf() при Count >= 256.
Например:
var SLE: PStrListEx;
i: Integer;
begin
SLE:= NewStrListEx;
for i:= 0 to 256 do SLE.AddObject(Int2Str(random(1000)), i);
SLE.IndexOf('2'); //Здесь падает
mdw (2007-10-23 14:03:00) [16]Еще исправление для TLIST_FAST:
//[function TStrList.GetPChars]
{$IFDEF ASM_TLIST}
{$ELSE ASM_VERSION} //Pascal
function TStrList.GetPChars(Idx: Integer): PChar;
begin
Result := PChar( fList.{$IFDEF TLIST_FAST}Items{$ELSE}fItems{$ENDIF}[ Idx ] )
end;
{$ENDIF ASM_VERSION}
Ну и в KOL_ASM.inc тоже:
{$IFDEF ASM_TLIST}
function TStrList.GetPChars(Idx: Integer): PChar;
asm
MOV EAX, [EAX].fList
MOV EAX, [EAX].TList.fItems
MOV EAX, [EAX+EDX*4]
end;
{$ENDIF}
mdw (2007-10-23 12:32:00) [17]Владимир, вот минимальный проект www.kolnmck.ru/Test.rar.
Я туда же mirror.pas положил с изменениями.
mdw (2007-10-23 00:33:00) [18]Владимир, это маин меню, которое в строчку под заголовком формы.
Vladimir Kladov (2007-10-22 21:10:00) [19]У меня вызывается. Так что дело не в этом (если у вас не вызывается).
mdw (2007-10-22 19:23:00) [20]Владимир, заметил небольшой баг при генерации кода для создания меню.
Вот код полученный с помощью MCK
...
Result.MainMenu1 := NewMenu( Result.Form, 0, [ '11111111' , '3333333', '3333333333', '' ], nil );
...
Result.MainMenu1.Items[ 0 ].OwnerDraw := TRUE;
Result.MainMenu1.Items[ 1 ].OwnerDraw := TRUE;
Result.MainMenu1.Items[ 2 ].OwnerDraw := TRUE;
Result.MainMenu1.OnMeasureItem := Result.MainMenu1MeasureItem;
Result.MainMenu1.OnDrawItem := Result.MainMenu1DrawItem;
...
Так вот, OnMeasureItem не будет ни разу вызван. OwnerDraw := TRUE нужно ставить после назначения события. Наверное нужно переносить назначение OwnerDraw из TKOLMenu.SetupFirst в TKOLMenu.SetupLast.