PDA

Ver la Versión Completa : Paleta de colores hexadecimal


dicatek
22-06-2006, 15:19:50
Mi duda es como podria crear una aplicación para que los usuarios puedan seleccionar un color entre una gran variedad (paleta de color) y ésta, quede almacenada en un edit para poder manejar el valor mas tarde?

Gracias.

seoane
22-06-2006, 15:49:15
Puedes usar el componete TColorDialog que se encuentra en la paleta de componentes "Dialogs".

Aqui un ejemplo creandolo sobre la marcha

var
StrColor: string;
begin
with TColorDialog.Create(self) do
try
if Execute then
begin
StrColor:= IntToHex(Color,6);
Edit1.Text:= StrColor;
end;
finally
Free;
end;
end;


Para volverlo a utilizar

var
MiColor: TColor;
begin
MiColor:= StrToIntDef('$'+Edit1.Text,0);
end;


Podemos darle otra vuelta de tuerca, si queremos que sea compatible con los colores utilizados en html, tenemos que intercambiar la posicion del color rojo con la del azul.

Algo asi:

function ColorToStr(Color: TColor): string;
begin
Result:= IntToHex(Color,6);
Result:= Copy(Result,5,2) + Copy(Result,3,2) + Copy(Result,1,2);
end;

function StrToColor(Color: string): TColor;
begin
Color:= Copy(Color,5,2) + Copy(Color,3,2) + Copy(Color,1,2);
Result:= StrToIntDef('$'+Color,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
StrColor: string;
begin
with TColorDialog.Create(self) do
try
if Execute then
begin
StrColor:= ColorToStr(Color);
Edit1.Text:= StrColor;
end;
finally
Free;
end;
end;

dicatek
22-06-2006, 19:53:49
Muchas gracias seoane! Al final opté por la primera opción, la segunda se me escapaba de mis conocimientos...jejeje. Una pregunta seoane, todos estos codigos que me pones...los tienes almacenados al ordenador o los sacas sobre la marcha? En todo caso, no podrian ponerse en la sección de trucos para posteriores búsquedas de la gente?

Así evitarias tener que estar constantemente haciendólo y el foro serviria para nuevos temas.

Solo fue una idea, de todas formas muchas gracias una vez más.

dec
22-06-2006, 21:36:31
Hola,


En todo caso, no podrian ponerse en la sección de trucos para posteriores búsquedas de la gente?

No seré yo el que diga que no se ponga en el apartado de trucos (http://www.clubdelphi.com/trucos/) lo que Seoane considere oportuno del código que ha expuesto anteriormente, al contrario, tal vez fuera bien. Empero, lo único que quiero decir es que los Foros cuentan con su propio buscador (http://www.clubdelphi.com/foros/search.php), es decir, que este Hilo podrá localizarse posteriormente haciendo uso del mismo. :)

dicatek
29-06-2006, 23:18:48
Solucionado

dicatek
13-07-2006, 00:05:37
Ahí va el ultimo problema que me he encontrado,

ahora he echo la siguiente opción para que al mismo tiempo que se escoge un color, este quede mostrado en una TLabel con el siguiente código:

procedure TfrmPrincipal.Image4Click(Sender: TObject);
var
dlg: TColorDialog;
begin
with TColorDialog.Create(self) do
try
if Execute then
begin
StrColor:= ColorToStr(Color);
EdColormenu.Text:= StrColor;
MiColor:= StrToIntDef('$'+edColormenu.Text,0);
Label1.Font.Color := MiColor;
end;
finally
Free;
end;

Lo que me sucede es que el color que me muestra, no es el que hemos escogido.
He estado probando y creo que sucede porque Delphi para escoger colores usa el otro sentido y por eso no me lo escoge bien.

Como podria hacer para solucionar ese problema?

Gracias!

seoane
13-07-2006, 00:21:41
En tu código esta usando la función ColorToStr, supongo que es la misma que he colocado en este mismo hilo, si no es así corrígeme. Como apreciaras la función intercambia los valores de rojo y azul para ajustarse al estándar, así que para volver a obtener el color original no puedes usar directamente IntToStrDef sino que debes usar la función StrToColor que vuelve a colocar el rojo y el azul en su sitio. Aprovecho para hacer unos retoques a la función:


function StrToColor(Color: string): TColor;
begin
while length(Color) < 6 do
Color:= '0' + Color;
Color:= Copy(Color,5,2) + Copy(Color,3,2) + Copy(Color,1,2);
Result:= StrToIntDef('$'+Color,0);
end;



Quedando el codigo de la siguiente manera:

with TColorDialog.Create(self) do
try
if Execute then
begin
StrColor:= ColorToStr(Color);
EdColormenu.Text:= StrColor;
MiColor:= StrToColor(edColormenu.Text);
Label1.Font.Color := MiColor;
end;
finally
Free;
end;

dicatek
13-07-2006, 21:17:37
Ok Guay! Creo que ya está solucionado.

Una cosa , si no es pedir mucho...ya que casi me he limitado a ir siguiendo tus conocimientos...(algunas cosas sí las entendido) estos ultimos retoques que dices haber echo. En realidad que es, y para que lo has retocado?

Una vez mas...gracias!

seoane
13-07-2006, 21:27:32
En realidad que es, y para que lo has retocado?


Es solo para asegurarnos de que la cadena de texto tiene al menos 6 caracteres, rellenando con ceros a la izquierda si es necesario. Piensa que si un usuario quiere introducir manualmente el valor de un color, por ejemplo el azul 0000FF, puede caer en la tentación de no escribir los ceros pensando, erróneamente, que no tienen valor al encontrarse a la izquierda. Solo es por eso, si estamos seguros de que siempre se van a escribir las 6 cifras del color entonces podemos dejarlo como antes.