Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#30

AW: DFM-Dateien verschlüsseln?

  Alt 1. Mai 2017, 12:16
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:
  1. man überschreibt die Methode GetDeltaStreams
  2. 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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat