Некорректность реализации свойства BorderWidth у ProgressBar
Автор: VS
При использовании в компонентах свойства BorderWidth будте внимательны. В
большинстве компонентов (ControlBar, ProgressBar, StatusBar, ToolBar, TrackBar и
т.д.), это свойство реализовано некорректно. Можно получить забавные результаты
или большие неприятности.
На рисунке показаны возможные варианты при использовании различных значений
BorderWidth в компоненте ProgressBar. Высота компонента ProgressBar.Height = 16.
В последних двух вариантах вместо индикатора – изображение под активным
окном. Не надейтесь, что компонент стал "прозрачным". Это "моментальный снимок"
при создании окна.
Если есть желание, то некорректность можно исправить в ComCtrls.pas,
переопределив BorderWidth.
TProgressBar = class(TWinControl)
private
FBorderWidth: TBorderWidth;
procedure SetBorderWidth(Value: TBorderWidth);
published
property BorderWidth: TBorderWidth read FBorderWidth write SetBorderWidth;
...
constructor TProgressBar.Create(AOwner: TComponent);
begin
FBorderWidth := inherited BorderWidth;
end;
procedure TProgressBar.SetBorderWidth(Value: TBorderWidth);
begin
if Value > (Height div 2) - 3 then
Exit
if Value <> inherited BorderWidth then
begin
inherited BorderWidth := Value;
FBorderWidth := inherited BorderWidth;
end;
end;
|
Аналогичный подход можно использовать в других компонентах. В процедуре
SetBorderWidth вместо Exit можно создать исключение, но это уже на любителя.
|