Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi progressanzeige realisieren (https://www.delphipraxis.net/94503-progressanzeige-realisieren.html)

stephan007 22. Jun 2007 10:54


progressanzeige realisieren
 
hallo!

ich hab aktuell folgendes problem:

ich will eine progress sprich fortschrittsanzeige realisieren. dabei hab ich eine prozessfortschrittsbalken und einen gesamtfortschrittsbalken jeweils in einem panel. das deshalb, weil ich mein fenster modular halten will, damit eventuell auch nur einer der beiden balken verwendet werden kann.

nun hab ich aber folgendes problem: ich habe eine procedure, die mir den balken und die anzeige (xxx / yyy) neu setzt. dieser procedure übergebe ich einen progressvalue, der das ausmass des fortschritts angibt. weiters kann dieser progressvalue entweder nur eine zahl (z.b. 1) aber auch eine mit einer einheit behaftete zahl sein (z.b. 1MB).

nun soll die funktion folgendes tun:

sind beide balken sichtbar, dann rückt der untere balken (total) in abhängigkeit vom oberen (process) weiter.
beispiel: ich habe 3 files mit 2Mb, 2Mb und 4Mb, somit laufen oben die nacheinander durch. die position des balkens kann ich ja mit round((current + progressvalue) / maximal) berechnen. beim unteren könnte ich den balken detto so setzen.
ist der obere auf 100% angekommen (abfangen dass man nicht drüber kommt eventuell vorsehen), solls mit dem nächsten weitergehen (klar, ein reset und set mit neuen werten).
die anzeige (xxx / yyy) läßt sich ja da leicht mit einem format(.) realisieren.

ich glaube euch ist mitlerweile klar, was ich da realisieren will, kennt man doch von so einigen installationspackages, bei denen oben der balken für das aktuelle file läuft und unten darunter der balken für die gesamte installation. und genau sowas will ich da nun realisieren. (mit dem kleinen unterschied, dass eventuell auch nur einer der balken dargestellt wird, die funktionalität aber wenn möglich schon so gelöst ist, dass es egal ist, ob einer oder beide zu sehen ist, die jeweilige procedure unabhängig davon das richtige macht).

habt ihr da eine idee, wie man sowas schnell und vorallem einfach realisiert oder realisieren könnte? hab da momentan zwar schon einige ideen, allerdings zerfällt das bei mir in zig if-bedingungen usw., dass ich mir denke, das muss doch einfacher gehen.
hätte nämlich eine globale progress gemacht und da drinnen eine "allgemeine" balken und anzeigenaktualisierungs-procedure aufgerufen, der ich die jeweiligen parameter auf den weg mitgebe, also entweder vom total oder vom progress (da ja gleiche funktionalität). was haltet ihr davon oder habt ihr eine bessere bzw. effizientere lösung?

stephan.

Klaus01 22. Jun 2007 16:56

Re: progressanzeige realisieren
 
Guten Abend,

ein Beispiel wie man es lösen könnte:

Grüße
Klaus

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;   // die alles anzeigt
    ProgressBar2: TProgressBar;  // die einzelne Schritte anzeigt
    Button1: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FileSize : Array[0..3] of Integer;
    SizeAll : Integer;
    CurrentFile : Byte;
    Step : Integer;
     Timer : TTimer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Byte;
begin
  FileSize[0]:=200000;
  FileSize[1]:=10000;
  FileSize[2]:=500000;
  FileSize[3]:=30000;

  SizeAll:=0;
  for i:=0 to length(FileSize) do
    SizeAll := SizeAll + FileSize[i];
  CurrentFile:=0;
  Timer1.Interval:=50;
  Timer1.Enabled:=true;
  ProgressBar1.Max:=SizeAll;


end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  step:=5000;
  Label1.Caption:='File '+IntToStr(CurrentFile);
  ProgressBar2.Max:=FileSize[CurrentFile];
  ProgressBar2.Position:=ProgressBar2.Position + step;
  ProgressBar1.Position:=ProgressBar1.Position + step;
  If ProgressBar2.Position >= FileSize[CurrentFile] then
    begin
      inc(CurrentFile);
      ProgressBar2.Position:=0;
      if CurrentFile > Length(FileSize) then
        Timer1.Enabled:=false;
    end;

end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz