Форум: "KOL";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
ВнизВерсия 2.83 Найти похожие ветки
← →
Vladimir Kladov © (2007-10-12 23:32) [0]
Новости от 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, соответствующий пункт
системного меню теперь делается недоступным.
← →
thaddy (2007-10-13 02:22) [1]++++ for this year...
← →
Robt © (2007-10-16 15:13) [2]А ТОРМОЗА КАНВАСА+БИТМАП ПРИ РИСОВАНИИ БУДУТ ПРАВИЦА ?
← →
homm © (2007-10-16 15:15) [3]> [2] Robt © (16.10.07 15:13)
Какие тормоза?
← →
Elec3C © (2007-10-16 17:18) [4]Хм!? На сайте только 2.80 версия (http://www.kolnmck.ru/files1.shtml).
← →
SergeR © (2007-10-16 17:21) [5]http://kolmck.net/r_updates.htm
← →
Vladimir Kladov © (2007-10-16 19:45) [6]НЕТ НЕ БУДУТ
Объявлется переменная C: PCanvas; присаивается и дальше используется, вместо того чтобы её каждый раз получать заново.
← →
Robt © (2007-10-17 08:13) [7]
> Объявлется переменная C: PCanvas; присаивается и дальше
> используется, вместо того чтобы её каждый раз получать заново.
>
а в битмапе канвас пересоздается при каждой операции рисования типа lineto ?
← →
Vladimir Kladov © (2007-10-17 15:16) [8]Разберитесь. Что спрашивать? Или я должен помнить каждый нюансик в 100000 строк кода? Мне непонятно вообще, зачем в том примере, что был приведён выше, через канву рисовать. Есть гораздо более быстрый способ. ScanLine[] есть, формат битмапа знаете. И вперёд.
← →
mdw © (2007-10-18 11:37) [9]Владимир, очередной баг в TLIST_FAST. Вот простейший пример:
procedure TMainForm.Button2Click(Sender: PObj);
var SLE: PStrListEx;
i: Integer;
begin
SLE:= NewStrListEx;
for i:= 0 to 100000 do begin
SLE.AddObject(Int2Str(Random(1000)), i);
end;
SLE.Sort(False); // здесь валится
SLE.Free;
end;
← →
mdw © (2007-10-18 11:46) [10]К предыдущему посту. Проявляется только на ASM_VERSION.
← →
Vladimir Kladov © (2007-10-18 15:59) [11]Посмотрю.
← →
Vladimir Kladov © (2007-10-18 21:09) [12]Надо в процедурах сортировки {$IFDEF ASM_VERSION} заменить на ...ASM_TLIST} и такие же скобки добавить в KOL_ASM.inc. Процедуры CompareStrListItems и CompareAnsiStrListItems. Т.е. попросту отключить асм для них двух.
← →
mdw © (2007-10-19 11:00) [13]Владимир, спасибо. Вроде заработало (TLIST_FAST). Еще потестирую конечно, но пока работает.
← →
mdw © (2007-10-22 19:23) [14]Владимир, заметил небольшой баг при генерации кода для создания меню.
Вот код полученный с помощью 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.
← →
Vladimir Kladov © (2007-10-22 21:10) [15]У меня вызывается. Так что дело не в этом (если у вас не вызывается).
← →
mdw © (2007-10-23 00:33) [16]Владимир, это маин меню, которое в строчку под заголовком формы.
← →
mdw © (2007-10-23 12:32) [17]Владимир, вот минимальный проект www.kolnmck.ru/Test.rar.
Я туда же mirror.pas положил с изменениями.
← →
mdw © (2007-10-23 14:03) [18]Еще исправление для 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 14:30) [19]Еще баг для 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 16:22) [20]Владимир, опять про 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;
← →
Vladimir Kladov © (2007-10-23 18:14) [21]Нет, майн не тестировал У меня как-то так получилось, что майн меню перекрашивать не пришлось. Значит, если поменять порядок, то работает? Да, так вроде пашет, даже что-то рисует если код добавить.
По TLIST_FAST пробежал с грабляси (ctrl+F), еще до кучи нашёл. В обновлении будет. В основном это для контролов если дочерних > 256, так что не особо печально. Но есть места в DirList"е, а там почти наверняка может оказаться > 256 файлов в директории.
← →
Vladimir Kladov © (2007-10-23 18:30) [22]Лучше поставить от последнего к первому. Я еще как сейчас помню, лет так 9-10 назад, когда этот цикл, задумался на минуту: надо ли обращать порядок уничтожения. И мне тогда показалось, что не надо. Оказалось спустя 10 лет что всё-таки было надо :))
← →
Vladimir Kladov © (2007-10-23 19:29) [23]А нет, тогда я пришёд к тому что лучше обращать. Наверное просто из соображений экономии кода. Ав от сейчас - с тлист-фаст, экономии кода не получается. Но он и не для экономии кода, вообще. Надо все-таки обрашать, мало ли где еще ружжо выстрелит. К обновлению перепишу цикл по-простому.
← →
Barloggg (2007-10-24 16:44) [24]хм. а почему по умолчанию для ScrollBox выключен AcceptChildren?
Это какой-то хитрый план?
← →
Barloggg (2007-10-24 16:46) [25]и кстати у группбокса тоже
← →
Barloggg (2007-10-24 18:16) [26]эмм... а как средствами КОЛ переименовать файл?
я увидел процедуру DoFileOP которая вроде как должна этим заниматься.
правда она по скобкой WIN_GDI.
Указал эту директиву.
Но дельфи не может найти константу FO_RENAME!
Нашел ее поиском. оказалось что эта константа спрятана под еще одной директивой WIN. Лады, ввел эту директиву тоже.
Но и тогда она не нашлась!
Даже в книгу полез. Там вообще про файловые операции - ни слова.
Дальнейшее разглядывание выявило, что эта константа вообще находится в секции implementation.
Это, извините, зачем? План не просто хитрый, но еще и крепкий? или эта процедура только для внутренних целей предназначена?
Заменив константы их значениями требуемое поведение кода было достингуто, но недоумение осталось.
← →
ANTPro © (2007-10-24 19:15) [27]> [26] Barloggg (24.10.07 18:16)
Чем это не устраивает?function RenameFile(const OldName, NewName: string): Boolean;
← →
Vladimir Kladov © (2007-10-24 22:04) [28]В скроолбокс забыл включить. Точнее, по ошибке включил в скролбаре вместо скролбокса. У себя поправил уже, в 2.84 будет.
Если у вас не WIN и не GDI, то зачем их включать. Не проще ли найти константу и поставить в параметре числовое значение, которое её соответствует.
← →
homm © (2007-10-24 22:07) [29]> [28] Vladimir Kladov © (24.10.07 22:04)
> в 2.84 будет.
Владимир, а вот это будет? (вдруг не видели…)
http://delphimaster.net/view/11-1163789456/
← →
Vladimir Kladov © (2007-10-24 22:29) [30]Видел уже, вчера расшифровывал вашу шифрограимму :)
← →
Barloggg (2007-10-25 11:49) [31]
> 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
← →
mdw © (2007-10-25 13:07) [32]
> дык елы палы НЕТУ функции RenameFile в kol.pasзато есть
> в SysUtils.pas, а это, извините, уже VCL.
Зато в Windows есть MoveFile.
← →
ANTPro © (2007-10-25 19:37) [33]> [31] Barloggg (25.10.07 11:49)
Мега сложная функция :)function RenameFile(const OldName, NewName: string): Boolean;
begin
Result := MoveFile(PChar(OldName), PChar(NewName));
end;
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.053 c