Delphi World - Некорректность реализации свойства BorderWidth у ProgressBar
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Некорректность реализации свойства 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 можно создать исключение, но это уже на любителя.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования