ProgressBar mit einstellbarem Text

Rund um die LCL und andere Komponenten
Antworten
ts230
Beiträge: 109
Registriert: Sa 20. Dez 2008, 20:42
OS, Lazarus, FPC: Linux (L 0.9.24)
CPU-Target: 32Bit
Wohnort: San Jose,CA
Kontaktdaten:

ProgressBar mit einstellbarem Text

Beitrag von ts230 »

Hallo,
wie kann mann einstellen das die ProgressBar z.b. den Text "Bitte Warten..." in der Mitte anzeigt?
Ich mein etwa so:
+----------------------------------------------------------+
|||||||||||||||||||||||||||||||Bitte|Warten||||||||||||||||||||||||||||
+----------------------------------------------------------+
So wie wenn man BarShowText:true setzt halt nur mit nem anderen Text.

Code: Alles auswählen

 If beitragHilfreich then leseitdurch()else volle_ignoranz();
tiersendung.funpic.de

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: ProgressBar mit einstellbarem Text

Beitrag von Targion »

Du könnstest...
1) Den Text drüber zeichnen (unschön)
2) Dir mal anschauen, wie denn die Prozentangabe auf die ProgressBar kommt und das nachstellen/umschreiben
2) Den Text in einem Label unter der ProgressBar anzeigen lassen.

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: ProgressBar mit einstellbarem Text

Beitrag von KOBOLD Messring GmbH »

Mir gefällt der Standard-Text auch nicht.
2) Dir mal anschauen, wie denn die Prozentangabe auf die ProgressBar kommt und das nachstellen/umschreiben
Dazu sieht man im Quelltext:

Code: Alles auswählen

- FBarTextFormat is a fixed string by now, hard-coded in the gtk-interface
und auch noch (natürlich zurecht) in der Private-Abteilung.
Beim Create macht es ein:

Code: Alles auswählen

FBarTextFormat    := '%v from [%l-%u] (=%p%%)';
...und es gibt leider keine Property die dies verändern kann, also neue Klasse schreiben, die das änderbar macht...
Ist mir persönlich zu viel Arbeit, ich lass das so. :oops:

ts230
Beiträge: 109
Registriert: Sa 20. Dez 2008, 20:42
OS, Lazarus, FPC: Linux (L 0.9.24)
CPU-Target: 32Bit
Wohnort: San Jose,CA
Kontaktdaten:

Re: ProgressBar mit einstellbarem Text

Beitrag von ts230 »

Der stanardtext ist auch nicht so gutes Englisch.
Es heisst so:50 of[0-100] 50%
Wo ist diese Datei?
Ich bin nur in der ComCtrl gelandet.
Wenn das private ist,kann man das nicht einfach in public packen?
Ich hab das gefunden:

Code: Alles auswählen

TCustomProgressBar = class(TWinControl)
  private
    FMin              : Integer;
    FMax              : Integer;
    FStep             : Integer;
    FPosition         : Integer;
    FSmooth           : boolean;
    FBarShowText      : boolean;
    FBarTextFormat    : string;
    FOrientation      : TProgressBarOrientation;
    function GetMin: Integer;
    function GetMax: Integer;
    function GetPosition: Integer;
    procedure SetParams(AMin, AMax: Integer);
    procedure SetMin(Value: Integer);
    procedure SetMax(Value: Integer);
    procedure SetPosition(Value: Integer);
    procedure SetStep(Value: Integer);
    procedure SetSmooth (Value : boolean);
    procedure SetBarShowText (Value : boolean);
    procedure SetOrientation (Value : TProgressBarOrientation);
  protected
    procedure ApplyChanges;
    procedure InitializeWnd; overrde;
    procedure Loaded; override;
    class function GetControlClassDefaultSize: TPoint; override;
  public
    constructor Create(AOwner: TComponent); override;
    procedure StepIt;
    procedure StepBy(Delta: Integer);
  public
    property Max: Integer read GetMax write SetMax;
    property Min: Integer read GetMin write SetMin;
    property Orientation: TProgressBarOrientation read FOrientation write SetOrientation default pbHorizontal;
    property Position: Integer read GetPosition write SetPosition default 0;
    property Smooth : boolean read FSmooth write SetSmooth default false;
    property Step: Integer read FStep write SetStep default 10;
    property BarShowText : boolean read FBarShowText write SetBarShowText;
Da ist dieses

Code: Alles auswählen

FBarTextFormat    : string;
wenn ich dass einfach in public packen würde ginge es doch?
in etwa so:

Code: Alles auswählen

public 
    FBarTextFormat    : string;
und dann der rest

Code: Alles auswählen

 If beitragHilfreich then leseitdurch()else volle_ignoranz();
tiersendung.funpic.de

ts230
Beiträge: 109
Registriert: Sa 20. Dez 2008, 20:42
OS, Lazarus, FPC: Linux (L 0.9.24)
CPU-Target: 32Bit
Wohnort: San Jose,CA
Kontaktdaten:

Re: ProgressBar mit einstellbarem Text

Beitrag von ts230 »

Ich hab jetzt eine Unit geschreiben:

Code: Alles auswählen

unit ComnCtrls;
 
{$mode objfpc}
{$H+}
 
 
interface
 
uses
  SysUtils,  Classes,   LResources, LCLIntf, LCLType,
  LCLProc, AvgLvlTree,  GraphType, Graphics,
  Controls, Forms, StdCtrls,ComCtrls,WSComCtrls,WSLCLClasses, WSControls, WSExtCtrls, WSStdCtrls,
  WSToolwin;
 
type
 
 
 
 
  { TTCustomProgressBar }
  {
    @abstract(Simple progressbar with Text.)
    Introduced by Author Name <seiferttristan@gmail.com>
  }
  TTCustomProgressBar = class(TWinControl)
  private
    FMin              : Integer;
    FMax              : Integer;
    FStep             : Integer;
    FPosition         : Integer;
    FSmooth           : boolean;
    FBarTextFormat    : string;
    FBarShowText      : boolean;
    FOrientation      : TProgressBarOrientation;
    function GetMin: Integer;
    function GetMax: Integer;
    function GetPosition: Integer;
    procedure SetParams(AMin, AMax: Integer);
    procedure SetMin(Value: Integer);
    procedure SetMax(Value: Integer);
    procedure SetPosition(Value: Integer);
    procedure SetStep(Value: Integer);
    procedure SetSmooth (Value : boolean);
    procedure SetBarShowText (Value : boolean);
    procedure SetOrientation (Value : TProgressBarOrientation);
  protected
    procedure ApplyChanges;
    procedure InitializeWnd; override;
    procedure Loaded; override;
    class function GetControlClassDefaultSize: TPoint; override;
  public
 
    constructor Create(AOwner: TComponent); override;
    procedure StepIt;
    procedure StepBy(Delta: Integer);
  public
    property Max: Integer read GetMax write SetMax;
    property Min: Integer read GetMin write SetMin;
    property Orientation: TProgressBarOrientation read FOrientation write SetOrientation default pbHorizontal;
    property Position: Integer read GetPosition write SetPosition default 0;
    property Smooth : boolean read FSmooth write SetSmooth default false;
    property Step: Integer read FStep write SetStep default 10;
    property Text: string read FBarTextFormat write FBarTextFormat;
    property BarShowText : boolean read FBarShowText write SetBarShowText;
  end;
 
 
  { TTProgressBar }
 
  TTProgressBar = class(TTCustomProgressBar)
  published
 
    property Align;
    property Anchors;
    property BorderSpacing;
    property BorderWidth;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Hint;
    property Max;
    property Min;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
    property Orientation;
    property ParentShowHint;
    property PopupMenu;
    property Position;
    property ShowHint;
    property Smooth;
    property Step;
    property TabOrder;
    property TabStop;
    property Text;
    property Visible;
    property BarShowText;
  end;
 
 
{ TTWSProgressBar }
 
 
  TTWSProgressBar = class(TWSWinControl)
 class procedure ApplyChanges(AProgressBar: TTCustomProgressBar); virtual;
 class procedure SetPosition(AProgressBar: TTCustomProgressBar; Value: integer); virtual;
  end;
  TTWSProgressBarClass = class of TTWSProgressBar;
 
 
 
