unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TfMain = class(TForm) bBrowseOutputFile: TButton; bGo: TButton; bProjectFileBrowse: TButton; cbRemoveFromProject: TCheckBox; eOutputFile: TEdit; eProjectFile: TEdit; lConversionLog: TLabel; lInfo: TLabel; lOutputFile: TLabel; lProjectFile: TLabel; mConversionLog: TMemo; odProjectFile: TOpenDialog; pMain: TPanel; sdOutputFile: TSaveDialog; procedure bBrowseOutputFileClick(Sender: TObject); procedure bGoClick(Sender: TObject); procedure bProjectFileBrowseClick(Sender: TObject); procedure eOutputFileChange(Sender: TObject); procedure eProjectFileChange(Sender: TObject); private procedure UpdateState; end; var fMain: TfMain; implementation {$R *.dfm} uses DKLang, DKL_ResFile; procedure TfMain.bBrowseOutputFileClick(Sender: TObject); begin sdOutputFile.FileName := eOutputFile.Text; if sdOutputFile.Execute then eOutputFile.Text := sdOutputFile.FileName; end; procedure TfMain.bGoClick(Sender: TObject); var sProjectFile, sOutputFile: String; ResFileIn, ResFileOut: TDKLang_ResFile; ConstEntryIn, ConstEntryOut: TDKLang_ResEntry; procedure LogString(const s: String); overload; begin mConversionLog.Lines.Add(s); end; procedure LogString(const s: String; const aParams: Array of const); overload; begin LogString(Format(s, aParams)); end; begin try // Check prerequisites sProjectFile := Trim(eProjectFile.Text); sOutputFile := Trim(eOutputFile.Text); LogString('Project file: %s', [sProjectFile]); LogString('Output file: %s', [sOutputFile]); if AnsiSameText(sProjectFile, sOutputFile) then raise Exception.Create('You shoudn''t specify the same file for both project and output files'); // Try to load the file ResFileIn := TDKLang_ResFile.Create; try ResFileIn.LoadFromFile(sProjectFile); LogString('Project file loaded successfully.'); // Look for constant resource ConstEntryIn := ResFileIn.FindEntry(IntToStr(Integer(RT_RCDATA)), SDKLang_ConstResourceName); if ConstEntryIn=nil then LogString('The file doesn''t contain constant resource ("%s"), no need to convert it.', [SDKLang_ConstResourceName]) else begin LogString('Constant resource "%s" found (%d bytes data).', [SDKLang_ConstResourceName, Length(ConstEntryIn.RawData)]); // Create output file ResFileOut := TDKLang_ResFile.Create; try // Copy the resource ConstEntryOut := ConstEntryIn.Clone; ResFileOut.AddEntry(ConstEntryOut); LogString('Constant entry cloned.'); // Save the file ResFileOut.SaveToFile(sOutputFile); LogString('Output resource file saved successfully.'); finally ResFileOut.Free; end; // Remove the entry from the input file, if needed if cbRemoveFromProject.Checked then begin ResFileIn.RemoveEntry(ConstEntryIn); LogString('Constant entry removed from the project file.'); // Save the project resource file ResFileIn.SaveToFile(sProjectFile); LogString('Project resource file saved successfully.'); end; end; finally ResFileIn.Free; end; LogString('Finished.'); LogString('----------------------------------------'); except on e: Exception do begin LogString('Exception class: %s', [e.ClassName]); LogString('Exception message: %s', [e.Message]); raise; end; end; end; procedure TfMain.bProjectFileBrowseClick(Sender: TObject); begin odProjectFile.FileName := eProjectFile.Text; if odProjectFile.Execute then eProjectFile.Text := odProjectFile.FileName; end; procedure TfMain.eOutputFileChange(Sender: TObject); begin UpdateState; end; procedure TfMain.eProjectFileChange(Sender: TObject); begin eOutputFile.Text := ChangeFileExt(eProjectFile.Text, '.dkl_const.res'); UpdateState; end; procedure TfMain.UpdateState; begin bGo.Enabled := (eProjectFile.Text<>'') and (eOutputFile.Text<>''); end; end.