Мое решение: (для сохранения всей иннформации об отдельном шрифте)
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);
beginif 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) dobeginif c = Copy(s, iTmp, 1) thenbegin
Result := True;
Exit;
end;
end;
end;
var
c, t: string;
beginif s = '' thenbegin
Result := s;
Exit;
end;
c := Copy(s, 1, 1);
while isoneof(c, sep) dobegin
s := Copy(s, 2, Length(s) - 1);
c := Copy(s, 1, 1);
end;
t := '';
while (not isoneof(c, sep)) and (s <> '') dobegin
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.
Вот несколько предложений:
Вместо конкатенации строк с помощью +, используйте функцию Format для создания итоговой строки. Это будет более эффективно.
При парсинге строки в процедуре StrToFont вы можете использовать цикл для извлечения каждого значения вместо вызова tok несколько раз.
Вам может быть полезно рассмотреть использование более robust метода разделения значений в строке, например, с помощью точки с запятой (;) или запятой (,).
Вот пример модификации вашего кода:
functionFontToStr(font:TFont):string;beginResult:=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]);iffsBoldinfont.StylethenResult:=Result+'|y';iffsItalicinfont.StylethenResult:=Result+'|y';iffsUnderlineinfont.StylethenResult:=Result+'|y';iffsStrikeoutinfont.StylethenResult:=Result+'|y';end;procedureStrToFont(str:string;varfont:TFont);vars,sep,val:string;beginsep:='|';ifstr=''thenExit;// Parse each valuefori:=1toLength(sep)-1dobeginval:='';whilepos(sep,str)>0dobeginval:=tok(sep,str);Break;end;caseuppercase(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 stringDelete(str,1,Length(val)+Length(sep));end;// Parse style valuesifpos('|y',str)>0thenbeginfont.Style:=[fsBold];Delete(str,1,2);end;ifpos('|y',str)>0thenbeginfont.Style:=font.Style+[fsItalic];Delete(str,1,2);end;ifpos('|y',str)>0thenbeginfont.Style:=font.Style+[fsUnderline];Delete(str,1,2);end;ifpos('|y',str)>0thenbeginfont.Style:=font.Style+[fsStrikeout];Delete(str,1,2);end;end;functiontok(sep:string;vars:string):string;varc,t:string;beginifs=''thenbeginResult:='';Exit;end;c:=Copy(s,1,1);whilepos(c,sep)>0dobeginDelete(s,1,1);c:=Copy(s,1,1);end;t:='';while(notPos(c,sep)>0)and(s<>'')dobegint:=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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.