Вверх ↑
Этот топик читают: Гость
Ответов: 1536
Рейтинг: 176
#31: 2013-08-06 11:54:19 ЛС | профиль | цитата
Galkov писал(а):
На этом форуме принято помогать человеку, который умеет думать.
Замечательные слова, иначе всякий форум превратится в бессмысленный чат.
Galkov писал(а):
То же мне, нашел проблему - перехватить пробел...
Это не проблема, если думать альтернативно, но и не есть правильно.
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 9906
Рейтинг: 351
#32: 2013-08-06 12:12:05 ЛС | профиль | цитата
ser_davkin писал(а):
Замечательные слова

Лучше бы ты это сказал не мне, а той "молодой поросли", которая считает (убеждена!!!), что мы им обещали научить программированию вообще не думая.
Даже анонсом с главной страницы в харю тычут

Я то и так знаю про качество этих слов. А вот объяснять это "выпускникам егэ" приходится в одиночку, без твоей помощи
Ну и народ в депресняк и впадает. В лучших надеждах же обманули. Нарушили их конституционное право быть тупыми
карма: 9

3
Голосовали:nesco, ser_davkin, iarspider
Разработчик
Ответов: 26156
Рейтинг: 2127
#33: 2013-08-06 12:46:15 ЛС | профиль | цитата
Galkov писал(а):
Нарушили их конституционное право быть тупыми

Круто сказано
карма: 22

0
Ответов: 9906
Рейтинг: 351
#34: 2013-08-09 14:58:46 ЛС | профиль | цитата
Вроде нашел...
К уважаемым коллегам просьба: протестировать такой фикс в KOL ("правильном", естественно)

#pas
//[procedure AlignChildrenProc]
{$ifdef ASM_VERSION}
procedure AlignChildrenProc(P: PObj);
const AlignModes = (1 shl byte(caBottom))+(1 shl byte(caTop))+
(((1 shl byte(caRight)) +(1 shl byte(caLeft)))shl 8)+
(((1 shl byte(caClient))+(1 shl byte(caNone)))shl 16);
asm
test eax,eax
jz @@Ret
// с этого места ------------------
btr dword ptr[eax].TControl.fAligning,oaFromSelf
jc @@20
cmp [eax].TControl.fParent,0
setz dl
or dl,[eax].TControl.fisForm
jnz @@20
// до этого ------------------------
or byte ptr[eax].TControl.fAligning,(1 shl oaWaitAlign)
mov eax,[eax].TControl.fParent
@@20:
call @@ToBeAlign
jnz @@DoAlign
@@Ret:
retn

@@ToBeAlign:
.........

У меня заработало. Но у меня же еще "некоторые оптимизации" появились... Несущественные для этого бага, как оказалось.
Почему "32" - так не фига и не понял. Но заработало.
карма: 9

0
Ответов: 211
Рейтинг: 52
#35: 2013-08-10 00:13:15 ЛС | профиль | цитата
Немного запоздал с тестами, но этот с PAS_VERSION и только на KOL3.19
первый объект выступает в качестве parent'а следующему.
align.png
code_31568.txt

Редактировалось 1 раз(а), последний 2017-01-23 05:54:06
карма: 1
слтв
0
файлы: 2align.png [2.7KB] [547], code_31568.txt [1KB] [441]
Разработчик
Ответов: 26156
Рейтинг: 2127
#36: 2013-08-10 00:33:11 ЛС | профиль | цитата
Galkov писал(а):
К уважаемым коллегам просьба: протестировать такой фикс в KOL ("правильном", естественно)

Протестировал, заработало, но артефакты отрисовки все равно остались. Они у меня во всех случаях есть

align_bug_0012.png
карма: 22

0
файлы: 1align_bug_0012.png [4.8KB] [530]
Ответов: 9906
Рейтинг: 351
#37: 2013-08-10 09:48:18 ЛС | профиль | цитата
Странненько...
nesco, покажи весь AlignChildrenProc. Удобным для тебя способом
карма: 9

0
Разработчик
Ответов: 26156
Рейтинг: 2127
#38: 2013-08-10 10:33:53 ЛС | профиль | цитата
Galkov писал(а):
покажи весь AlignChildrenProc

Вот

//[procedure AlignChildrenProc]
{$ifdef ASM_VERSION}
procedure AlignChildrenProc(P: PObj);
const AlignModes = (1 shl byte(caBottom))+(1 shl byte(caTop))+
(((1 shl byte(caRight)) +(1 shl byte(caLeft)))shl 8)+
(((1 shl byte(caClient))+(1 shl byte(caNone)))shl 16);
asm
test eax,eax
jz @@Ret

// cmp [eax].TControl.fParent,0
// setz dl
// or dl,[eax].TControl.fisForm
// btr dword ptr[eax].TControl.fAligning,oaFromSelf
// ja @@20
// с этого места ------------------
btr dword ptr[eax].TControl.fAligning,oaFromSelf
jc @@20
cmp [eax].TControl.fParent,0
setz dl
or dl,[eax].TControl.fisForm
jnz @@20
// до этого ------------------------
or byte ptr[eax].TControl.fAligning,(1 shl oaWaitAlign)
mov eax,[eax].TControl.fParent
@@20:
call @@ToBeAlign
jnz @@DoAlign
@@Ret:
retn

@@ToBeAlign:
mov dl,[eax].TControl.fVisible
or dl,[eax].TControl.fCreateHidden
je @@10
and dl,[eax].TControl.fisForm
jne @@Ret
cmp dword ptr[eax].TControl.fParent,0
je @@11
push eax
mov eax,[eax].TControl.fParent
call @@ToBeAlign
pop eax
@@10:
xor dl,1
or [eax].TControl.fAligning,dl
@@11:
xor dl,1
retn

@@DoAlign:
push ebp
push ebx
push esi
push edi
push AlignModes //00210A14h
sub esp,030h
mov ebx,eax
and byte ptr[ebx].TControl.fAligning,not(1 shl oaWaitAlign)
or byte ptr[ebx].TControl.fAligning,(1 shl oaAligning)
lea edx,[esp+20h] //@CR
call TControl.ClientRect
@@Main:
mov eax,[ebx].TControl.fChildren
mov edi,[eax].TList.fCount
mov ebp,[eax].TList.fItems
jmp @@entry
@@loop:
mov esi,[ebp]
mov al,[esi].TControl.fVisible
or al,[esi].TControl.fCreateHidden
jz @@continue
movzx eax,[esi].TControl.fAlign
bt [esp+30h],eax //Allowed
jnc @@continue
cmp byte ptr[esi].TControl.fNotUseAlign,0
jne @@align
mov edx,esp //@R
mov eax,esi //C
call TControl.GetBoundsRect
mov eax,[esp+0Ch] //R.Bottom
mov [esp+1Ch],eax //H
mov eax,[esp+08h] //R.Right
mov [esp+18h],eax //W
mov eax,[esp+04h] //R.Top
mov [esp+14h],eax //R1.Top
sub [esp+1Ch],eax //H
mov eax,[esp] //R.Left
mov [esp+10h],eax //R1.Left
sub [esp+18h],eax //W
mov edx,[ebx].TControl.fMargin
movzx ecx,byte ptr[esi].TControl.fAlign
loop @@caTop
mov eax,[esp+20h] //CR.Left
sub eax,[esp] //R.Left
add eax,edx //+Margin
mov ecx,[esp+18h] //W
add ecx,edx //+Margin
add [esp+20h],ecx //CR.Left
jmp @@00
@@caTop:
loop @@caRight
mov eax,[esp+24h] //CR.Top
sub eax,[esp+04h] //R.Top
add eax,edx //+Margin
mov ecx,[esp+1Ch] //H
add ecx,edx //+Margin
add [esp+24h],ecx //CR.Top
jmp @@01
@@caRight:
loop @@caBottom
mov eax,[esp+28h] //CR.Right
sub eax,[esp+08h] //R.Right
sub eax,edx //-Margin
mov ecx,[esp+18h] //W
add ecx,edx //+Margin
sub [esp+28h],ecx //CR.Right
@@00:
add [esp],eax //R.Left
add [esp+08h],eax //R.Right
mov eax,[esp+2Ch] //CR.Bottom
sub eax,edx //+Margin
mov [esp+0Ch],eax //R.Bottom
add edx,[esp+24h] //Margin+CR.Top
mov [esp+04h],edx //R.Top
jmp @@caNone
@@caBottom:
loop @@caClient
mov eax,[esp+2Ch] //CR.Bottom
sub eax,[esp+0Ch] //R.Bottom
sub eax,edx //-Margin
mov ecx,[esp+1Ch] //H
add ecx,edx //+Margin
sub [esp+2Ch],ecx //CR.Bottom
@@01:
add [esp+04h],eax //R.Top
add [esp+0Ch],eax //R.Bottom
mov eax,[esp+28h] //CR.Right
sub eax,edx //-Margin
mov [esp+08h],eax //R.Right
add edx,[esp+20h] //Margin+CR.Left
mov [esp],edx //R.Left
jmp @@caNone
@@caClient:
loop @@caNone
mov eax,[esp+2Ch] //CR.Bottom
sub eax,edx //-Margin
mov [esp+0Ch],eax //R.Bottom
mov eax,[esp+28h] //CR.Right
sub eax,edx //-Margin
mov [esp+08h],eax //R.Right
mov eax,[esp+24h] //CR.Top
add eax,edx //+Margin
mov [esp+04h],eax //R.Top
add edx,[esp+20h] //Margin+CR.Left
mov [esp],edx //R.Left
@@caNone:
mov eax,[esp] //R.Left
cmp eax,[esp+08h] //R.Right
jle @@02
mov [esp+08h],eax //R.Right
@@02:
mov eax,[esp+04h] //R.Top
cmp eax,[esp+0Ch] //R.Bottom
jle @@03
mov [esp+0Ch],eax //R.Bottom
@@03:
mov edx,[esp] //R.Left
sub edx,[esp+10h] //R1.Left
mov eax,[esp+04h] //R.Top
sub eax,[esp+14h] //R1.Top
or edx,eax //ChgPos
mov ecx,[esp+08h] //R.Right
sub ecx,[esp] //R.Left
sub ecx,[esp+18h] //W
mov eax,[esp+0Ch] //R.Bottom
sub eax,[esp+04h] //R.Top
sub eax,[esp+1Ch] //H
or eax,ecx
jz @@04
and byte ptr[esi].TControl.fAligning,not(1 shl oaWaitAlign)
or byte ptr[esi].TControl.fAligning,(1 shl oaFromSelf)
@@04:
or eax,edx
jz @@align
mov edx,esp //@R
mov eax,esi //C
call TControl.SetBoundsRect
@@align:
test byte ptr[esi].TControl.fAligning,(1 shl oaWaitAlign)
jz @@continue
mov eax,esi //C
call @@DoAlign
@@continue:
test byte ptr[ebx].TControl.fAligning,(1 shl oaAligning)
jz @@exit
add ebp,4
@@entry:
dec edi
jge @@loop
shr dword ptr[esp+30h],8 //Allowed
jnz @@Main
and byte ptr[ebx].TControl.fAligning,not(1 shl oaAligning)
@@exit:
add esp,34h
pop edi
pop esi
pop ebx
pop ebp
end;
{$else PAS_VERSION}
procedure AlignChildrenProc_(P:PControl);
type TAligns = set of TControlAlign;
var CR: TRect;
procedure DoAlign(Allowed:TAligns);
var I, W, H: Integer;
C: PControl;
R, R1: TRect;
ChgPos, ChgSiz: Boolean;
begin
for I := 0 to P.fChildren.fCount-1 do begin
if not (oaAligning in P.fAligning) then exit;
C := P.fChildren.fItems[ I ];
with C{-}^{+} do begin
if (not(fVisible or fCreateHidden))
or(not(fAlign in Allowed)) then continue;
if not fNotUseAlign then begin
R := BoundsRect;
R1 := R;
W := R.Right - R.Left;
H := R.Bottom - R.Top;
case FAlign of
caTop:
begin
OffsetRect( R, 0, -R.Top + CR.Top + P.Margin );
Inc( CR.Top, H + P.Margin );
R.Left := CR.Left + P.Margin;
R.Right := CR.Right - P.Margin;
end;
caBottom:
begin
OffsetRect( R, 0, -R.Bottom + CR.Bottom - P.Margin );
Dec( CR.Bottom, H + P.Margin );
R.Left := CR.Left + P.Margin;
R.Right := CR.Right - P.Margin;
end;
caLeft:
begin
OffsetRect( R, -R.Left + CR.Left + P.Margin, 0 );
Inc( CR.Left, W + P.Margin );
R.Top := CR.Top + P.Margin;
R.Bottom := CR.Bottom - P.Margin;
end;
caRight:
begin
OffsetRect( R, -R.Right + CR.Right - P.Margin, 0 );
Dec( CR.Right, W + P.Margin );
R.Top := CR.Top + P.Margin;
R.Bottom := CR.Bottom - P.Margin;
end;
caClient:
begin
R := CR;
InflateRect( R, -P.Margin, -P.Margin );
end;
end;
if R.Right < R.Left then R.Right := R.Left;
if R.Bottom < R.Top then R.Bottom := R.Top;
ChgPos := (R.Left <> R1.Left) or (R.Top <> R1.Top);
ChgSiz := (R.Right - R.Left <> W) or (R.Bottom - R.Top <> H);
if ChgSiz then begin
exclude(fAligning,oaWaitAlign);
include(fAligning,oaFromSelf);
end;
if ChgPos or ChgSiz then BoundsRect := R;
end;
if oaWaitAlign in fAligning then AlignChildrenProc_(C);
end;
end;
end;
begin
exclude(P.fAligning,oaWaitAlign);
include(P.fAligning,oaAligning);
CR := P.ClientRect;
DoAlign( [ caTop, caBottom ] );
DoAlign( [ caLeft, caRight ] );
DoAlign( [ caClient,caNone ] );
exclude(P.fAligning,oaAligning);
end;

procedure AlignChildrenProc(P: PObj);
function ToBeAlign( S: PControl ):boolean;
begin with S{-}^{+} do begin
Result := (fVisible or fCreateHidden)
and(isForm or(fParent=nil)or ToBeAlign(fParent));
if not Result then include(fAligning,oaWaitAlign);
end; end;
begin
if P = nil then Exit;
if oaFromSelf in PControl(P).fAligning then
exclude(PControl(P).fAligning,oaFromSelf)
else if(not PControl(P).isForm)and(PControl(P).fParent<>nil) then begin
include(PControl(P).fAligning,oaWaitAlign);
P := PControl(P).fParent;
end;
if not ToBeAlign(PControl(P)) then exit;
AlignChildrenProc_(PControl(P));
end;
{$endif}

карма: 22

0
Ответов: 9906
Рейтинг: 351
#39: 2013-08-10 13:08:39 ЛС | профиль | цитата
Minkovsky писал(а):
но этот с PAS_VERSION и только на KOL3.19

Minkovsky, я Вам один умный вещь скажу...

Среди аторов последних версий KOL нашелся рационализатор, у которого руки не из того места растут. Если говорить мягко.
((можете им это сказать от моего имени))
В kol v3.19 паскаль версия не соответствует оригиналу (моему) ПО СЕМАНТИКЕ.


#pas
{$ELSE PAS_VERSION} // Pascal
procedure AlignChildrenProc(Sender: PObj);
function ToBeAlign( S: PControl ):Boolean;
begin
....................
end;
var fromSelf: Boolean;
S: PControl;
begin
if Sender = nil then Exit; {>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
S := Pointer( Sender );
fromSelf := oaFromSelf in S.fAligning;
Exclude( S.fAligning, oaFromSelf );
if ( (S.fParent = nil)
or {$IFDEF USE_FLAGS} (G3_IsForm in S.fFlagsG3)
{$ELSE} (S.fIsForm) {$ENDIF} ) and (not fromSelf) then
else
begin
include(S.fAligning, oaWaitAlign);
S := S.Parent;
end;
if (S <> nil) and ToBeAlign(S) then
AlignChildrenProc_(S);
end;
{$ENDIF PAS_VERSION}
Поубывав бы



------------ Дoбавленo в 13.04:
nesco, коды соответствует стопудово.

Ты говорил, что для -DPAS_VERSION -- все нормально.
Более точная локализация получилась, когда я менял ASM/PAS только для этого кода.

Попробуй и ты: тупо ifdef меняешь на ifndef -- во второй строке показанного тобой
((в этом деле главное - не забыть вернуть обратно ))

Не пропадут артефакты - попробуем kol целиком
------------ Дoбавленo в 13.08:
Хотя если пропадут - то так не бывает...
карма: 9

0
Разработчик
Ответов: 26156
Рейтинг: 2127
#40: 2013-08-10 13:27:21 ЛС | профиль | цитата
Galkov писал(а):
Ты говорил, что для -DPAS_VERSION -- все нормально

Я тогда артефактом внимание не уделял, а только работоспособности кода
карма: 22

0
Ответов: 9906
Рейтинг: 351
#41: 2013-08-10 13:32:02 ЛС | профиль | цитата
Ну и
карма: 9

0
Разработчик
Ответов: 26156
Рейтинг: 2127
#42: 2013-08-10 13:32:05 ЛС | профиль | цитата
nesco писал(а):
Не пропадут артефакты - попробуем kol целиком

Ёпть, отбой, опять я ступил что-то. Нормально все работает, без всяких артефактов, не тот KOL я юзал. Позор на мою лысую голову
карма: 22

0
Ответов: 9906
Рейтинг: 351
#43: 2013-08-10 13:34:46 ЛС | профиль | цитата
Нормально все - я же "первый начал"
Это моя вторая ошибка на KOL-align в asm-версии. Первую на KOL-форуме вскрыли. Давно уже
карма: 9

0
43
Сообщение
...
Прикрепленные файлы
(файлы не залиты)