Ganz minimale Klasse ohne eigene Stringliste:
Delphi-Quellcode:
unit MsgManager;
interface
uses Classes;
type
TNewMessageEvent =
procedure(Sender: TObject;
const NewMsg:
string)
of object;
TMessageManager =
class
private
FOnNewMessage: TNewMessageEvent;
public
procedure AddMessage(
const NewMessage:
string);
property OnNewMessage: TNewMessageEvent
read FOnNewMessage
write FOnNewMessage;
end;
implementation
{ TMessageManager }
procedure TMessageManager.AddMessage(
const NewMessage:
string);
begin
if Assigned(FOnNewMessage)
then
FOnNewMessage(self, NewMessage);
end;
end.
Diese
Unit wird nun in beiden Formularunits eingebunden. Form1 erstellt die Instanz im FormCreate und weist einen Eventhandler zu:
Delphi-Quellcode:
type
TfrmMitMemo = class(TForm)
mmoMessages: TMemo;
btnShowInput: TButton;
procedure FormCreate(Sender: TObject);
procedure btnShowInputClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
FManager: TMessageManager;
procedure AddMessage(Sender: TObject; const NewMsg: string);
public
{ Public-Deklarationen }
end;
...
procedure TfrmMitMemo.AddMessage(Sender: TObject; const NewMsg: string);
begin
mmoMessages.Lines.Add(NewMsg);
end;
procedure TfrmMitMemo.FormCreate(Sender: TObject);
begin
FManager := TMessageManager.Create;
FManager.OnNewMessage := AddMessage;
end;
Die andere Formularunit verfügt über eine Property vom Typ TMessageManager, der man dann einfach diese Instanz zuweist:
Delphi-Quellcode:
type
TfrmInput = class(TForm)
edtMessage: TEdit;
btnAdd: TButton;
procedure btnAddClick(Sender: TObject);
private
{ Private-Deklarationen }
FManager: TMessageManager;
public
{ Public-Deklarationen }
property Manager: TMessageManager read FManager write FManager;
end;
Delphi-Quellcode:
procedure TfrmMitMemo.btnShowInputClick(Sender: TObject);
begin
frmInput.Manager := FManager;
frmInput.Show;
end;
Der Code innerhalb des Innput-Formulars ist dann recht überschaubar:
Delphi-Quellcode:
procedure TfrmInput.btnAddClick(Sender: TObject);
begin
if Assigned(FManager) then
FManager.AddMessage(edtMessage.Text);
end;
Nun noch bei Freigabe des Memo-Formulars ordentlich aufräumen:
Delphi-Quellcode:
procedure TfrmMitMemo.FormDestroy(Sender: TObject);
begin
FManager.Free;
end;
und fertig ist die Laube. Man muss lediglich sicherstellen, dass man anschließend nicht mehr aus dem Input-Formular auf diesen Manager zugreift, da wir zugegebenermaen dort nun einen dangling pointer lauern haben.