AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ProgressBar aus Klasse bedienen

Ein Thema von Blechwolf · begonnen am 26. Apr 2005 · letzter Beitrag vom 27. Apr 2005
Antwort Antwort
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#1

ProgressBar aus Klasse bedienen

  Alt 26. Apr 2005, 16:06
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
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: ProgressBar aus Klasse bedienen

  Alt 26. Apr 2005, 16:10
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#3

Re: ProgressBar aus Klasse bedienen

  Alt 26. Apr 2005, 21:46
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
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: ProgressBar aus Klasse bedienen

  Alt 26. Apr 2005, 22:05
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: ProgressBar aus Klasse bedienen

  Alt 27. Apr 2005, 00:42
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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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