Como gravar TFontStyles em um arquivo

Delphi

07/12/2005

Boa tarde.

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

Obrigado
Adilson


Pecchiai

Pecchiai

Curtidas 0

Respostas

Edilcimar

Edilcimar

07/12/2005

use um richedit e depois coloque em um campo blob


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

use um richedit e depois coloque em um campo blob


Edilcimar estou usando FontDialog do VCL SKIN.

Grato
Adilson


GOSTEI 0
Edilcimar

Edilcimar

07/12/2005

não entendi o que vc quer salvar então! não é um texto formatado?


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

não entendi o que vc quer salvar então! não é um texto formatado?


Não, quero salvar as configurações do fontdialog para usar mais tarde.

nome da fonte
tamanho
cor e
estilo

não estou conseguindo salvar o estilo.


GOSTEI 0
Edilcimar

Edilcimar

07/12/2005

ok então pegue um bd e crie os campos nomedafonte, tamanhodafonte, sublinhado, italico e negrito, e grave as configurações tipo
nomedafonte -> arial
tamanhodafonte -> 10
sublinhado -> false
italico -> true
negrito -> false


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

ok então pegue um bd e crie os campos nomedafonte, tamanhodafonte, sublinhado, italico e negrito, e grave as configurações tipo nomedafonte -> arial tamanhodafonte -> 10 sublinhado -> false italico -> true negrito -> false


Fiz isso, mas o problema é que o codigo ficou confuso com muitas condições.

tipo
so negrito
negrito e italico
so italico
negrito e sublinhado
e assim por diante.

sera que não tem uma maneira de criar um campo e gravar o estilo escolhico no campo: exemplo = [fsBold, fsItalic]

agradeço a atenção


GOSTEI 0
Edilcimar

Edilcimar

07/12/2005

poder pode, nada impede


GOSTEI 0
Eniorm

Eniorm

07/12/2005

[quote:399e5f9b79=´Adilson Pecchiai´]sera que não tem uma maneira de criar um campo e gravar o estilo escolhico no campo: exemplo = [fsBold, fsItalic]
[/quote:399e5f9b79]

o que o camagada quer é gravar o valor da propriedade, pois se tentar gravar como texto fica phoda pra ele passar o valor que esta do db para o componente... tipo

Font.Style := [Query.FieldByName(´...´).As???];

correto?

seria o mesmo que gravar no db o nome de um procedure ou function, e depois tentar executar essa procedure/function baseado no texto com o nome que foi gravado no db....

abraço,


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

Bom Enio, isso quer dizer que vou ter que ficar com esse codigo confuso mesmo?


obrigado pela atenção
Adilson


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

Oi pessoal.

Consegui resolver meu problema usando ponteiro.
E passo o exemplo para quem possa interessar.
É so transformar o Style em inteiro.

Fonte := FontDialog.Font.Style;
P := @Fonte;
showmessage(Format(´¬d´, [P^]));

Obrigado pela ajuda

Adilson


GOSTEI 0
Adriano Santos

Adriano Santos

07/12/2005

[quote:35c80a7532=´Adilson Pecchiai´]Oi pessoal.

Consegui resolver meu problema usando ponteiro.
E passo o exemplo para quem possa interessar.
É so transformar o Style em inteiro.

Fonte := FontDialog.Font.Style;
P := @Fonte;
showmessage(Format(´¬d´, [P^]));

Obrigado pela ajuda

Adilson[/quote:35c80a7532]

Adilson, só uma dúvida que ficou:
Você está gravando em Inteiro no banco? Funcionou blz entao?


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

Adilson, só uma dúvida que ficou:
Você está gravando em Inteiro no banco? Funcionou blz entao?


é isso ai, grava em inteiro, depois é so ler e transformar novamente.


GOSTEI 0
Vitor Rubio

Vitor Rubio

07/12/2005

e numa outra instância do programa, ou depois que desliga a máquina etc.. continua funcionando? Eu pensava que esses numeros de ponteiros mudavam a cada execução do programa.


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

[quote:2aa5c314ab=´vitor^_^´]e numa outra instância do programa, ou depois que desliga a máquina etc.. continua funcionando? Eu pensava que esses numeros de ponteiros mudavam a cada execução do programa.[/quote:2aa5c314ab]

Vitor eu estou pegando o tipo ou estilo escolhido ex: negrito e italico, e guardo em uma tabela, para configurar o cabeçalho de um relatório que estou fazendo.

Abraço
Adilson


GOSTEI 0
Saint

Saint

07/12/2005

po, eu nunca trabalhei com ponteiros no delphi e achei interessante o topico mas quando fui tentar refazer aqui nao consegui..

as variaveis criadas no seu caso foram essas:

var
Fonte:TFontStyles;
P:^TFontStyles;

???

falow, abracos


GOSTEI 0
Vitor Rubio

Vitor Rubio

07/12/2005

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


GOSTEI 0
Saint

Saint

07/12/2005

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;


GOSTEI 0
Pecchiai

Pecchiai

07/12/2005

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


GOSTEI 0
Vitor Rubio

Vitor Rubio

07/12/2005

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


GOSTEI 0
Vitor Rubio

Vitor Rubio

07/12/2005

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;



GOSTEI 0
Xandyr

Xandyr

07/12/2005

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);


GOSTEI 0
Vitor Rubio

Vitor Rubio

07/12/2005

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


GOSTEI 0
POSTAR