Como gravar TFontStyles em um arquivo

07/12/2005

0

Boa tarde.

Será que alguem sabe como gravar [dsBold, dsItalic, dsUnderline] em um DB?

Obrigado
Adilson


Pecchiai

Pecchiai

Responder

Posts

14/12/2005

Vitor Rubio

E o resto do código? Onde exatamente deu erro?

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é +


Responder

14/12/2005

Saint

entao, em C eu ja usei mto ponteiro, mas em delphi nunca tive a real necessidade e justamente por querer me aprofundar que eu queria ver como foram declaradas as variaveis, o erro da justamente nessa linha:
showmessage(Format(´¬d´, [P^]));

e eu declarei dessa forma:
var
Fonte:TFontStyles;
p:^TFontStyles;


Responder

15/12/2005

Pecchiai

entao, em C eu ja usei mto ponteiro, mas em delphi nunca tive a real necessidade e justamente por querer me aprofundar que eu queria ver como foram declaradas as variaveis, o erro da justamente nessa linha: showmessage(Format(´¬d´, [P^])); e eu declarei dessa forma: var Fonte:TFontStyles; p:^TFontStyles;


Colega mude a variavel (p:^TFontStyles) para (P : PByte).

Abraço


Responder

15/12/2005

Vitor Rubio

você achará essa código interessante, porem eu não consegui fazer a maracutaia com TfontStyles, mas consegui fazer com TFontStyle:

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 ^^


Responder

15/12/2005

Vitor Rubio

legal é que no esquema do colega Pecchiai dá pra fazer com o fontstyles também, e o valor é simplesmente um integer, que muda conforme os estilos de fontes. Temos os tipos:

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;



Responder

15/12/2005

Xandyr

Essa técnica salva e carrega todas as propriedades do componente, não somente a fonte, vc pd passar isso para um componente blob

StreamSalva.WriteComponent(FontDialog1);

StreamSalva.ReadComponent(FontDialog1);


Responder

15/12/2005

Vitor Rubio

Não sabia que dava pra fazer via stream, como que usa? você poderia dar um exemplo?


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar