Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сохранение параметров шрифта в INI-файле

Delphi , Графика и Игры , Шрифты

Сохранение параметров шрифта в INI-файле

Мое решение: (для сохранения всей иннформации об отдельном шрифте)


function FontToStr(font: TFont): string;
  procedure yes(var str: string);
  begin

    str := str + 'y';
  end;
  procedure no(var str: string);
  begin

    str := str + 'n';
  end;
begin

  {кодируем все атрибуты TFont в строку}
  Result := '';
  Result := Result + IntToStr(font.Color) + '|';
  Result := Result + IntToStr(font.Height) + '|';
  Result := Result + font.Name + '|';
  Result := Result + IntToStr(Ord(font.Pitch)) + '|';
  Result := Result + IntToStr(font.PixelsPerInch) + '|';
  Result := Result + IntToStr(font.size) + '|';
  if fsBold in font.style then
    yes(Result)
  else
    no(Result);
  if fsItalic in font.style then
    yes(Result)
  else
    no(Result);
  if fsUnderline in font.style then
    yes(Result)
  else
    no(Result);
  if fsStrikeout in font.style then
    yes(Result)
  else
    no(Result);
end;

procedure StrToFont(str: string; font: TFont);
begin

  if str = '' then
    Exit;
  font.Color := StrToInt(tok('|', str));
  font.Height := StrToInt(tok('|', str));
  font.Name := tok('|', str);
  font.Pitch := TFontPitch(StrToInt(tok('|', str)));
  font.PixelsPerInch := StrToInt(tok('|', str));
  font.Size := StrToInt(tok('|', str));
  font.Style := [];
  if str[0] = 'y' then
    font.Style := font.Style + [fsBold];
  if str[1] = 'y' then
    font.Style := font.Style + [fsItalic];
  if str[2] = 'y' then
    font.Style := font.Style + [fsUnderline];
  if str[3] = 'y' then
    font.Style := font.Style + [fsStrikeout];
end;

function tok(sep: string; var s: string): string;

  function isoneof(c, s: string): Boolean;
  var
    iTmp: integer;
  begin
    Result := False;
    for iTmp := 1 to Length(s) do
    begin
      if c = Copy(s, iTmp, 1) then
      begin
        Result := True;
        Exit;
      end;
    end;
  end;
var

  c, t: string;
begin

  if s = '' then
  begin
    Result := s;
    Exit;
  end;
  c := Copy(s, 1, 1);
  while isoneof(c, sep) do
  begin
    s := Copy(s, 2, Length(s) - 1);
    c := Copy(s, 1, 1);
  end;
  t := '';
  while (not isoneof(c, sep)) and (s <> '') do
  begin
    t := t + c;
    s := Copy(s, 2, length(s) - 1);
    c := Copy(s, 1, 1);
  end;
  Result := t;
end;

Если вы серьезно нуждаетесь в подобной технологии для сохранения свойств объектов, то я бы посоветовал вам создать наследника класса TIniFile, выполняющего подобные операции.

Here's the translation of the content into Russian:

Ваше решение хорошо для преобразования свойств шрифта в строку и обратно, но это не самое эффективное способ сохранения настроек шрифта в файле INI.

Вот несколько предложений:

  1. Вместо конкатенации строк с помощью +, используйте функцию Format для создания итоговой строки. Это будет более эффективно.
  2. При парсинге строки в процедуре StrToFont вы можете использовать цикл для извлечения каждого значения вместо вызова tok несколько раз.
  3. Вам может быть полезно рассмотреть использование более robust метода разделения значений в строке, например, с помощью точки с запятой (;) или запятой (,).

Вот пример модификации вашего кода:

function FontToStr(font: TFont): string;
begin
  Result := Format('Color=%d|Height=%d|%s|Pitch=%d|PixelsPerInch=%d|Size=%d',
     [font.Color, font.Height, font.Name, Ord(font.Pitch), font.PixelsPerInch, font.Size]);
  if fsBold in font.Style then
    Result := Result + '|y';
  if fsItalic in font.Style then
    Result := Result + '|y';
  if fsUnderline in font.Style then
    Result := Result + '|y';
  if fsStrikeout in font.Style then
    Result := Result + '|y';
end;

procedure StrToFont(str: string; var font: TFont);
var
  s, sep, val: string;
begin
  sep := '|';
  if str = '' then
    Exit;

   // Parse each value
  for i := 1 to Length(sep) - 1 do begin
    val := '';
    while pos(sep, str) > 0 do begin
      val := tok(sep, str);
      Break;
    end;

    case uppercase(val) of
       'COLOR':
        font.Color := StrToInt(ExtractFileExt(str));
       'HEIGHT':
        font.Height := StrToInt(ExtractFileExt(str));
       'NAME':
        font.Name := ExtractFileExt(str);
       'PITCH':
        font.Pitch := TFontPitch(StrToInt(ExtractFileExt(str)));
       'PIXELSPERINCH':
        font.PixelsPerInch := StrToInt(ExtractFileExt(str));
       'SIZE':
        font.Size := StrToInt(ExtractFileExt(str));
    end;

     // Remove the value from the string
    Delete(str, 1, Length(val) + Length(sep));
  end;

   // Parse style values
  if pos('|y', str) > 0 then begin
    font.Style := [fsBold];
    Delete(str, 1, 2);
  end;
  if pos('|y', str) > 0 then begin
    font.Style := font.Style + [fsItalic];
    Delete(str, 1, 2);
  end;
  if pos('|y', str) > 0 then begin
    font.Style := font.Style + [fsUnderline];
    Delete(str, 1, 2);
  end;
  if pos('|y', str) > 0 then begin
    font.Style := font.Style + [fsStrikeout];
    Delete(str, 1, 2);
  end;
end;

function tok(sep: string; var s: string): string;
var
  c, t: string;
begin
  if s = '' then
  begin
    Result := '';
    Exit;
  end;

  c := Copy(s, 1, 1);
  while pos(c, sep) > 0 do begin
    Delete(s, 1, 1);
    c := Copy(s, 1, 1);
  end;

  t := '';
  while (not Pos(c, sep) > 0) and (s <> '') do begin
    t := t + c;
    Delete(s, 1, 1);
    c := Copy(s, 1, 1);
  end;
  Result := t;
end;

Это только пример, но вам может потребоваться адаптация в соответствии с вашими конкретными требованиями.

В статье рассмотрено решение задачи сохранения параметров шрифта в INI-файле, представленное в виде функций FontToStr и StrToFont для кодирования и декодирования строкового представления атрибутов TFont.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:06:27/0.0038549900054932/0