Save/load a font information in INI/text-file (Views: 2141)
Problem/Question/Abstract: How can I save/restore the TFont-object in INI and/or text file? Answer: Sometimes you need to save/to load a font information in INI-file, Registry or some text file. Now I desribe the some different methods. 1. very easy but not result isn't compact and effective (by data storage) procedure SaveFont(FStream: TIniFile; Section: string; smFont: TFont); begin FStream.WriteString(Section, Ident + 'Name', smFont.Name); FStream.WriteInteger(Section, Ident + 'CharSet', smFont.CharSet); FStream.WriteInteger(Section, Ident + 'Color', smFont.Color); FStream.WriteInteger(Section, Ident + 'Size', smFont.Size); FStream.WriteInteger(Section, Ident + 'Style', Byte(smFont.Style)); end; procedure LoadFont(FStream: TIniFile; Section: string; smFont: TFont); begin smFont.Name := FStream.ReadString(Section, Ident + 'Name', smFont.Name); smFont.CharSet := TFontCharSet(FStream.ReadInteger(Section, Ident + 'CharSet', smFont.CharSet)); smFont.Color := TColor(FStream.ReadInteger(Section, Ident + 'Color', smFont.Color)); smFont.Size := FStream.ReadInteger(Section, Ident + 'Size', smFont.Size); smFont.Style := TFontStyles(Byte(FStream.ReadInteger(Section, Ident + 'Style', Byte(smFont.Style)))); end; 2. more hardly than first method, but result is compact. I use this method in all own apps. procedure SaveFont(FStream: TIniFile; Section: string; smFont: TFont); begin FStream.WriteString(Section, 'Font', smFont.Name + ',' + IntToStr(smFont.CharSet) + ',' + IntToStr(smFont.Color) + ',' + IntToStr(smFont.Size) + ',' + IntToStr(Byte(smFont.Style))); end; procedure LoadFont(FStream: TIniFile; Section: string; smFont: TFont); var s, Data: string; i: Integer; begin s := FStream.ReadString(Section, 'Font', ',,,,'); try i := Pos(',', s); if i > 0 then begin {Name} Data := Trim(Copy(s, 1, i - 1)); if Data <> '' then smFont.Name := Data; Delete(s, 1, i); i := Pos(',', s); if i > 0 then begin {CharSet} Data := Trim(Copy(s, 1, i - 1)); if Data <> '' then smFont.Charset := TFontCharSet(StrToIntDef(Data, smFont.Charset)); Delete(s, 1, i); i := Pos(',', s); if i > 0 then begin {Color} Data := Trim(Copy(s, 1, i - 1)); if Data <> '' then smFont.Color := TColor(StrToIntDef(Data, smFont.Color)); Delete(s, 1, i); i := Pos(',', s); if i > 0 then begin {Size} Data := Trim(Copy(s, 1, i - 1)); if Data <> '' then smFont.Size := StrToIntDef(Data, smFont.Size); Delete(s, 1, i); {Style} Data := Trim(s); if Data <> '' then smFont.Style := TFontStyles(Byte(StrToIntDef(Data, Byte(smFont.Style)))); end end end end; except end; end; 3. as alternative for 1&2 methods I can offer the third - you can create a temporary stream, save the wished font component in this stream (Stream.SaveComponent) and then you can navigate the byte-by-byte in stream, to convert each byte into hex (or some other radix) and save into your text file as string. Each byte is a two symbols for hex radix. For font reading - on the contrary... |