Originally Posted by
jkuiper
DoOnBeforePost-event kan je aanmaken, maar dan kan je de vraag stellen: hoort deze op mijn form gezet te worden?.
Mee eens, maar de gedachte was het dan zo op te splitsen, dat de controle in de Datamodule in de OnBeforePost plaatsvindt en de tekst die voortvloeit uit die controle naar het Form.DoOnBeforePost te sturen, die op zijn beurt de tekst in een MessageDlg laat zien. Optimaal is het w.s. niet.
Ik heb zelf een soort gelijk systeem opgezet als VideoRipper, alleen dan niet in met aparte class dus iets minder geavanceerd, maar het voelde niet lekker.
Basis datamodule:
Code:
type
TEventOnException = procedure(const aSource: string; E: Exception) of object;
TEventOnExecuteToGUI = procedure(const aMsg: string) of object;
TEventOnExecuteToLog = procedure(const aMsg: string) of object;
TDmBasis = class(TDataModule, IBasisLogging)
private
FOnExecuteToGUI: TEventOnExecuteToGUI;
FOnExecuteToLog: TEventOnExecuteToLog;
FOnException: TEventOnException;
private
procedure DoOnGUI(const aMsg: string);
procedure DoOnLog(const aMsg: string);
procedure DoOnLogException(const aMsg: string; E:Exception); overload;
public
property OnExecuteToGUI: TEventOnExecuteToGUI read FOnExecuteToGUI write FOnExecuteToGUI;
property OnExecuteToLog: TEventOnExecuteToLog read FOnExecuteToLog write FOnExecuteToLog;
property OnException: TEventOnException read FOnException write FOnException;
end;
procedure TDmBasis.DoOnLog(const aMsg: string);
begin
if Assigned( FOnExecuteToLog ) then
FOnExecuteToLog( aMsg )
else
LogApplication( Format('%s (FOnExecuteToLog) not assigned. %s', [ GetMyProcName(True), aMsg ], Globals.FormatSettings ));
end;
Basis class t.b.v. een Task (in dit geval geen form als class maar een class t.b.v. een service applicatie waarin e.e.a. gelogd wordt).
Code:
type
TTaskBasis = class(TInterfacedObject, IBasisLogging)
private
procedure DoOnGUI(const aMsg: string);
procedure DoOnLog(const aMsg: string);
procedure DoOnLogException(const aMsg: string; E:Exception); overload;
end;
procedure TTaskBasis.DoOnLog(const aMsg: string);
begin
TThread.Synchronize(TThread.Current,
procedure
begin
WriteLog( FTaskLogFile, aMsg )
end);
end;
In afgeleide Datamodule en afgeleide class t.b.v. de Task de zaken aan elkaar koppelen:
Code:
FDmAanvragen.OnExecuteToLog := DoOnLog; // DoOnLog = TTaskBasis.DoOnLog
Vervolgens kan ik in beide afgeleide naar dezelfde logfile e.e.a. loggen:
Code:
DoOnLog( Format('Bestand %s is aangemaakt', [ FFile ] , Globals.FormatSettings));
Met TMessage (in principe een singleton) in een applicatie kun je waarschijnlijk nog meer code scheiden. Zoals ik hierboven (in een verkorte versie) heb getoond zijn Dm en class (of form) toch aan elkaar gekoppeld. Weliswaar "loosely coupled" maar ik vroeg me af of dat anders c.q. beter zou kunnen.
Bedankt voor de reacties, ik ga e.e.a. verder uitproberen.
Bookmarks