![]() |
AW: Meldungen aus einer Unit an ein Formular senden
Zitat:
![]() |
AW: Meldungen aus einer Unit an ein Formular senden
Zitat:
könntest du vielleicht kurz ein Code-Beispiel dazu schreiben. Ich sitze vor einem ähnlichen Problem und mich würde interessieren wie man dies universal handhaben könnte. Danke und Lg |
AW: Meldungen aus einer Unit an ein Formular senden
Ganz minimale Klasse ohne eigene Stringliste:
Delphi-Quellcode:
Diese Unit wird nun in beiden Formularunits eingebunden. Form1 erstellt die Instanz im FormCreate und weist einen Eventhandler zu:
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.
Delphi-Quellcode:
Die andere Formularunit verfügt über eine Property vom Typ TMessageManager, der man dann einfach diese Instanz zuweist:
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;
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:
Der Code innerhalb des Innput-Formulars ist dann recht überschaubar:
procedure TfrmMitMemo.btnShowInputClick(Sender: TObject);
begin frmInput.Manager := FManager; frmInput.Show; end;
Delphi-Quellcode:
Nun noch bei Freigabe des Memo-Formulars ordentlich aufräumen:
procedure TfrmInput.btnAddClick(Sender: TObject);
begin if Assigned(FManager) then FManager.AddMessage(edtMessage.Text); end;
Delphi-Quellcode:
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.
procedure TfrmMitMemo.FormDestroy(Sender: TObject);
begin FManager.Free; end; |
AW: Meldungen aus einer Unit an ein Formular senden
Oi, des ging ja schnell. Vielen Dank, werde mir das mal zu Gemüte führen.
LG |
AW: Meldungen aus einer Unit an ein Formular senden
Hallo DeddyH,
klasse, das war genau das was ich brauchte. Da ich aber nur ein Formular und eine Unit ohne Formulat habe mußte ich es nur etwas anpassen aber jetzt funktioniert es super. Danke. |
AW: Meldungen aus einer Unit an ein Formular senden
Zitat:
Gruß K-H |
AW: Meldungen aus einer Unit an ein Formular senden
|
AW: Meldungen aus einer Unit an ein Formular senden
Hallo DeddyH,
Superteil, löppelt prima, nur im Gegensatz zum Lars bekomm ich's nicht gebacken den Messagemanager in eine unit OHNE Formular einzubinden. :-( Zitat:
Delphi-Quellcode:
Kannst Du (oder jemand anders :-)) mir das bitte anpassen ??
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; Ich raff das nicht ... In einem Datamodul hab ichs zum Laufen bekommen :-)
Delphi-Quellcode:
unit Unit4;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MsgManager, ExtCtrls; type TDataModule4 = class(TDataModule) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private FManager: TMessageManager; { Private declarations } public { Public declarations } property Manager: TMessageManager read FManager write FManager; end; procedure test; var DataModule4: TDataModule4; implementation {$R *.dfm} procedure test; begin if Assigned(DataModule4.FManager) then DataModule4.FManager.AddMessage('hallo test aus datamod'); end; procedure TDataModule4.Timer1Timer(Sender: TObject); begin if Assigned(FManager) then FManager.AddMessage('hallo timer aus datamod'); end; end. Vielen Dank schomal ... Gruß Sigi |
AW: Meldungen aus einer Unit an ein Formular senden
Hilft Dir dieses Beispiel weiter? Die Klasse TMsgManager steht in einer eigenen Unit und ist unverändert, das Formular hat wieder ein Memo, erzeugt eine Instanz des Managers und weist ihr den EventHandler zu, innerhalb dessen ins Memo geschrieben wird, alles genau wie oben gezeigt. Neu ist die 2. Unit, die kein Formular besitzt, sondern nur eine Klasse deklariert.
Delphi-Quellcode:
Der ButtonClick des Formulars sieht dann so aus:
unit MessageSend;
interface uses SysUtils, MsgManager; type TMessageGenerator = class private FManager: TMessageManager; public procedure CountTo1000; property Manager: TMessageManager read FManager write FManager; end; implementation { TMessageGenerator } procedure TMessageGenerator.CountTo1000; var Number: integer; begin for Number := 1 to 1000 do if Number mod 10 = 0 then if Assigned(Manager) then Manager.AddMessage(IntToStr(Number)); end; end.
Delphi-Quellcode:
Gedacht habe ich mir das Ganze letztes Jahr so: der "Konsument" der Nachrichten erzeugt den Manager und weist ihm einen OnNewMessage-Handler zu. Die benachrichtigende Klasse besitzt eine Property vom Typ des Managers, erstellt aber keine eigene Instanz, sondern bekommt diese vom Konsumenten zugewiesen. Sobald sie etwas mitzuteilen hat, ruft sie einfach die AddMessage-Methode ihres zugewiesenen Managers (so vorhanden) auf.
procedure TfrmMitMemo.Button1Click(Sender: TObject);
var Generator: TMessageGenerator; begin Generator := TMessageGenerator.Create; try Generator.Manager := FManager; Generator.CountTo1000; finally Generator.Free; end; end; |
AW: Meldungen aus einer Unit an ein Formular senden
Moin Detlef,
perfekt, super, löppelt wunderbar ... Vielen Dank :hi::hi: Zitat:
Zitat:
Und, Da kommen auch gleich weitere Ideen auf: :-) Ich habe meistens mit Datenumschaufeln oder Prüfroutinen zu tun die über etliche Datensätze iterieren und da verwende ich gern eine Progressbar. Kann man das so umbauen oder erweitern das der Fortschritt in unit2 auf der Hauptform angezeigt wird ? Ich denke, das Thema ist noch nicht durch und sollte auch als Beispiel in die Codelib. Vielen Dank schonmal und Gruß Sigi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz