Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

ошибка в WndProcGradientEx   Найти похожие ветки 

 
Don ©   (2006-12-06 15:26) [0]

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;

Можно вынести как отдельную функцию (корректное округление)


 
Don ©   (2006-12-06 15:34) [1]

Еще используются процедуры 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 );
 ...


 
Vladimir Kladov   (2006-12-06 16:35) [2]

скажите, на каких исходных параметрах эта ошибка с ceil проявляется, чтобы это было заметно для глаза.


 
GMax   (2006-12-07 01:37) [3]

если я правильно понимаю что такое Ceil и Round, то Round(15.9)+1=17, а классический Ceil(15.9)=16. исправляется заменой Round на Trunc.

но исправленный Don"ом вариант тоже не верен. здесь как раз вместо Trunc должен быть Round :)


 
Galkov ©   (2006-12-07 09:12) [4]


> если я правильно понимаю что такое 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;


Ну это так, отвлечение на абстракцию :))


 
Don ©   (2006-12-07 10:23) [5]

При рисовании градиента со стилями gsElliptic, gsRombic, gsRectangle  с цветами
Color1 = RGB ($FF, $FF, $00 ) и
Color2 = RGB ($00, $FF, $FF )
рисуется градиент с абсолюно другими цветами, в частности не учитывается зелёный цвет. При вычислении с использованием Ceil зеленый цвет получается 256. А должен быть 255. Можно еще посмотреть градиент с цветами $FF0000-$FE0000.
По поводу функции, может и ошибся. Надо вообще Ceil убрать и вызывать Round вместо него, в этом случае все в порядке.


 
Vladimir Kladov   (2006-12-07 16:33) [6]

действительно, уголок видно, и при первом исправлении тоже. Просто Round чище получается.



Страницы: 1 вся ветка

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
8-1161987342
Sergey_FV
2006-10-28 02:15
2007.07.22
ico -> Imagelist -> bitmap


3-1176452864
Nike
2007-04-13 12:27
2007.07.22
отображение DBGrid при пустом датасете


15-1182315123
Slider007
2007-06-20 08:52
2007.07.22
Глюки FireBird 1.5.4


3-1177048463
MZ
2007-04-20 09:54
2007.07.22
Фильтр в DBGridEh


15-1182400848
HID
2007-06-21 08:40
2007.07.22
Ребят, помогите прогу сделать для авто-суммирования таблиц dbf