Newsgroup: it.comp.lang.delphi
Titolo: Salvataggio e caricamento TFont

In un'applicazione permetto di cambiare i font utilizzati in vari componenti
e poi salvo il tutto in un file ini. 
Al momento salvo l'impostazione di ogni font con una stringa formattata
come:
nome font, dimensione, bold? (boolean), italic? (boolean), colore
nel caricamento faccio invece l'operazione contraria:
leggo la stringa, la scompongo e assegno le varie proprieta'.
C'e' un modo piu' veloce e collaudato che non conosco?
-- 
Lis
Mercatino: 
http://snurl.com/sito_lis
Aiuta la ricerca contro il cancro: 
http://snurl.com/ida_team

C'e' un modo piu' veloce e collaudato che non conosco?
Piu' veloce? Dubito. ;)
Se guardi molti altri programmi, fanno la stessa cosa. 
Ciao
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 Se guardi molti altri programmi, fanno la stessa cosa. 
Bella idea, a volte le cose più ovvie non mi vengon in mente...


 C'e' un modo piu' veloce e collaudato che non conosco?
Ciao Lis
Se é piú veloce del metodo che usi tu non só e nemmeo se é migliore
comunque io faccio cosí :
Function LoadFont(FileName:String):TFont;
var
ts:TStringList;
StrStyle:String;
SetStyle:Set of 'A'..'z';
c:Char;
i:integer;
begin
Result:=TFont.Create;
Ts:=TstringList.Create;
SetStyle:=[];
Ts.LoadFromFile(FileName);
Result.Name:=Ts[0];
Result.Color:=StrToInt(Ts[1]);
Result.Size:=StrToInt(Ts[2]);
StrStyle:=Ts[3];
for i:=1 to Length(StrStyle) do
begin
C:=StrStyle[i];
SetStyle:=SetStyle+[c];
end;
if ('i'in SetStyle ) or ('b' in SetStyle)
or ('u' in SetStyle) or ('s'in SetStyle ) then begin
if 'i'in SetStyle then Result.Style:=Result.Style+[fsItalic];
if 'b'in SetStyle then Result.Style:=Result.Style+[fsBold];
if 'u'in SetStyle then Result.Style:=Result.Style+[fsUnderline];
if 's'in SetStyle then Result.Style:=Result.Style+[fsStrikeOut];
end else Result.Style:=[];
Ts.Free;
end;
--------------------
Procedure SaveFont(GetFont:TFont;FileName:String);
var Ts:TstringList;
StrStyle:String;
begin
Ts:=TstringList.Create;
StrStyle:='';
With GetFont do
begin
  Ts.Add(Name);
  Ts.Add(IntToStr(Color));
  Ts.Add(IntToStr(Size));
  if fsItalic in Style then
    StrStyle:=StrStyle+'i';
  if fsBold in Style then
    StrStyle:=StrStyle+'b';
  if fsUnderline in Style then
    StrStyle:=StrStyle+'u';
  if fsStrikeOut in Style then
    StrStyle:=StrStyle+'s';
 Ts.Add(StrStyle)
Ts.SaveToFile(FileName);
Ts.free;
end;
Credo non ci siano errori ma dai comunque un'occhiata
Ciao
erik

 C'e' un modo piu' veloce e collaudato che non conosco?
Una soluzione arriva dalle librerie JEDI (sono talmente vaste che conoscerle
bene è un'impresa...):
function FontStylesToString(Styles: TFontStyles): string;
begin
  Result := '';
  if fsBold in Styles then
    Result := Result + 'B';
  if fsItalic in Styles then
    Result := Result + 'I';
  if fsUnderline in Styles then
    Result := Result + 'U';
  if fsStrikeOut in Styles then
    Result := Result + 'S';
end;
function StringToFontStyles(const Styles: string): TFontStyles;
begin
  Result := [];
  if Pos('B', UpperCase(Styles)) > 0 then
    Include(Result, fsBold);
  if Pos('I', UpperCase(Styles)) > 0 then
    Include(Result, fsItalic);
  if Pos('U', UpperCase(Styles)) > 0 then
    Include(Result, fsUnderline);
  if Pos('S', UpperCase(Styles)) > 0 then
    Include(Result, fsStrikeOut);
end;
function FontToString(Font: TFont): string;
begin
  with Font do
    Result := Format('%s,%d,%s,%d,%s,%d', [Name, Size,
      FontStylesToString(Style), Ord(Pitch), ColorToString(Color),
      {$IFDEF COMPILER3_UP} Charset {$ELSE} 0 {$ENDIF}]);
end;
type
  THackFont = class(TFont);
procedure StringToFont(const Str: string; Font: TFont);
const
  Delims = [',', ';'];
var
  FontChange: TNotifyEvent;
  Pos: Integer;
  I: Byte;
  S: string;
begin
  FontChange := Font.OnChange;
  Font.OnChange := nil;
  try
    Pos := 1;
    I := 0;
    while Pos <= Length(Str) do
    begin
      Inc(I);
      S := Trim(ExtractSubstr(Str, Pos, Delims));
      case I of
        1:
          Font.Name := S;
        2:
          Font.Size := StrToIntDef(S, Font.Size);
        3:
          Font.Style := StringToFontStyles(S);
        4:
          Font.Pitch := TFontPitch(StrToIntDef(S, Ord(Font.Pitch)));
        5:
          Font.Color := StringToColor(S);
        {$IFDEF COMPILER3_UP}
        6:
          Font.Charset := TFontCharset(StrToIntDef(S, Font.Charset));
        {$ENDIF}
      end;
    end;
  finally
    Font.OnChange := FontChange;
    THackFont(Font).Changed;
  end;
end;
HTH


 ha scritto nel messaggio
news:11pirrhl3z3fv$.dlg@lis.lis.lis...


> C'e' un modo piu' veloce e collaudato che non conosco?
grazie a tutti, visto che già uso le librerie JEDI, penso che userò le loro
comode funzioni ;-)
-- 
Lis
ICQ#: 162857023
Mercatino: 
http://snurl.com/sito_lis
FAQ del NG: 
http://makeashorterlink.com/?I23B16806