Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ProgressBar aus Klasse bedienen (https://www.delphipraxis.net/44902-progressbar-aus-klasse-bedienen.html)

Blechwolf 26. Apr 2005 16:06


ProgressBar aus Klasse bedienen
 
Salut,

ich habe eine Klasse die ein 3D-Array aus komplexe Zahlen kapselt. Jetzt soll in dieser Klasse eine FFT berechnet werden. Das dauert je nach Datengrösse relativ lange, so dass ich mir überlegt habe, optional eine Progressbar mitlaufen zu lassen.

Allerdings will ich der Klasse selbst jetzt keine Progressbar übergeben, sondern am liebsten einen Zeiger auf bzw. die Variable Progress selbst und nur den Wert verändern.

Allerdings ist Progress eine Property und die kann ich nicht übergeben. Hat jemand eine Idee wie ich da trotzdem rankommen kann?

Grüße

Wolf

Bernhard Geyer 26. Apr 2005 16:10

Re: ProgressBar aus Klasse bedienen
 
Definiere ein Event (OnProgress) welches von deiner Komponente regelmäßig bedient wird.
Der Programmteil welcher deine Klasse verwendet muß halt einen Eventhandler für diesen Event bedienen und dann die Progressbar setzen.

Blechwolf 26. Apr 2005 21:46

Re: ProgressBar aus Klasse bedienen
 
Hm, mal sehen ob ich das verstanden habe.
Meine Klasse müsste also (stark vereinfach) wie folgt aussehen:

Delphi-Quellcode:
type
  TComplexDataObject = class(TObject)
  private
    FData : array of array of array of TComplex;
    FOnPogress : TNotifyEvent;
  public
    procedure FFT();

    property OnProgress:TNotifyEvent read FOnProgress write FOnProgress;
  end;

procedure TComplexDataObject.FFT();
begin
  // FFT in X Richtung Berechnen
  if Assigned(FOnProgress) then
    FOnProgress;
  // FFT in Y Richtung Berechnen
  if Assigned(FOnProgress) then
    FOnProgress;
  // FFT in Z Richtung Berechnen
  if Assigned(FOnProgress) then
    FOnProgress;
end;
auf meinem Formular habe ich dann einen Button und eine ProgressBar.
Delphi-Quellcode:
var
  CplxObject : TComplexDataObject;
[...]

procedure TForm1.Button1Click(Sender: TObject);
begin
  CplxObject.OnProgress := ProgressBar1.Step(1);
  CplxObject.FFT();
end;
Aber wie mache ich das dann, wenn ich jetzt nicht einen Step, sondern mal 10 oder mal 5 oder mal 27 Steps gleichzeitig ausführen will?
Der/Das Event soll also einen Wert zurückgeben, wieviel % der Gesamten-Schrittzahl schon abgearbeitet ist.

Grüße

Wolf

SirThornberry 26. Apr 2005 22:05

Re: ProgressBar aus Klasse bedienen
 
so würde es natürlich nicht mal vom compiler akzeptiert werden. Um dein Beispiel mit der Progressbar aufzugreifen.
Delphi-Quellcode:
  TComplexDataObject = class(TObject)
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  private
    fProgressBar: TProgressBar;
  published
    property ProgressBar: TProgressBar read fProgressBar write fProgressBar;
  end;
[...]
procedure TComplexDateObject.DeineBerechnung;
begin
  //Do something
  if Assigned(fProgressBar) then
    fProgressBar.Position := x;
  //Do something
end;

procedure Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if (Operation = opRemove) and (AComponent = fProgressBar) then
    fProgressBar := nil;
end;
oder eben mit der Callbackvariante
Delphi-Quellcode:
  TProgressEvnt = procedure(Sender: TObject; Progress: Integer) of Object;
  TComplexDataObject = class(TObject)
  private
    fOnProgress: TProgressEvnt;
  published
    property OnProgress: TProgressEvnt read fOnProgress write fOnProgress;
  end;
[...]
procedure TComplexDateObject.DeineBerechnung;
begin
  //Do something
  if Assigned(fOnProgress) then
    fOnProgress(Self, x);
  //Do something
end;

Union 27. Apr 2005 00:42

Re: ProgressBar aus Klasse bedienen
 
Zitat:

Zitat von SirThornberry
oder eben mit der Callbackvariante
Delphi-Quellcode:
  TProgressEvnt = procedure(Sender: TObject; Progress: Integer) of Object;
  TComplexDataObject = class(TObject)
  private
    fOnProgress: TProgressEvnt;
  published
    property OnProgress: TProgressEvnt read fOnProgress write fOnProgress;
  end;
[...]
procedure TComplexDateObject.DeineBerechnung;
begin
  //Do something
  if Assigned(fOnProgress) then
    fOnProgress(Self, x);
  //Do something
end;

Ich halte das mit dem Callback auch für am sinnvollsten und flexibelsten. Das Beispiel stammt aus einer Klasse, die Datenstrukturen aus SAP einliest:
Delphi-Quellcode:
// Notify-Event for reading/writing of IDocs
TIDocProgressEvent = procedure(iStepBy, iMax: integer) of object;
...
property OnReadFromFile : TIDocProgressEvent read FOnReadFromFile write SetOnReadFromFile;
...
// Call notification for startup
if assigned(FOnReadFromFile) then
   FOnReadFromFile(-1, iFileSize);
...
// Call progress function
if assigned(FOnReadFromFile) then
   FOnReadFromFile(FilePosition-OldFilePosition,-1);
...

// Handler which is called while processing the input file
IDoc.OnReadFromFile := IDocFileProgress;


//------------------------------------------------------------------------------
procedure TfrmMain.IDocFileProgress(iStepBy, iMax: integer);
//------------------------------------------------------------------------------
// Notification which is called while processing the IDOC
// iStepBy : < 0 = Start
//           > 0 = Number of lines processed in this step
//------------------------------------------------------------------------------
begin
   if iStepBy < 0 then begin
      ProgressBar1.Properties.Max := iMax;
      ProgressBar1.Properties.Min := 0;
      ProgressBar1.Position := 0;
   end
   else
      Progressbar1.Position := ProgressBar1.Position+iStepBy;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 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