Como gravar TFontStyles em um arquivo
07/12/2005
0
Será que alguem sabe como gravar [dsBold, dsItalic, dsUnderline] em um DB?
Obrigado
Adilson
Pecchiai
Posts
14/12/2005
Vitor Rubio
Se você quer armazenar o estilo da fonte, faça como nosso colega Pecchiai.
Já com relação a ponteiros, eles realmente são muito úteis para se fazer ´no dedo´ algumas coisas que as classes e bibliotecas do Delphi fazem por você mas que vc não sabe como são feitas. Dá pra fazer listas encadeadas, pilhas, filas, alocação dinâmica, ponteiros para funções (ou variaveis do tipo função) que vc pode atribuir uma função com a mesma assinatura e executar, arvores binárias entre muuuuuuitas outras aplicações. Eu recomendo você a dar uma olhada em livros de turbo pascal/object pascal para se aprofundar em ponteiros. O uso de ponteiros em qualquer linguagem sempre foi um assunto complexo, e o mau uso deles pode acarretar várias ´zicas´ (não tem outro nome hehe) no seu programa.
Té +
14/12/2005
Saint
showmessage(Format(´¬d´, [P^]));
e eu declarei dessa forma:
var
Fonte:TFontStyles;
p:^TFontStyles;
15/12/2005
Pecchiai
Colega mude a variavel (p:^TFontStyles) para (P : PByte).
Abraço
15/12/2005
Vitor Rubio
qual q eh a diferença?
TfontStyles é um conjunto ou set de TfontStyle, ou seja, tfontstyle pode ser fsbold, e tfontstyles pode ter [fsbold, fsitalic, ...]
Coloque a unit typinfo no seu projeto e veja a ´cricincruma´ que eu fiz:
procedure TForm1.btFonteClick(Sender: TObject); var fonte: TFontStyle; p:^TFontStyle; begin p := @fonte; // atribui a p o endereço de fonte showmessage(Format(´¬d´, [integer(p)])); //mostra em decimal o endereço p showmessage(Format(´¬d´, [Integer(p^)])); //mostra em inteiro o valor de p como tipo enumerado. { OBS.: como fsbold é o primeiro item do tipo enumerado fontstyle, integer(p^) quer dizer a mesma coisa que integer(valor do endereço de p) ou a mesma coisa que integer(fonte), que é 0 visto fsbold ser o primeiro estilo do tipo enumerado. Se fosse o segundo seria 1 (fsitalic) } ShowMessage( GetEnumName(TypeInfo(TFontStyle), Integer(fonte))); //mostra em formato string o estilo da fonte, com getenumname(typeinfo) ShowMessage(Format(´¬s´, [GetEnumName(TypeInfo(TFontStyle),Integer(p^))])); { mostra o valor em formato string da fonte contida no endereço p, com p^ da mesma forma que p é o endereço de fonte e P^ é o valor de fonte } { com relação a gravar estilos de fonte e outros tipos enumerados, eh soh gravar a string resultante das funções acima, fsbold... etc e fazer o processo inverso: } fonte := TFontStyle(GetEnumValue(TypeInfo(TFontStyle),´fsItalic´)); lbFonte.Font.Style := lbFonte.Font.Style + [fonte]; //ou lbFonte.Font.Style := [fonte]; para ficar apenas italico end;
Ah! do jeito que o colega Pecchiai fez também funciona legal, usando um pbyte que na verdade é um ponteiro para byte :wink:
espero ter ajudado ^^
15/12/2005
Vitor Rubio
fsBold, fsItalic, fsUnderline, fsStrikeOut. Seus valores são, respectivamente fsBold=0, fsItalic=1, fsUnderline=2, fsStrikeOut=3
O valor numérico inteiro do TfontStyles é formado pela soma de cada componente do set multiplicado por 2 elevado ao seu numero de ordem, dessa forma os numeros nunca se repetem, e os valores tambem não. por exemplo
se o Tfontstyle for [fsbold], então o número é 2^0 (2 elevado a zero) = 1
se for [fsbold, fsitalic], então = 2^0 + 2^1 = 1+2 = 3
se for apenas [fsUnderline] então é 2^2 = 4 e se tiver todos os estilos então é:
[fsBold, fsItalic, fsUnderline, fsStrikeOut] = 2^0+2^1+2^2+2^3 = 1+2+4+8 = 15 e assim por diante:
veja o exemplo abaixo:
procedure TForm1.Button1Click(Sender: TObject); var pb: PByte; fontes: TFontStyles; begin fontes := fontes + [fsItalic, fsUnderline, fsStrikeOut]; pb := @fontes; showmessage(Format(´¬d´, [Pb^])); //isso vale showmessage(Format(´¬d´, [byte(fontes)])); //isso vale e eh mais facil //showmessage(Format(´¬d´, [integer(fontes)])); //isso não vale lbFonte.Font.Style := TFontStyles(pb^); //poderia ser: lbFonte.Font.Style := TFontStyles(fontes); { OBS: se pb fosse TFontStyles^tambem daria certo na atribuição de pb^, mas precisaria trocar o showmessage(Format(´¬d´, [Pb^])) por showmessage(Format(´¬d´, byte([Pb^]))); ou seja, o TFontStyles não aceita typecasting para integer e vice versa, mas para byte ele aceita. Isto se deve ao tamanho dessas estruturas, que são compativeis. } end;
15/12/2005
Xandyr
StreamSalva.WriteComponent(FontDialog1);
StreamSalva.ReadComponent(FontDialog1);
15/12/2005
Vitor Rubio
Clique aqui para fazer login e interagir na Comunidade :)