3

我想在 sql 数据库中保存字体(FontStyle,FontColor,FontSize),为此,我需要将其保存为字符串。如何将 Tfont 转换为 TString?

4

3 回答 3

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;
于 2014-04-06T08:56:24.540 回答
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;

在任何情况下,您都可以将流转换为十六进制序列。

于 2013-11-27T16:19:19.313 回答
0

我看到别人的相当奇怪的代码这样做:创建一个虚拟控件(TLabel),为其分配您的字体,然后保存为.dfm(二进制,然后是文本)。

于 2017-06-19T10:56:16.847 回答