如何读取一个DFM文件并且生成预览画面?
我看到一个工具,DFMEditor做到了,有谁知道是怎么做到的?
非得自己创建一个个的控件吗?
[解决办法]
unit Unit16;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
procedure setNameEvent(Reader: TReader; Component: TComponent;
var Name: string);
procedure CreateComponentEvent(Reader: TReader;
ComponentClass: TComponentClass; var Component: TComponent);
procedure rc(Component: TComponent);
procedure FindMethodEvent(Reader: TReader; const MethodName: string;
var Address: Pointer; var Error: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function ComponentToString(Component: TComponent): string;
var
BinStream: TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result := StrStream.DataString;
finally
freeandnil(StrStream);
end;
finally
freeandnil(BinStream)
end;
end;
function StringToComponent(Value: string): TComponent;
var
StrStream: TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);
finally
freeandnil(BinStream);
end;
finally
freeandnil(StrStream);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
r: TReader;
dfm: string;
c: TComponent;
ms, ms2: TMemoryStream;
begin
dfm := ComponentToString(Self);
ShowMessage(dfm);
ms := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
ms.Write(dfm[1], length(dfm));
ms.Position := 0;
ObjectTextToBinary(ms, ms2);
ms.SaveToFile( 'c:\1.txt ');
ms2.Position := 0;
r := TReader.Create(ms2, 4096);
r.Parent := nil;
r.Owner := nil;
r.OnSetName := setNameEvent;
r.OnCreateComponent := CreateComponentEvent;
r.OnFindMethod := FindMethodEvent;
c := r.ReadRootComponent(TForm.Create(nil));
TForm(c).Show;
TForm(c).Top := TForm1(c).Top + 30;
TForm(c).Left := TForm1(c).Left + 30;
FreeAndNil(ms);
FreeAndNil(ms2);
end;
procedure TForm1.setNameEvent(Reader: TReader; Component: TComponent;
var Name: string);
begin
// Memo1.Lines.Add(Name);
// Name := Name + '_1 ';
end;
procedure TForm1.CreateComponentEvent(Reader: TReader;
ComponentClass: TComponentClass; var Component: TComponent);
begin
// ShowMessage(ComponentClass.ClassName);
end;
procedure TForm1.rc(Component: TComponent);
begin
//
end;
procedure TForm1.FindMethodEvent(Reader: TReader; const MethodName: string;
var Address: Pointer; var Error: Boolean);
begin
Address := nil;
Error := false;
end;
initialization
RegisterClass(TForm);
RegisterClass(TButton);
RegisterClass(TMemo);
end.
[解决办法]
我怎么没发现源代码啊?只有一个非常老的版本的DFMEdit的exe文件,其他的都不知道是什么
___________________________
不好意思,上传错了,现在放上去了.dfmedit_0.3.0.0_src.zip.这个是前几天从sourceforge上下载的最新版,不会是非常老的吧?