Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   forma de cambiar el color de una celda (https://www.clubdelphi.com/foros/showthread.php?t=46397)

anubis 31-07-2007 03:20:31

forma de cambiar el color de una celda
 
Buenas, revisando para poder cambiar el color de una celda de un stringgrid(aunque uso xstringgrid), desde codigo y la que yo necesite, he llegado a esto:
Código Delphi [-]
procedure TForm1.calendarioDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 calendario.canvas.brush.color := clGreen;

calendario.Canvas.FillRect(rect);
calendario.canvas.TextOut(Rect.Left,Rect.Top,calendario.Cells[ACol,ARow]);

end;
el problema es que me los cambia a todos, tambien he llegado a poner
Código Delphi [-]
calendario.col:=5
calendario.row:=5;
calendario.font.Style:=[fsbold];
 calendario.Canvas.Brush.Color:= clRed;
se que me hace falta poner calendario.canvas.fillrect(rect), pero la rect no se que parametros poner.

Tampoco puedo poner la letra en bold.

Alguna idea de poder manipular los colores de cada celda a antojo?.

ya estuve revisando los post relacionados pero no dan respuesta a lo que busco.

gracias

roman 31-07-2007 05:34:01

Como lo tienes vas por buen camino. Lo que falta es poner la condición para que se restrinja a la celda que quieres, algo como:

Código Delphi [-]
procedure TForm1.calendarioDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ACol = 5) and (ARow = 5) then
    calendario.canvas.brush.color := clGreen;

  calendario.Canvas.FillRect(rect);
  calendario.canvas.TextOut(Rect.Left,Rect.Top,calendario.Cells[ACol,ARow]);
end;

// Saludos

anubis 31-07-2007 07:10:57

Gracias roman, asi funciona pero solo para acol=5 y arow=5 pero dentro de esa procedure, hay forma enviarle esos datos desde fuera de la procedure, o desde otra procedure, por ejemplo formshow?

gracias de nuevo

roman 31-07-2007 07:17:42

Lo que tendrías que hacer es almacenar en un par de variables externas al evento, los valores de la celda que debas pintar, por ejemplo:

Código Delphi [-]
type
  TForm1 = class(TForm)
    ...
  private
    Columna: Integer;
    Renglon: Integer;
  end;

Y entonces en el evento DrawCell dejas la condición así:

Código Delphi [-]
if (ACol = Columna) and (ARow = Renglon) then
   calendario.canvas.brush.color := clGreen;

De esta manera ya puedes pintar la celda que quieras simplemente asignando valores a esas variables en el momento que quieras.

// Saludos

anubis 31-07-2007 07:58:54

la cosa funciona, perdon que insista, pero si quiero pintar varias celdas como haria, porque no se como llamar al procedimiento.
Código Delphi [-]
columna:=0;
 renglon:=5;
calendario.repaint;
 columna:=4;
 renglon:=9;

Delphius 31-07-2007 08:05:34

Hola anubis,

Si vas a tener que pintar una cantidad arbitrarias de celdas quizás lo que puedas hacer es declarar un conjunto y hacer comparaciones al estilo:

Código Delphi [-]
if (aRow IN tuConjuntoFila) AND (aCol IN tuConjuntoColumna)
   then

Puede ser una alternativa...
El código no es "simple" como lo expuse... pero creo que la idea se entiende.

Saludos,

anubis 31-07-2007 08:33:18

Se agradece, lo unico que no se que valores van a tomar, irian saliendo y se van pintando, tambien si se pulsa un boton se pintaria o se borraria el pintado.

parece complicado llamar al procedimiento calendario.drawcell desde otro procedimiento y pasarle los valores columna y renglon tal y como puso roman?

gracias de nuevo

edito: tambien he probado a poner dos botones para probar, en cada uno de ellos le pongo diferentes valores pero cuando redibuja uno el otro se vuelve otra vez en blanco y viceversa. He probado tambien a crear una array bidimensional donde almaceno los colores con tcolor y generar en la procedure drawcell varios for, pero tampoco, porque parece redibuja todo al color original.

complicado parece amigo sancho

Chris 31-07-2007 16:34:58

Despeja tus ideas
 
Según leo, lo que quieres es pintar un calendario o algo por el estilo, bien, lo primero que debes hacer es determinar en que reglón y fila irá un determinado día, luego con está información puesdes escribir las condiciones.

Para hacer esto, te recomiendo que escribas una funciòn por separado la cual te determine las coordenadas de los días en la grilla, por ejemplo:

Código Delphi [-]
Function Dia_enCoordenada(elDia, Reglon, fila : Integer):Boolean;
Begin
  {Haces las operaciones o calculos necesarios}
end;

Luego en el evento OnDraw puedes escribir algo como esto:

Código Delphi [-]
If Dia_enCoordenada(miDia,aRow,aColumn) Then
   Begin
    Canvas.Brush.Color := clGreen;
    Canvas.Font.Style := [fsBold] //con esta línea haces el texto en negría
  end;
...

espero que me halla dado a entender y que mi sugerencia te sirva.

anubis 31-07-2007 19:08:02

Se agradece pero cuando se pinta una celda las otras siguen en blanco, al final lo que he empezado a hacer quitar el stringgrid y hacerlo con botones que pueden cambiar de color (xibutton) y generar un array bidimensional [1..37,1..12], a ver como puedo colocar los numeros de los dias. Si al final consigo algo bastante aceptable, si me echais una mano, intentare publicarlo por si le sirviera a alguien. Voy a investigar el jvyeargrid a ver como esta hecho.

gracias


La franja horaria es GMT +2. Ahora son las 20:00:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi