將元件及其擁有的所有子元件寫入 DFM 檔案,支援動態 DFM 重用性。
procedure WriteComponentResFile(const FileName: string; Instance: TComponent);
var Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try Stream.WriteComponentRes(Instance.ClassName, Instance);
finally Stream.Free; end;
end;
參數:FileName 目標檔名,Instance 根元件(通常為 TForm 衍生類)。內部建立 TFileStream,呼叫 WriteComponentRes 寫入。
從 DFM 讀取根元件及其所有子元件,配合寫入函數實現重用。
function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
var Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try Result := Stream.ReadComponentRes(Instance);
finally Stream.Free; end;
end;
ReadComponentRes 讀取並回傳元件,結果作為函數回傳值。
編譯連結後 DFM 嵌入 EXE 資源 (RCDATA),格式變更(無資源頭)。InternalReadComponentRes 使用 TResourceStream 讀取:
function InternalReadComponentRes(const ResName: string; var Instance: TComponent): Boolean;
var HRsrc: THandle;
begin
HRsrc := FindResource(HInstance, PChar(ResName), RT_RCDATA);
Result := HRsrc <> 0;
if not Result then Exit;
FreeResource(HRsrc);
with TResourceStream.Create(HInstance, ResName, RT_RCDATA) do
try Instance := ReadComponent(Instance);
finally Free; end;
Result := True;
end;
HInstance 為應用程式控制代碼。先用 FindResource 檢查資源存在性避免 EResNotFound 異常,再建立 TResourceStream 呼叫 ReadComponent。Instance 為 var 參數,可直接取得讀出元件。