Ich habe ein Object, das in einer Schleife einen Windows Ordner und
Unterordner nach bestimmten Dateien durchsucht und bei den gefundenen
Dateien gewisse Untersuchungen durchführt. Im aufrufenden Form (Unit1)
möchte ich anzeigen, welche Datei gerade bearbeitet wird.
Das wäre einfach, wenn ich in der
Unit des Objectes ein "uses Unit1"
einfügen würde, das ist aber nicht möglich, da ich das Object von
verschiedenen Stellen des Programmes aufrufen möchte.
Um nicht den umfangreichen Code des Objectes hier bringen zu müssen,
habe ich das Problem hier auf ein simples Testprogramm reduziert.
Unit1 enthält das aufrufende Form, Unit2 das simplifizierte Object TCBTest.
Statt der Datei Proceduren wird von TCBTest nur eine Liste gefüllt.
Hier das Object TCBTest:
Delphi-Quellcode:
unit Unit2;
interface
uses
Classes, SysUtils, Controls, Dialogs ;
type
TCBTest =
class(TControl)
private
FSList: TStringList;
procedure FillSL;
public
constructor Create;
override;
destructor Destroy;
override;
property SList: TStringList
read FSList;
end;
var
CBTest: TCBTest;
implementation
constructor TCBTest.Create(AOwner: TComponent);
begin
inherited;
FSList := TStringList.Create;
FSList.Clear;
FillSL;
end;
destructor TCBTest.Destroy;
begin
FreeAndNil(FSList);
inherited Destroy;
end;
procedure TCBTest.FillSL;
var
i: integer;
begin
FSList.Clear;
for i := 0
to 9
do begin
FSList.Add(IntToStr(i));
ShowMessage(IntToStr(i) + '
added to list');
{ statt ShowMessage sollte hier die Rückmeldung zum
aufrufendem Form erfolgen - Anzeige im Edit Feld }
Sleep(200);
// Zeit für Anzeige
end;
end;
end.
Das Form, welches das Object aufruft hat nur einen Button,
eine Listbox und ein Editfeld.
Delphi-Quellcode:
unit Unit1;
interface
uses
Messages, SysUtils, Classes, Controls, Forms,
Dialogs, StdCtrls, Unit2;
type
TForm1 =
class(TForm)
Button1: TButton;
lbxSL: TListBox;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
CBTest := TCBTest.Create(Self);
lbxSL.Items := CBTest.SList;
FreeAndNil(CBTest);
end;
end.
Ich habe mit Callback Funktionen und auch mit Procedural Types
experimentiert, ohne eine Lösung zu finden.
Kann mir jemand helfen?