Es gibt da auch noch andere (sehr flexible) Möglichkeiten.
Zuerst definieren wir ein Interface:
Delphi-Quellcode:
IProgressFeedback = interface
procedure WriteMessage(const msg:string);
procedure SetProgressMinMax(min,max:integer);
procedure SetProgress(value:Integer);
end;
Deine Kommunikationklasse bekommt nun dieses Interface im Konstruktor mitgeteilt:
Delphi-Quellcode:
TMyKomm = class(...)
private
FFeedback : IProgressFeedback;
...
public
constructor Create(feedback:IProgressFeedback);
procedure DoWork;
end
constructor TMyKomm.Create(feedback:IProgressFeedback);
begin
inherited;
FFeedback := feedback; // speichern für spätere verwendung
end;
procedure TMyKomm.DoWork;
begin
FFeedback.WriteMessage('starte Kommunikation mit Gerät...';
FFeedback.SetProgressMinMax(0, ...);
for i := 0 to ... do
begin
FFeedback.SetProgress(i); // mitteilen, wo wir gerade stehen
...
end;
FFeedback.WriteMessage('download der Daten erfolgreich.';
end;
Jetzt muss das vereinbarte Interface nur noch von irgendeiner Klasse implementiert werden.
Das kann ein eigenes Formular sein oder auch das Formular, von dem der ganze Vorgang angestossen wurde.
Delphi-Quellcode:
TForm1 = class(TForm, IProgressFeedback)
....
protected
procedure WriteMessage(const msg:string);
procedure SetProgressMinMax(min,max:integer);
procedure SetProgress(value:Integer);
...
end;
procedure TForm1.SetProgress(value:Integer);
begin
self.BringToFront; // Trick: Formular wird automatisch immer wieder nach vorne gebracht
Progress1.Value := value; // Progressbar setzen
Progress1.Refresh; // sicherstellen, dass neu gezeichnet wird
end;
Sollte dich diese Technik interessieren, dann sag' Bescheid; ich kann dann auch noch zeigen, wie man die laufende Operation sauber abbrechen kann, falls der Benutzer dies wünscht.