我想在sql数据库中保存字体(FontStyle,FontColor,FontSize),为此,我需要将其保存为字符串。如何将Tfont转换为TString?
答案 0 :(得分:5)
要存储字体,您只需要字体的主要属性而不是所有字体。我这样做是为了将字体保存到INI文件。您可以轻松地将其转换为返回字符串(TString)的函数:
procedure TMyIniFile.WriteFont(CONST Section, Ident: string; Value: TFont);
begin
WriteString (Section, Ident + 'Name', Value.Name);
WriteInteger(Section, Ident + 'CharSet', Value.CharSet);
WriteInteger(Section, Ident + 'Color', Value.Color);
WriteInteger(Section, Ident + 'Size', Value.Size);
WriteInteger(Section, Ident + 'Style', Byte(Value.Style));
end;
答案 1 :(得分:3)
是否真的有必要将字体参数存储为字符串?我可以为你提供存储字体BLOB:
procedure SaveFontToStream(AStream: TStream; AFont: TFont);
var LogFont: TLogFont;
Color: TColor;
begin
if GetObject(AFont.Handle, SizeOf(LogFont), @LogFont) = 0 then
RaiseLastOSError;
AStream.WriteBuffer(LogFont, SizeOf(LogFont));
Color := AFont.Color;
AStream.WriteBuffer(Color, SizeOf(Color));
end;
procedure LoadFontFromStream(AStream: TStream; AFont: TFont);
var LogFont: TLogFont;
F: HFONT;
Color: TColor;
begin
AStream.ReadBuffer(LogFont, SizeOf(LogFont));
F := CreateFontIndirect(LogFont);
if F = 0 then
RaiseLastOSError;
AFont.Handle := F;
AStream.ReadBuffer(Color, SizeOf(Color));
AFont.Color := Color;
end;
在任何情况下,您都可以将流转换为十六进制序列。
答案 2 :(得分:0)
我看到其他人的代码很奇怪: 创建一个虚拟控件(TLabel),为其指定字体,然后保存为.dfm(二进制,然后是文本)。