procedure Register;
 
implementation
 
// !!! Avoid unit circles. Only add units if really needed.
 
 
procedure Register;
begin
  RegisterComponents('Common Controls',[TTProgressBar]);
end;
 
 
{$I progressbarTS.inc}
 
 
end.
Und dass ist was ich sehe im Messages fenster:

Code: Alles auswählen

Hint: Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/fpc.cfg
Warning: You are using the obsolete switch -OG
Free Pascal Compiler version 2.2.0 [2008/09/20] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Linux for i386
Compiling TSTerritoriumsstrg.lpr
Compiling unit1.pas
Compiling unit2.pas
Compiling comnctrls.pp
comnctrls.pp(141,18) Error: Forward declaration not solved "class TTWSProgressBar.ApplyChanges(TTCustomProgressBar)"
comnctrls.pp(142,18) Error: Forward declaration not solved "class TTWSProgressBar.SetPosition(TTCustomProgressBar, LongInt)"
comnctrls.pp(165) Fatal: There were 2 errors compiling module, stopping

Code: Alles auswählen

 If beitragHilfreich then leseitdurch()else volle_ignoranz();
tiersendung.funpic.de

schwarzwaldtux
Beiträge: 1
Registriert: So 3. Feb 2013, 15:27

Re: ProgressBar mit einstellbarem Text

Beitrag von schwarzwaldtux »

Hallo zusammen,
es ist so, dass ich den "Sermon", den die ProgressBar ausgibt, für total unpraktikabel halte. In den allermeisten Anwendungen reicht die Prozentausgabe völlig. Die einfachste und schnellste Lösung ist, dies generell umzustellen. Ich erkläre hier, wie ich das unter Linux gemacht habe.
Zunächst bleibt Lazarus ungeöffnet. Mit Root-Rechten öffne ich einen Editor (z.B. KWrite) und öffne folgende Datei damit:
/usr/lib/lazarus/lcl/interfaces/gtk2/gtk2wscomctrls.pp . Wer ein anderes WidgetSet verwendet, sucht sich die Datei *comctrls.pp aus dem entsprechenden Ordner heraus. Die Zeile 459 verändere ich so: wText := Format('%%p%%%%', [Position, Min, Max]);
Dann speichere (überschreibe) die Datei. KWrite erstellt die vorherige Datei als Sicherungsdatei. Falls etwas schief geht, läßt sich so der alte Zustand wiederherstellen.
Jetzt öffne ich Lazarus und kompiliere Lazarus neu. Zu finden unter Werkzeuge: Kompiliere Lazarus mit Profil... . Und schon zeigt bei aktiviertem BarShowText die ProgressBar immer nur noch den aktuellen Prozentwert an.
Viel Erfolg aus dem Schwarzwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6837
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ProgressBar mit einstellbarem Text

Beitrag von af0815 »

schwarzwaldtux hat geschrieben:... öffne folgende Datei damit:
/usr/lib/lazarus/lcl/interfaces/gtk2/gtk2wscomctrls.pp ...
Hat nur den Nachteil, das bei einem Update alles futsch ist und mann weis nach einiger Zeit nicht mehr warum.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: ProgressBar mit einstellbarem Text

Beitrag von Bauer321 »

af0815 hat geschrieben:
schwarzwaldtux hat geschrieben:... öffne folgende Datei damit:
/usr/lib/lazarus/lcl/interfaces/gtk2/gtk2wscomctrls.pp ...
Hat nur den Nachteil, das bei einem Update alles futsch ist und mann weis nach einiger Zeit nicht mehr warum.
Man kann sich ja einen Hinweis im Quelltext machen, was man dafür geändert hat
www.mcpatcher.net | www.hoeper.me

Antworten