Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Meldungen aus einer Unit an ein Formular senden

  Alt 8. Jan 2014, 14:38
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat