Советы по Delphi

         

Некорректность реализации свойства BorderWidth



При использовании в компонентах свойства 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]



Содержание раздела