This is a new site that's currently running on alpha code. There are going to be bugs. If you discover any, please report them on the site's issues page (GitHub account required). Thanks.
Warning: Many URLs are going to change. Refer to the README file to discover which library project's documentation has been completed.
All the previous examples in this documentation are rather contrived examples that seek to focus on one or more related aspects of the functionality in the PJResFile unit. This example is the first of three examples that aim to present useful code that uses several of the methods covered by other examples.
We will create a routine that takes a list of HTML and related files and creates a resource file which has a unique
RT_HTML resource for each file. The resource contains the contents of the related file.
Such resources can be used for display in Internet Explorer, using the
res:// protocol. See the article “How to create and use HTML resource files” for more information on this subject.
Here is the code of the routine:
procedure BuildHTMLResFile(const Files: TStrings; const ResFileName: string); var ResFile: TPJResourceFile; // res file object Entry: TPJResourceEntry; // a resource entry ResName: string; // a resource name SrcFileName: string; // a source file name SrcStm: TFileStream; // source file stream FileIdx: Integer; // loops thru Files const LanguageID: Word = $0809; // UK English begin ResFile := TPJResourceFile.Create; try // Loop through all source files for FileIdx := 0 to Pred(Files.Count) do begin // Record name of current file 0 should be fully specified SrcFileName := Files[FileIdx]; // Construct resource name from source file name, without path. If the // resource name already exists repeatedly prepend underscores until a // unique name is found ResName := ExtractFileName(SrcFileName); while ResFile.EntryExists(RT_HTML, PChar(ResName), LanguageID) do ResName := '_' + ResName; // Create new resource for current file - this will be unique Entry := ResFile.AddEntry(RT_HTML, PChar(ResName), LanguageID); // Copy source file into resource data SrcStm := TFileStream.Create(SrcFileName, fmOpenRead); try Entry.Data.CopyFrom(SrcStm, 0); Entry.Data.Position := 0; finally SrcStm.Free; end; end; // Save resource file ResFile.SaveToFile(ResFileName); finally ResFile.Free; // this also frees resource entry objects end; end;
The Files parameter of the routine is a string list containing the (fully specified) names of files that are to be included in the resource file. The ResFileName parameter receives the name of the output file which will be a valid 32 bit resource file.
The comments in the code should explain what is happening.
Alternative Approach [~>1.1]
The above code can be simplified when using v1.1 of the Resource File Unit because of its new LoadDataFromFile [~>1.1] method. Using this method we can replace all the stream processing code between the
// Copy source file into resource data comment and the end of the loop with a single line of code:
... // 5: Copy source file into resource data SrcStm := TFileStream.Create(SrcFileName, fmOpenRead); Entry.LoadDataFromFile(SrcFileName, False); end; ...