⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dfmutils.pas

📁 delphi 写的delphi的程序 Handel is a free, standalone development tool created with Delphi 3 that enable
💻 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 + -