Не получается поместить ProgressBar в StatusBar

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не получается поместить ProgressBar в StatusBar

Сообщение RomanS » 14.04.2010 10:57:56

Не могу расположить ProgressBar в StatusBar'е, точнее он помещается, но только в левом верхнем углу StatusBar'а.
Пытаюсь изменять свойства Left и Top ProgressBar'а, но ничего не меняется...
вот код:
Код: Выделить всё
procedure TfMcf2.FormCreate(Sender: TObject);
begin
  ...
  pbStatusT := TProgressBar.Create(fMcf2); // fMcf2 - форма, пробовал ставить StatusBar1 - не помогло
  With pbStatusT do
  Begin
    Visible := false;
    Parent := StatusBar1;
    Smooth := true;
    Height := 10;
    Width := StatusBar1.Panels[1].Width - 3;
    Left := StatusBar1.Panels[0].Width;
    Top := 1;
    Visible := true;
  end;
end;


нашел на форуме http://www.freepascal.ru/forum/viewtopic.php?f=5&t=3376 и http://freepascal.ru/article//lazarus/20050530152619/, я вроде делаю все аналогично. А писать новый компонент не хочется. В Delphi 7 всё нормально работает.
Может кто сталкивался с этой проблемой и решил её?
Пробовал ставить:
Код: Выделить всё
pbStatusT.Parent  := fMcf2; // Форма
и
pbStatusT.Parent  := Panel1; // Панель

нормально работает и для панели и для формы, а для StatusBar'а не хочет :(
FPC 2.5.1 из SVN от 2010.04.10
Lazarus 0.9.29 из SVN от 2010.04.13
WIN XP SP3
Последний раз редактировалось RomanS 14.04.2010 13:53:17, всего редактировалось 1 раз.
RomanS
новенький
 
Сообщения: 33
Зарегистрирован: 10.12.2007 10:08:24

Re: Не получается поместить ProgressBar в StatusBar

Сообщение alaken » 14.04.2010 12:45:31

попробуйте так
Код: Выделить всё
procedure TForm1.Button1Click ( Sender: TObject ) ;
var
  PB: TProgressBar;
begin
  PB := TProgressBar.Create(self);
  PB.Align := alClient;
  PB.Parent := StatusBar1;
  PB.Position := 50;

end;
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Не получается поместить ProgressBar в StatusBar

Сообщение Maxizar » 14.04.2010 12:50:25

Не забываем ставить у панелей стиль = psOwnerDraw. ну вот собственно код, три панели три прогрессБара, чтоб разлечить где какой и что правильно идет отрисовка сделал разную позицию у каждого прогрессБара.
Ну меншье слов больше дела вот код:

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ComCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
      const Rect: TRect);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Bar1,Bar2,Bar3:TProgressBar;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
Bar1:=TProgressBar.Create(Form1);
Bar2:=TProgressBar.Create(Form1);
Bar3:=TProgressBar.Create(Form1);

Bar1.Parent:=Form1;
Bar2.Parent:=Form1;
Bar3.Parent:=Form1;

Bar1.Position:=10;
Bar2.Position:=50;
Bar3.Position:=100;

Bar1.Visible:=False;
Bar2.Visible:=False;
Bar3.Visible:=False;

end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
  Panel: TStatusPanel; const Rect: TRect);
begin
Case Panel.Index of
  0:  begin
      Bar1.Top:=StatusBar1.Top+3;
      Bar1.Left:=StatusBar1.Left;
      Bar1.Width:=StatusBar1.Panels[0].Width;
      Bar1.Visible:=True;
      end;
  1:  begin
      Bar2.Top:=StatusBar1.Top+3;
      Bar2.Left:=StatusBar1.Left+StatusBar1.Panels[0].Width;
      Bar2.Width:=StatusBar1.Panels[1].Width;
      Bar2.Visible:=True;
      end;
  2:  begin
      Bar3.Top:=StatusBar1.Top+3;
      Bar3.Left:=StatusBar1.Left+StatusBar1.Panels[0].Width+StatusBar1.Panels[1].Width;
      Bar3.Width:=StatusBar1.Panels[1].Width;
      Bar3.Visible:=True;
      end;
end;
end;

end.


Ну для красоты допишешь сам все в отдельную процедурку и тп.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Не получается поместить ProgressBar в StatusBar

Сообщение alaken » 14.04.2010 13:56:33

Maxizar писал(а):Не забываем ставить у панелей стиль = psOwnerDraw. ну вот собственно код, три панели три прогрессБара, чтоб разлечить где какой и что правильно идет отрисовка сделал разную позицию у каждого прогрессБара.
Ну меншье слов больше дела вот код:

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ComCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
      const Rect: TRect);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Bar1,Bar2,Bar3:TProgressBar;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
Bar1:=TProgressBar.Create(Form1);
Bar2:=TProgressBar.Create(Form1);
Bar3:=TProgressBar.Create(Form1);

Bar1.Parent:=Form1;
Bar2.Parent:=Form1;
Bar3.Parent:=Form1;

Bar1.Position:=10;
Bar2.Position:=50;
Bar3.Position:=100;

Bar1.Visible:=False;
Bar2.Visible:=False;
Bar3.Visible:=False;

end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
  Panel: TStatusPanel; const Rect: TRect);
begin
Case Panel.Index of
  0:  begin
      Bar1.Top:=StatusBar1.Top+3;
      Bar1.Left:=StatusBar1.Left;
      Bar1.Width:=StatusBar1.Panels[0].Width;
      Bar1.Visible:=True;
      end;
  1:  begin
      Bar2.Top:=StatusBar1.Top+3;
      Bar2.Left:=StatusBar1.Left+StatusBar1.Panels[0].Width;
      Bar2.Width:=StatusBar1.Panels[1].Width;
      Bar2.Visible:=True;
      end;
  2:  begin
      Bar3.Top:=StatusBar1.Top+3;
      Bar3.Left:=StatusBar1.Left+StatusBar1.Panels[0].Width+StatusBar1.Panels[1].Width;
      Bar3.Width:=StatusBar1.Panels[1].Width;
      Bar3.Visible:=True;
      end;
end;
end;

end.


Ну для красоты допишешь сам все в отдельную процедурку и тп.


в DrawPanel лучше пользоваться параметром Rect для позиционирования отображаемого компонента
Код: Выделить всё
procedure TForm1.FormCreate ( Sender: TObject ) ;
begin
  pb := TProgressBar.Create(Self);
end;

  procedure TForm1.StatusBar1DrawPanel ( StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect );
begin
  Case Panel.Index of
    1:
    begin
      pb.Top := Rect.Top - 1;
      pb.Left := Rect.Left;
      pb.Width := Rect.Right - Rect.Left;
      pb.Height := Rect.Bottom - Rect.Top + 2;

      if
        not Assigned(pb.Parent)
      then
      begin
        pb.Parent := StatusBar1;
        pb.Visible := True;
      end;
    end;
  end;
end;


(TStatusPanel.Bevel := pbNone)
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Не получается поместить ProgressBar в StatusBar

Сообщение RomanS » 14.04.2010 14:54:35

alaken писал(а):попробуйте так
Код: Выделить всё
procedure TForm1.Button1Click ( Sender: TObject ) ;
var
  PB: TProgressBar;
begin
  PB := TProgressBar.Create(self);
  PB.Align := alClient;
  PB.Parent := StatusBar1;
  PB.Position := 50;

end;

Это немного не то, мне нужно в StatusBar во 2й панели вывести

Добавлено спустя 5 минут 10 секунд:
alaken писал(а):
Maxizar писал(а):Не забываем ставить у панелей стиль = psOwnerDraw. ну вот собственно код, три панели три прогрессБара, чтоб разлечить где какой и что правильно идет отрисовка сделал разную позицию у каждого прогрессБара.
Ну меншье слов больше дела вот код:
...
Ну для красоты допишешь сам все в отдельную процедурку и тп.


в DrawPanel лучше пользоваться параметром Rect для позиционирования отображаемого компонента
...
(TStatusPanel.Bevel := pbNone)

списибо за пример, только в TForm1.StatusBar1DrawPanel нужно вместо
Код: Выделить всё
pb.Parent := StatusBar1;
поставить
Код: Выделить всё
pb.Parent := Form1;
и поколдовать с Rect.Top
RomanS
новенький
 
Сообщения: 33
Зарегистрирован: 10.12.2007 10:08:24

Re: Не получается поместить ProgressBar в StatusBar

Сообщение alaken » 14.04.2010 15:22:46

RomanS писал(а):... только в TForm1.StatusBar1DrawPanel нужно вместо
Код: Выделить всё
pb.Parent := StatusBar1;
поставить
Код: Выделить всё
pb.Parent := Form1;

хм почему же?
pb должен находится на StatusBar1, а не на Form1.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Не получается поместить ProgressBar в StatusBar

Сообщение RomanS » 14.04.2010 15:35:06

alaken писал(а):
RomanS писал(а):... только в TForm1.StatusBar1DrawPanel нужно вместо
Код: Выделить всё
pb.Parent := StatusBar1;
поставить
Код: Выделить всё
pb.Parent := Form1;

хм почему же?
pb должен находится на StatusBar1, а не на Form1.

в том то и дело, что как только я указываю StatusBar1, то ProgressBar "прилипает" к левому верхнему углу StatusBar1,
и изменения LEFT и TOP не оказывают ни какого влияния на положение ProgressBar'a :(
RomanS
новенький
 
Сообщения: 33
Зарегистрирован: 10.12.2007 10:08:24

Re: Не получается поместить ProgressBar в StatusBar

Сообщение alaken » 14.04.2010 15:39:39

все правильно, сначала нужно установить параметры Top, Left, Width, Height а после присваивать к родителю.

Добавлено спустя 1 минуту 2 секунды:
поиграйтесь с этим примером
Код: Выделить всё
procedure TForm1.FormCreate ( Sender: TObject ) ;
begin
  pb := TProgressBar.Create(Self);
end;

  procedure TForm1.StatusBar1DrawPanel ( StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect );
begin
  Case Panel.Index of
    1:
    begin
      pb.Top := Rect.Top - 1;
      pb.Left := Rect.Left;
      pb.Width := Rect.Right - Rect.Left;
      pb.Height := Rect.Bottom - Rect.Top + 2;

      if
        not Assigned(pb.Parent)
      then
      begin
        pb.Parent := StatusBar1;
        pb.Visible := True;
      end;
    end;
  end;
end;
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Не получается поместить ProgressBar в StatusBar

Сообщение RomanS » 14.04.2010 15:47:07

хм, действительно... спасибо за разъяснение :idea:
RomanS
новенький
 
Сообщения: 33
Зарегистрирован: 10.12.2007 10:08:24

Re: Не получается поместить ProgressBar в StatusBar

Сообщение alaken » 15.04.2010 10:04:32

RomanS писал(а):хм, действительно... спасибо за разъяснение :idea:

метод как я предлагаю работает не совсем корректно, хотя по всем правилам метод правильный, или здесь другие правила...

всетаки
pb.Parent := StatusBar1;
нужно менять на
pb.Parent := Form1;
так будет работать корректно, не понимаю почему в первом случае не работает как надо...

выкладываю порт с Delphi QprogressBar пример использования внутри архива
QprogressBar позволяет менять стиль и цвет отрисовки, в том числе градиент. Позволяет выводить текст(свойство caption), позволяет убирать границу компонента, и многое другое.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Не получается поместить ProgressBar в StatusBar

Сообщение qivi » 15.04.2010 11:12:30

Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Не получается поместить ProgressBar в StatusBar

Сообщение alaken » 15.04.2010 11:42:48

qivi писал(а):Кстате вот:
http://freepascal.ru/article//lazarus/20050530152619/

у меня не открывается...
проверьте
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Не получается поместить ProgressBar в StatusBar

Сообщение RomanS » 15.04.2010 13:52:16

alaken писал(а):выкладываю порт с Delphi QprogressBar пример использования внутри архива
QprogressBar позволяет менять стиль и цвет отрисовки, в том числе градиент. Позволяет выводить текст(свойство caption), позволяет убирать границу компонента, и многое другое.
Спасибо за компонент, но я остановился на обычном StstusBar'е и использую pb.Parent := StatusBar1, т.к. у меня размер панельки StatusBar'а не меняется.
Ещё раз спасибо :!:
RomanS
новенький
 
Сообщения: 33
Зарегистрирован: 10.12.2007 10:08:24

Re: Не получается поместить ProgressBar в StatusBar

Сообщение qivi » 16.04.2010 12:18:26

alaken писал(а):
qivi писал(а):Кстате вот:
http://freepascal.ru/article//lazarus/20050530152619/

у меня не открывается...
проверьте

Низнаю... у меня открывается...

Выйдите на главную страницу сайта, зайдите в раздел статьи, выберите раздел лазарус и найдите в нём статью: "Создание визуальных компонент для Lazarus ". Уж отдельным компонентом, или нет, но материал как раз по вашей теме...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Не получается поместить ProgressBar в StatusBar

Сообщение qivi » 24.04.2010 16:11:12

alaken писал(а):
RomanS писал(а):выкладываю порт с Delphi QprogressBar пример использования внутри архива
QprogressBar позволяет менять стиль и цвет отрисовки, в том числе градиент. Позволяет выводить текст(свойство caption), позволяет убирать границу компонента, и многое другое.


Порт завязан на модуле Windows, в линукс не работает... :(
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62

Рейтинг@Mail.ru
cron