![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ошибка в WndProcGradientEx
Don © (2006-12-06 15:26:00)
function Ceil( X: Double ): Integer;Этот код неправильно работает, лучше заменить на:
begin
Result := Round( X ) + 1;
end;
function Ceil( X: Double ): Integer;
begin
if X < 0 then
Result := Trunc(X-0.5)
else
Result := Trunc(X+0.5);
end;
Можно вынести как отдельную функцию (корректное округление)
Vladimir Kladov (2006-12-07 16:33:00) [1]действительно, уголок видно, и при первом исправлении тоже. Просто Round чище получается.
Don (2006-12-07 10:23:00) [2]При рисовании градиента со стилями gsElliptic, gsRombic, gsRectangle с цветами
Color1 = RGB ($FF, $FF, $00 ) и
Color2 = RGB ($00, $FF, $FF )
рисуется градиент с абсолюно другими цветами, в частности не учитывается зелёный цвет. При вычислении с использованием Ceil зеленый цвет получается 256. А должен быть 255. Можно еще посмотреть градиент с цветами $FF0000-$FE0000.
По поводу функции, может и ошибся. Надо вообще Ceil убрать и вызывать Round вместо него, в этом случае все в порядке.
Galkov (2006-12-07 09:12:00) [3]
> если я правильно понимаю что такое Ceil и Round
Можно попытаться исходить из какого-нибудь определения... Нашел такое:
> 17.12.10 ceil
> Synopsis: Return the lowest integer number greater than or equal to argument
> Declaration: function ceil(x: float) : Integer
> Visibility: default
> Description: Ceil returns the lowest integer number greater than or equal to x. > The absolute value of x should be less than maxint.
> Errors: If the asolute value of x is larger than maxint, an overflow error will occur.
Но тогда правильно будет именно так:
function Ceil( X: Double ): Integer;
begin
Result := Trunc(X)
if Frac(X) > 0 then
inc(Result);
end;
Ну это так, отвлечение на абстракцию :))
GMax (2006-12-07 01:37:00) [4]если я правильно понимаю что такое Ceil и Round, то Round(15.9)+1=17, а классический Ceil(15.9)=16. исправляется заменой Round на Trunc.
но исправленный Don'ом вариант тоже не верен. здесь как раз вместо Trunc должен быть Round :)
Vladimir Kladov (2006-12-06 16:35:00) [5]скажите, на каких исходных параметрах эта ошибка с ceil проявляется, чтобы это было заметно для глаза.
Don (2006-12-06 15:34:00) [6]Еще используются процедуры ExtSelectClipRgn, но нигде нет обнуления. Соответсвенно, при вызове fOnPaint2, fOnPaint рисовние будет происходить в последнем выделенном регионе... я бы добавил перед проверкой и вызовом fPaint2
SelectClipRgn(Self_.fPaintDC, 0);
// дальше как и было
if TMethod( Self_.fOnPaint2 ).Code = @ DummyPaintClear then
Self_.fOnPaint2 := TOnPaint( MakeMethod( nil, @ DummyPaintProc ) );
if Assigned( Self_.fOnPaint ) then
Self_.fOnPaint( Self_, Self_.fPaintDC );
...