![]() |
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 |
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. |
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:
auf meinem Formular habe ich dann einen Button und eine ProgressBar.
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;
Delphi-Quellcode:
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?
var
CplxObject : TComplexDataObject; [...] procedure TForm1.Button1Click(Sender: TObject); begin CplxObject.OnProgress := ProgressBar1.Step(1); CplxObject.FFT(); end; Der/Das Event soll also einen Wert zurückgeben, wieviel % der Gesamten-Schrittzahl schon abgearbeitet ist. Grüße Wolf |
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:
oder eben mit der Callbackvariante
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;
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; |
Re: ProgressBar aus Klasse bedienen
Zitat:
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 10:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz