Array
(
)

Como gravar TFontStyles em um arquivo

Pecchiai
   - 07 dez 2005

Boa tarde.

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

Obrigado
Adilson


Edilcimar
   - 07 dez 2005

use um richedit e depois coloque em um campo blob


Pecchiai
   - 07 dez 2005


Citação:
use um richedit e depois coloque em um campo blob


Edilcimar estou usando FontDialog do VCL SKIN.

Grato
Adilson


Edilcimar
   - 07 dez 2005

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


Pecchiai
   - 07 dez 2005


Citação:
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.


Edilcimar
   - 07 dez 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


Pecchiai
   - 07 dez 2005


Citação:
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


Edilcimar
   - 07 dez 2005

poder pode, nada impede


Eniorm
   - 07 dez 2005


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


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,


Pecchiai
   - 07 dez 2005

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


obrigado pela atenção
Adilson


Pecchiai
   - 08 dez 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


Adriano Santos
   - 08 dez 2005


Citação:
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


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


Pecchiai
   - 08 dez 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.


Vitor^_^
   - 09 dez 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.


Pecchiai
   - 12 dez 2005


Citação:
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.


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


Saint
   - 14 dez 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


Vitor^_^
   - 14 dez 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é +


Saint
   - 14 dez 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;


Pecchiai
   - 15 dez 2005


Citação:
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


Vitor^_^
   - 15 dez 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:

#Código

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


Vitor^_^
   - 15 dez 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:


#Código

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;