![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Версия 2.37 [Delphi, KOL/MCK, Windows]
Vladimir Kladov © (2006-07-30 21:22:00)Новости KOL и MCK (v2.37):
[+]KOL/MCK: добавлены функция LBItemAtPos и свойство LBTopIndex для использования с listbox'ом, автор ECM .
[-]KOL: некоторые изменения в Scroll Box-элементе, автор ECM .
[-]KOL: исправлена функция NewToolbar (asm-версия), автор ECM .
[-]MCK: добавлено создание Popupmenu для MDIChild, автор Дмитрий Матвеев.
[*]KOL: добавлено свойство OpenReadOnly для TOpenSaveDialog, коллективно.
[-]KOL: метод SetHasBorder исправлен (для более корректного поведения TabStop), автор MTsv DN.
[-]KOL/MCK: использование ActionList исправлено для работы с включенной опцией USE_NAMES (код, генерировавшийся в MCK приводил к исключению AV).
[+]KOL/MCK: добавлены свойства AnchorLeft, AnchorTop и исправлен метод Anchor, автор Sormart.
[*]KOL: метод LVSetItem исправлен, чтобы позволить изменять индекс пиктограммы для любой колонки, автор ... (напомните, пожалуйста, кто автор).
AndreyRus (2006-08-23 01:42:00) [1]Very thanks! Thaddy!
thaddy (2006-08-22 23:09:00) [2]Here's a very usefull demonstration of this efficient code generation.
It is hard to optimize by hand (the loop!). I have an even faster version for PChars but that would not allow for #0. Try it on a very, very long string!
The compiler is really good at optimizing sets.
Maybe a good, usefull addition to kol.pas?
Type
Tcharset = set of #0..#255;
// Function returns index of first character found or -1 if
// none of the characters is found
function IndexOfAny(const s:string;c:TCharset):integer;
var
i:integer;
begin
Result := -1;
for i:= 1 to length(S) do
if S[i] in C then
begin
Result := i;
Break;
End;
end;
ANTPro (2006-08-22 21:38:00) [3]Да действительно не знал ... учту на будущее:
if (C <> #10)and(C <> #0) then Position := Position - 1;
cmp byte ptr [esi],$0a
jz +$16
cmp byte ptr [esi],$00
jz +$11
if not ( C in [ #0,#10] ) then Position := Position - 1;
mov al,[esi]
test al,al
jz +$15
sub al,$0a
jz +$11
Может кому пригодиться :)
PS: Можно ли добавить в KOL возможность выбирать ипользовать ли ActiveX или нет, а то по умолчанию он включается в компиляцию, чем увеличивает размер на 1024 байта. Думаю 1кб {$SMALLEST_CODE} не помешает :)
thaddy (2006-08-22 19:16:00) [4]I can confirm this bug.
This generates more efficient code:
if not (C in [ #0,#10] ) then position := position -1;
ANTPro (2006-08-22 18:43:00) [5]Если читать файл только через ReadStr (т.е. по строкам), и если последний байт файла будет равен 13, то прога повиснет :(
Патч:
//[function TStream.ReadStr]
function TStream.ReadStr: String;
...
if (C <> #10) and(C <> #0)then Position := Position - 1;
...
end;
Vladimir Kladov (2006-08-04 10:14:00) [6]Понятно теперь. Не в битмапе, а в его размере. Я проверял 40х40, там вообше ничего не проявлялось. Вот минимально необходимое исправление.
procedure TBitmap.Convert2Mask(TranspColor: TColor);
asm
...
@@nextline:
TEST DL, DL
JZ @@nx1
CMP DL, 8
JE @@nx1
@@finloop1:
,,,
end;
{$ELSE ASM_VERSION} //Pascal
procedure TBitmap.Convert2Mask(TranspColor: TColor);
...
END;
if (C > 0) and (C < 8) then
...
end;
{$ENDIF ASM_VERSION}
ANTPro (2006-08-04 00:22:00) [7]Bitmap тут не причем
procedure TForm1.Button1Click(Sender: PObj);
var
BMP:PBitmap;
begin
// BMP:=NewBitmap(257,257);//Нет бага
BMP:=NewBitmap(256,256);//Есть
// BMP:=NewBitmap(257,256);//Нет бага
// BMP:=NewBitmap(256,257);//Есть
BMP.DrawTransparent(Form.Canvas.Handle,0,0,0);
BMP.Free;
end;
Vladimir Kladov (2006-08-03 20:30:00) [8]Про глюк с button слышу впервые. Решение простое.
procedure TControl.GraphicButtonMouse(var Msg: TMsg);
var Pt: TPoint;
begin
CASE Msg.message OF
WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
begin
GraphButtonSetFocus;
RefInc;
SetCapture( Parent.Handle );
Parent.fPushedBtn := @ Self;
fPushed := TRUE;
Invalidate;
end;
WM_LBUTTONUP:
begin
ReleaseCapture;
Invalidate;
if fPushed then
begin
Pt.X := SmallInt( LoWord( Msg.lParam ) );
Pt.Y := SmallInt( HiWord( Msg.lParam ) );
if PtInRect( ClientRect, Pt ) then
DoClick;
fPushed := FALSE;
Parent.fPushedBtn := nil;
RefDec;
end;
end;
END;
end;
Про прозрачность: этот код все рисует правильно. Черный становится прозрачным. Только черный должен быть именно 0,0,0, а не каким-то еще цветом. Я проверил. Если есть возражения, высылайте битмап, или ссылку дайте, где взять.
ANTPro (2006-08-03 18:15:00) [9]
procedure TForm1.Button1Click(Sender: PObj);
var
BMP:PBitmap;
begin
BMP:=NewBitmap(0,0);
BMP.LoadFromFile('BMP.BMP');
BMP.DrawTransparent(Form.Canvas.Handle,0,0,0);
BMP.Free;
end;
Если первые 8 бит BMP.BMP будут Черными, то они и остануться черными, а не прозрачными.
D[u]fa (2006-08-03 14:47:00) [10]а что это за режим такой?
AndreyRus (2006-08-03 11:18:00) [11]
> По-прежнему остается глюк с KolButton в not windowed режиме.
IMHO, смысла в использовании контролов с windowed:= false нет.
miek (2006-08-03 08:04:00) [12]По-прежнему остается глюк с KolButton в not windowed режиме. Если кликнуть на форме, не отпуская перетащить курсор на кнопку и отпустить - она исчезает навсегда:(
AndreyRus (2006-08-02 23:08:00) [13]> Первые 8 бит НЕ прозрачные
8 бит чего?
ANTPro (2006-08-02 21:07:00) [14]AndreyRus (02.08.06 16:05) [6]
А в чем это собственно проявляется?
Первые 8 бит НЕ прозрачные
AndreyRus (02.08.06 16:05) [6]
А где код?
Он пока не держит любой Bitmap Width и/или Height которого не кратны 8
AndreyRus (2006-08-02 16:05:00) [15]
> В версиях 2.30,2.35,2.36,2.37 есть баг в Convert2Mask.(В
> 1.91 все работает)Появляется при отрисовке Bitmap'a 640x480x15
> (DrawTransparent)
А в чем это собственно проявляется?
> Мой код делает маску в 2 раза быстрее.
А где код? Вижу только закомментированный участок функции Convert2Mask.
D[u]fa (2006-08-02 12:55:00) [16]Маску менять не пробовал, но обновление тоже не работает, скачал комплект с http://www.kolnmck.ruи всё норм =)
ANTPro (2006-07-31 22:12:00) [17]В версиях 2.30,2.35,2.36,2.37 есть баг в Convert2Mask.(В 1.91 все работает)
Появляется при отрисовке Bitmap'a 640x480x15 (DrawTransparent)
Патч:
///////////////////////////
procedure TBitmap.Convert2Mask(TranspColor: TColor);
...
MOV DL, 8
@@32_1: ADD ESI, 4
LOOP @@Xloop_pf32bit
@@nextline:
{ TEST DL, DL
JZ @@nx1
@@finloop1:
SHL AL, 1
DEC DL
JNZ @@finloop1
STOSB
@@nx1: }
POP EDX
INC EDX
JMP @@Yloop
@@exit:
POP EDX
...
end;
end;
end;
END;
{ if C > 0 then
begin
while C > 0 do
begin
B := B shl 1;
dec( C );
end;
Dst^ := B;
end; }
end;
Assign( TmpMsk );
TmpMsk.Free;
end;
{$ENDIF ASM_VERSION}
///////////////////////////
PS: Мой код делает маску в 2 раза быстрее.
MTsv DN (2006-07-31 14:13:00) [18]Привет...
Обновление можно скачать с http://www.kolnmck.ru...
С Уважением MTsv DN
L`Autour (2006-07-31 11:30:00) [19]Обновление на 2.37 криво работает:
с 2.30 на 2.37 ругается на KOLDirDlgEx.pas,
с 2.36 на 2.37 ругается на mirror.pas
GMax (2006-07-30 22:50:00) [20]текущее решение по LVSetItem моё, ECM предлагал вообще от "if Col = 0 then" избавиться