Leider funktioniert das hier bei Delphi 2009 nicht im Fall von Interface - Methoden, der blaue Punkt bleibt bestehen:
Noch was: Mal abgesehen davon, daß
inline
in der
DPR nicht funktioniert, könnte man für das Logger-Interface auch einen Wrapper-Record definieren, der die Aufrufe unter
IFDEF an das Interface weiterreicht. Damit wird keine der inlined Record-Methoden aufgerufen, wenn das entsprechende IFDEF nicht zutrifft. Einziger etwas unschöner Nebeneffekt ist, daß eine nicht verwendete Variable
T
in
Main angemeckert wird.
Delphi-Quellcode:
unit Unit58;
interface
{.$DEFINE Log}
type
ILog =
interface
['
{76BA1F8A-D171-4817-BB3D-337295B03CE0}']
procedure Log(AText:
string);
end;
TLog =
record
private
{$IFDEF Log}
FLog: ILog;
{$ENDIF}
public
procedure Init(
const AName:
string);
inline;
procedure Log(AText:
string);
inline;
end;
implementation
type
TLogConsole =
class(TInterfacedObject, ILog)
public
procedure Log(AText:
string);
end;
procedure TLogConsole.Log(AText:
string);
begin
Writeln(AText);
end;
procedure TLog.Init(
const AName:
string);
begin
{$IFDEF Log}
// der Einfachheit halber
FLog := TLogConsole.Create;
{$ENDIF}
end;
procedure TLog.Log(AText:
string);
begin
{$IFDEF Log}
if FLog <>
nil then begin
FLog.Log(AText);
end;
{$ENDIF}
end;
end.
Delphi-Quellcode:
program Project67;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Unit58 in 'Unit58.pas';
procedure Main;
var
T: TLog;
begin
T.Init('TLogConsole');
T.Log('Hallo Welt');
Writeln('Wie geht''s?');
Readln;
end;
begin
Main;
end.