📄 dfmutils.pas
字号:
unit DFMUtils;
interface
uses
SysUtils, WinTypes, WinProcs, Classes, Consts,Dialogs,FILECTRL,
Graphics,Controls,Forms,Proxies,ToolIntf, proxy, utils;
function CreateProxy(Ancestor:TFormClass;const ClassName:string):TObject;
function ReadDFM(const DFMName:string):TForm;
procedure WriteDFM(Form:TForm;FormName:string);
implementation
uses utype, uconst;
{炼惑栏肺何磐 拌铰罐绊 林绢柳 努贰胶 捞抚阑 ClassName捞扼 窍绰 橇废矫 按眉甫 父电促.}
function CreateProxy(Ancestor:TFormClass;const ClassName:string):TObject;
begin
Result:= Ancestor.Create(nil);
Proxies.CreateSubClass(Result,ClassName,Ancestor);
end;
function ReadFormAsText(const DFMName:string; Form: TForm):TForm;
var
Input,Output:TMemoryStream;
FileName: string;
begin
Result:= nil;
Input:= TMemoryStream.Create;
Input.LoadFromFile(DFMName);
Output:= TMemoryStream.Create;
ObjectTextToResource(Input,Output);
Output.SaveToFile(FilePath + TempForm);
Output.LoadFromFile(FilePath + TempForm);
Output.Position:=0;
// ReadClass;
try
Output.ReadComponentRes(Form);
finally
Input.Free;
OutPut.Free;
end;
Result:= Form;
end;
function SetupDFM(const DFMName:string):TForm;
var
Stream:TFileStream;
DFMDataLen, Position:Integer;
Reader:TReader;
Flags:TFilerFlags;
TypeName:string;
Form:TForm;
Temp: Longint;
RCType: Word;
ret: word;
begin
Result:= nil;
try
Form:= CreateProxy(TProxyForm,GetNetFileName(DFMName)) as TForm;
Form.Show;
TExposeComponent(Form).SetDesigning(True);
Stream:= TFileStream.Create(DFMName, fmOpenRead);
Reader:= TReader.Create(Stream, Stream.Size);
Reader.Root:= Form;
Reader.BeginReferences;
Reader.Read(RCType, SizeOf(RCType));
if RcType <> $0AFF then
// invalid file format or Delphi 5 form(text form file)
begin
if Reader <> nil then Reader.Free;
if Stream <> nil then Stream.Free;
ret:= MessageDlg('This is not Delphi Form or Delphi 5 Form!' +#10#13 +
'Do you want read this form as text?', mtWarning, [mbYes, mbNo], 0);
if ret = mrYes then ReadFormAsText(DFMName, Form);
Exit;
end;
Reader.Position:= 3; // Resource Type
while Reader.ReadValue <> vaNull do; // Form Name
Reader.Position:= Reader.Position + 2; // Resource Flag($3010)
Reader.Read(DFMDataLen, SizeOf(DFMDataLen)); // Resource Size
Reader.ReadSignature; // 胆颇捞 汽 侥喊 扁龋 ('TPF0')
Reader.ReadPrefix(Flags, Position); // 汽 拌铰 咯何 备喊(ffInherited, ffChildPos)
Temp:= Reader.Position;
TypeName:= Reader.ReadStr; // Form Class Name (TForm1)
// Form.Name:= Reader.ReadStr; // Form Name (Form1)
RenameSubClass(Form, TypeName); // 汽狼 ClassName阑 犁汲沥茄促.
Reader.Position:= Temp;
Reader.OnFindMethod:= TProxyForm(Form).OnFindMethodHandler;
Reader.OnError:= TProxyForm(Form).OnReaderErrorHandler;
Reader.ReadComponent(Form);
if Reader <> nil then Reader.Free;
if Stream <> nil then Stream.Free;
Reader.FixupReferences;
Reader.EndReferences;
except
on EClassNotFound do ;
end;
Result:= Form;
end;
function ReadDFM(const DFMName:string):TForm;
begin
Result:= nil;
if not FileExists(DFMName) then Exit;
Result:= SetupDFM(DFMName);
end;
procedure WriteDFM(Form:TForm;FormName:string);
var
Output: TFileStream;
ResName:string;
I, Po:Integer;
Writer:TWriter;
HeaderSize: Integer;
Origin, ImageSize: Longint;
Header: array[0..79] of Char;
begin
ResName:= Form.ClassName;
// ResName:= FormName;
try
Output:= TFileStream.Create(FormName, fmCreate);
Byte((@Header[0])^) := $FF;
Word((@Header[1])^) := 10;
HeaderSize := StrLen(StrUpper(StrPLCopy(@Header[3], ResName, 63))) + 10;
Word((@Header[HeaderSize - 6])^) := $1030;
Longint((@Header[HeaderSize - 4])^) := 0;
Output.WriteBuffer(Header, HeaderSize);
Po:= Output.Position;
Writer:= TWriter.Create(Output, 4096);
Writer.Position:= Po;
Writer.WriteRootComponent(Form);
// write dfm file size
ImageSize := Writer.Position - Po;
Writer.Position := Po - 4;
Writer.Write(ImageSize, SizeOf(ImageSize));
Writer.Position := Po + ImageSize;
finally
Writer.Free;
Output.Free;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -