При использовании в компонентах свойства 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 можно создать исключение, но это уже на любителя. C уважением, VS. [001297]