PDA

Ver la Versión Completa : Modificar y guardar las propiedades Font


Carmelo Cash
07-10-2004, 16:29:00
Hola amigos:

Los molesto por lo siguiente:

En mi formulario estoy utilizando un componente TFontDialog, con el cual permito que el operador modifique las propiedades de algunos componente,

Ej. Edit1

Bien: el caso es que mediante la instrucción

Edit1.Font:=FontDialog1.Font;

El tema estaría resuelto, pero necesito guardar las propiedes.

Se me ocurrió hacer una pequeña tabla con los datos Size, color, Name, etc.
Pero no sé como leer los estilos fsBold, fsItalic, fsUnderline.

Probé con Edit1.Font.Style.fsItalic, pero esto me da un error.

Entonces tengo 2 preguntas

1- Cómo leo los estilos?.

2- Saben de alguna forma en que pueda guardar directamente Edit1.Font sin tener que colocar un campo para cada propiedad del font?

Desde ya muchas gracias por su tiempo.

Carmelo Cash
07-10-2004, 19:56:22
Ya estoy un poco más encaminado

Por ejemplo para asignarle la propiedad Negrita al texto hago:
Edit1.Font.Style := Edit1.Font.Style+[fsBold]

Para sacarla hago:
Edit1.Font.Style := Edit1.Font.Style-[fsBold]

Para preguntar por un estilo hago

If Edit1.Font.Style=[fsBold] Then ...

El problema es que si el estilo tiene asignado más de una propiedad Ej:
(FsBold + FsItalic)
la pregunta anterior da como resultado falso, entonces tengo que preguntar:

If Edit1.font.Style=[fsBold] Then ...
If Edit1.font.Style=[ FsBold, fsItalic ] Then ...

y todas las combinaciones. Puedo hacerlo, no son muchas, pero es muy desprolijo.

pregunta:

¿como puedo preguntar?

Si [FsBold] está incluido en la lista de Edit1.Font.Style Entonces...

Se entiende?.

Gracias.

keyboy
07-10-2004, 20:50:34
¿como puedo preguntar?

Si [FsBold] está incluido en la lista de Edit1.Font.Style Entonces...

if fsBold in Edit1.Font.Style then


Si quieres preguntar si Style contiene, por ejemplo, fsBold y fsItalic pones:


if [fsBold, fsItalic] <= Edit1.Font.Style then


También, si quieres ver si, por ejemplo, si ni fsItalic ni fsUnderline están en Style pones:


if [fsItalic, fsUnderline]*Edit1.Font.Style = [] then


Te recomiendo repases en la ayuda de Delphi el tipo de datos set para que veas los operadores que pueden usarse con variables de este tipo.

Por otra parte fíjate que puedes guardar y recuperar una propiedad como ésta en una variable de tipo Byte:


ByteStyle := Byte(Edit1.Font.Style);
Edit1.Font.Style := TFontStyles(ByteStyle);


Bye

yusnerqui
08-10-2004, 13:52:32
Hola

2- Saben de alguna forma en que pueda guardar directamente Edit1.Font sin tener que colocar un campo para cada propiedad del font?

Si

Function FontToInteger (FFont : Tfont) : Integer;
begin
Result := Integer(FFont);
end;

Function IntToFont (FInt : Integer) : TFont;
begin
Result := TFont(FInt);
end;


Luego solo te falta guardar en un campo de tu tabla y restablecerlo cuando gustes :p

Espero te sirva

Un saludo

Carmelo Cash
08-10-2004, 22:18:58
Muchisimas gracias.
:cool: :cool: :cool: :cool:

keyboy
09-10-2004, 02:13:22
Si

:confused: ¡No!

Una variable de tipo TFont (o de cualquier tipo que sea una clase) no es más que un puntero, de manera que FontToInteger sólo devuelve la dirección en memoria del objeto FFont, que es un valor efímero que pierde sentido en cuanto el objeto se destruye o termina la aplicación.

Bye

yusnerqui
12-10-2004, 14:34:38
:( Ofresco mis más sinceras disculpas por la respuesta anterior, me dejé engañar por algunas pruebas que hice y no profundicé lo suficiente en el tema.

De todos modos puedes construirte un record y guardar en el las características de tu Fuente, luego construir un cadena combencional con estas características y guardarla en la BD, a continuación te doy algunas ideas.


TMyFont = Record
Nombre : String;
Size : Byte;
style : Array[1..3] of char;
Color : integer;
end;
//Función para llenar el record con las propiedades del Font
Function FontToMyFont(FFont:TFont):TMyFont;
begin
Result.style := '000';
Result.Nombre :=FFont.Name;
Result.Size := FFont.Size;
if fsBold in FFont.Style then
Result.style[1]:='1';
if fsItalic in FFont.Style then
Result.style[2]:='1';
if fsUnderline in FFont.Style then
Result.style[3]:='1';
Result.Color := FFont.Color;
end;
//Procedimiento para darle las propiedades del record a el Font
Procedure MyFontToFont (Auxi : TFont;MyFont : TMyFont);
begin
Auxi.Name := MyFont.Nombre;
Auxi.Size := MyFont.Size;
Auxi.Color := MyFont.Color;
if MyFont.style[1]='1' then
Auxi.Style := Auxi.Style+[fsBold]
else
Auxi.Style := Auxi.Style-[fsBold];
if MyFont.style[2]='1' then
Auxi.Style := Auxi.Style+[fsItalic]
else
Auxi.Style := Auxi.Style-[fsItalic];
if MyFont.style[3]='1' then
Auxi.Style := Auxi.Style+[fsUnderline]
else
Auxi.Style := Auxi.Style-[fsUnderline];
end;

//Función para combertir el record a una cadena para guardarla en la base de datos.

Function MyFonttoStr (MyFont:TMyFont): String;
var
Auxi : String;
begin
with MyFont do
Auxi := style+MyFont.Nombre+'@'+inttostr(Size)+'@'+inttostr(Color) ;
Result:= Auxi;
end;

//Función para combertir de esta cadena a el record nuevamente.
Function StrToMyFont (Str:String):TMyFont;
var
Auxi : TMyFont;
i : Byte;
begin
for i := 1 to 3 do
Auxi.style[i] := str[i];
Delete(Str,1,3);
i:= pos('@',Str);
Auxi.Nombre := Copy(Str,1,i-1);
Delete(Str,1,i);
i:= pos('@',Str);
Auxi.Size := StrToInt(Copy(Str,1,i-1));
Delete(Str,1,i);
Auxi.Color := StrToInt(Str);
Result := Auxi;
end;



Bueno espero que ahora si te ayude este código.

Un saludo

Mick
12-10-2004, 18:21:00
Una forma mas compacta:

http://www.scalabium.com/faq/dct0039.htm

Saludos