unit FAQGlobals; interface uses Windows, Classes, SysUtils; type TFAQOptions = class(TPersistent) private FStylePath: string; FImagePath: string; FStylesheet: TFilename; FAImage: TFilename; FQImage: TFilename; FFooter: TStrings; FItem: TStrings; FHeader: TStrings; FTitle: string; FFilename:string; procedure SetFooter(const Value: TStrings); procedure SetHeader(const Value: TStrings); procedure SetItem(const Value: TStrings); procedure SetDefaults; public constructor Create; destructor Destroy; override; procedure LoadFromFile(const Filename:string); procedure SaveToFile(const Filename:string); published property Header: TStrings read FHeader write SetHeader; property Item: TStrings read FItem write SetItem; property Footer: TStrings read FFooter write SetFooter; property Title: string read FTitle write FTitle; property QImage: TFilename read FQImage write FQImage; property AImage: TFilename read FAImage write FAImage; property ImagePath: string read FImagePath write FImagePath; property Stylesheet: TFilename read FStylesheet write FStylesheet; property StylePath: string read FStylePath write FStylePath; end; function FAQOptions: TFAQOptions; function DoSaveReplace(const S:String):string; function DoLoadReplace(const S:String):string; function FlattenText(Strings:TStrings):string; implementation uses Forms, IniFiles; var GlobalFAQOptions: TFAQOptions = nil; function FAQOptions: TFAQOptions; begin if GlobalFAQOptions = nil then begin GlobalFAQOptions := TFAQOptions.Create; GlobalFAQOptions.LoadFromFile(ChangeFileExt(Application.Exename, '.ini')); end; Result := GlobalFAQOptions; end; function DoSaveReplace(const S:String):string; begin Result := StringReplace(S,#13#10,'{CRLF}',[rfReplaceAll, rfIgnoreCase]); end; function DoLoadReplace(const S:String):string; begin Result := StringReplace(S,'{CRLF}',#13#10,[rfReplaceAll, rfIgnoreCase]); end; function FlattenText(Strings:TStrings):string; var i:integer; begin Result := ''; for i := 0 to Strings.Count - 1 do Result := Result + Strings[i] + ' '; while (Length(Result) > 0) and (AnsiLastChar(Result) <= #32) do // remove spaces at end SetLength(Result,Length(Result)-1); end; { TFAQOptions } constructor TFAQOptions.Create; begin inherited Create; FHeader := TStringlist.Create; FItem := TStringlist.Create; FFooter := TStringlist.Create; SetDefaults; end; destructor TFAQOptions.Destroy; begin if FFilename <> '' then SaveToFile(FFilename); FHeader.Free; FItem.Free; FFooter.Free; inherited; end; procedure TFAQOptions.LoadFromFile(const Filename: string); begin with TIniFile.Create(Filename) do try if ValueExists('Settings', 'Header') then Header.Text := DoLoadReplace(ReadString('Settings','Header','')); if ValueExists('Settings', 'Item') then Item.Text := DoLoadReplace(ReadString('Settings','Item','')); if ValueExists('Settings', 'Footer') then Footer.Text := DoLoadReplace(ReadString('Settings','Footer','')); Title := ReadString('Settings','Title',Title); QImage := ReadString('Settings','QImage',QImage); AImage := ReadString('Settings','AImage',AImage); ImagePath := ReadString('Settings','ImagePath',ImagePath); Stylesheet := ReadString('Settings','Stylesheet',Stylesheet); StylePath := ReadString('Settings','StylePath',StylePath); finally Free; end; FFilename := Filename; end; procedure TFAQOptions.SaveToFile(const Filename: string); begin with TIniFile.Create(Filename) do try WriteString('Settings','Header',DoSaveReplace(Header.Text)); WriteString('Settings','Item',DoSaveReplace(Item.Text)); WriteString('Settings','Footer',DoSaveReplace(Footer.Text)); WriteString('Settings','Title',Title); WriteString('Settings','QImage',QImage); WriteString('Settings','AImage',AImage); WriteString('Settings','ImagePath',ImagePath); WriteString('Settings','Stylesheet',Stylesheet); WriteString('Settings','StylePath',StylePath); finally Free; end; FFilename := Filename; end; procedure TFAQOptions.SetDefaults; begin Header.Add(''); Header.Add(''); Header.Add('<#TITLE>'); Header.Add(''); Header.Add(''); Header.Add(''); Header.Add(''); Header.Add(''); Header.Add(''); Header.Add('

<#TITLE>

'); Header.Add(''); Header.Add('
Expand/Collapse
'); Item.Add(' <#Q_ITEM>
'); Item.Add(''); Footer.Add(''); Footer.Add(''); QImage := 'q.gif'; AImage := 'a.gif'; ImagePath := 'images/'; StyleSheet := 'default.css'; StylePath := 'styles/'; Title := 'Frequently Asked Questions'; end; procedure TFAQOptions.SetFooter(const Value: TStrings); begin FFooter.Assign(Value); end; procedure TFAQOptions.SetHeader(const Value: TStrings); begin FHeader.Assign(Value); end; procedure TFAQOptions.SetItem(const Value: TStrings); begin FItem.Assign(Value); end; initialization finalization FreeAndNil(GlobalFAQOptions); end.