Aktuelle Delphi-Versionen bieten eine interessante Schnittstelle, mit der man nach dem Lesen der
DFM noch weitere
DFM-Resourcen auf das Form loslassen kann. Das wird z.B. in FMX zur Verwaltung der platform-spezifischen Eigenschaften eines Forms verwendet, ist aber keineswegs auf FMX beschränkt.
Es gibt zwei Herangehensweisen:
- man überschreibt die Methode GetDeltaStreams
- man verdrahtet den (protected) Event OnGetDeltaStreams
In diesem Beispiel verwende ich den override-Mechanismus, um eine (hier in Textform vorliegende)
DFM-Beschreibung beim Laden in das Form zu injizieren. Da es sich hier faktisch um ein geerbtes Form handelt, müssen die Instanzen alle
inherited
sein. Durch ein temporär erstelltes vererbtes Form, das nicht in die Exe eingelinkt wird, kann man den verändeten
DFM-Inhalt auch recht einfach herleiten.
Delphi-Quellcode:
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
protected
procedure GetDeltaStreams(Proc: TGetStreamProc); override;
end;
const
cDFM =
'inherited Form1: TForm1' + sLineBreak +
' Left = 0' + sLineBreak +
' Top = 0' + sLineBreak +
' Caption = ''Form1''' + sLineBreak +
' ClientHeight = 299' + sLineBreak +
' ClientWidth = 635' + sLineBreak +
' Color = clBtnFace' + sLineBreak +
' Font.Charset = DEFAULT_CHARSET' + sLineBreak +
' Font.Color = clWindowText' + sLineBreak +
' Font.Height = -11' + sLineBreak +
' Font.Name = ''Tahoma''' + sLineBreak +
' Font.Style = []' + sLineBreak +
' OldCreateOrder = False' + sLineBreak +
' PixelsPerInch = 96' + sLineBreak +
' TextHeight = 13' + sLineBreak +
' inherited Button1: TButton' + sLineBreak +
' Left = 392' + sLineBreak +
' Top = 48' + sLineBreak +
' Width = 75' + sLineBreak +
' Height = 25' + sLineBreak +
' Caption = ''Button1''' + sLineBreak +
' TabOrder = 0' + sLineBreak +
' OnClick = Button1Click' + sLineBreak +
' end' + sLineBreak +
' inherited Memo1: TMemo' + sLineBreak +
' Left = 392' + sLineBreak +
' Top = 168' + sLineBreak +
' Width = 185' + sLineBreak +
' Height = 89' + sLineBreak +
' Lines.Strings = (' + sLineBreak +
' ''Der Brite Richard Browning hat am ''' + sLineBreak +
' ''Rande der Technology, ''' + sLineBreak +
' ''Entertainment and Design ''' + sLineBreak +
' ''conference in Vancouver seinen ''' + sLineBreak +
' ''"Daedalus Suit" im Rahmen einer ''' + sLineBreak +
' ''Live-Demo vorgestellt. Der Anzug ''' + sLineBreak +
' ''besteht aus einem verst''#228''rkenden ''' + sLineBreak +
' ''Exoskelett, das mit sechs ''' + sLineBreak +
' ''D''#252''sentriebwerken best''#252''ckt ist. ''' + sLineBreak +
' ''Momentan taugt das Ganze f''#252''r eine ''' + sLineBreak +
' ''Flugdauer von bis zu 10 Minuten, ''' + sLineBreak +
' ''berichtet BBC online.'')' + sLineBreak +
' TabOrder = 1' + sLineBreak +
' end' + sLineBreak +
'end';
procedure TForm1.GetDeltaStreams(Proc: TGetStreamProc);
var
stream: TMemoryStream;
strS: TStringStream;
begin
inherited;
strS := TStringStream.Create(cDFM);
try
stream := TMemoryStream.Create;
try
ObjectTextToBinary(strS, stream);
stream.Position := 0;
Proc(stream);
finally
stream.Free;
end;
finally
strS.Free;
end;
end;
Hier noch die Original-
DFM als Text:
Code:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 299
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 40
Top = 24
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 40
Top = 55
Width = 185
Height = 89
TabOrder = 1
end
end