PDA

Ver la Versión Completa : Colorear las celdas de un TStringGrid


jhonalone
18-02-2016, 19:13:54
Hola, buenas tardes a todos.
Tengo hecho en Delphi un sencillo juego de sudoku para mis amigos. Me gustaría adaptarlo para Android, pero como no tengo ninguna experiencia con este tema, entiendo que voy a tener que consultaros a los expertos más de una cuestión. El primer problema que me ha surgido es que al diseñar el tablero, (para lo que estoy utilizando un TGridPanelLayout), no sé como dar colores distintos a las celdas de la rejilla.
No sé si será posible, o tendría que utilizar otro componente.
Una vez más apelo a vuestra buena disposición y a los expertos foreros para recibir vuestros consejos.

Gracias, de antemano, porque sé que os estoy "robando" una parte de vuestro valioso tiempo.

P.D. Naturalmente, no pretendo que me deis las funciones hechas, (sería demasiado abuso por mi parte), me conformo con que me orientéis la forma de llevarlo a cabo.

Un saludo.

jhonalone
18-02-2016, 20:26:09
Creo que no puedo editar con un TGridPanelLayout.
Lo he cambiado por un TStringGrid de siempre y no sé si voy a tener el mismo problema.
Sigo investigando...

AgustinOrtu
18-02-2016, 20:43:02
Dentro del grid panel, en cada celda, que control estas poniendo? Lo ideal es que pongas algun control que tenga propiedades de color

AgustinOrtu
18-02-2016, 20:44:53
Si usas un string grid deberías interceptar el evento OnDraw para cambiar el color

ecfisa
18-02-2016, 21:22:05
Hola jhonalone.

Por favor, cuando hagas dos consultas distintas, crea un hilo para cada una de ellas. Nueva consulta = Nuevo hilo

Saludos y gracias por tu colaboración :)

Casimiro Notevi
18-02-2016, 21:27:29
Hola jhonalone.
Por favor, cuando hagas dos consultas distintas, crea un hilo para cada una de ellas. Nueva consulta = Nuevo hilo
Saludos y gracias por tu colaboración :)

Error mio, iba a moverlas de foros y he acabado uniéndolas :confused:
EDITO: Ya están separadas.

ecfisa
18-02-2016, 21:41:14
Error mio, iba a moverlas de foros y he acabado uniéndolas :confused:
EDITO: Ya están separadas.
Una moderada colisión :D, mis disculpas a jhonalone :)

jhonalone
19-02-2016, 21:19:52
Gracias Agustín.
En Windows coloreaba las celdas al seleccionarlas de la siguiente manera:

procedure TPrinci.grdTableroDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var Tablero:TTablero;
begin // beep;
StringGridToTablero(Tablero);
ColTableroActual:=ACol;
RowTableroActual:=ARow;
with grdTablero, grdTablero.Canvas do
begin
if CeldaSeleccionada {and ((FilAnt=FilAct) or (ColAnt=ColAct)) }then
begin
Brush.Color:= clYellow; // FilAnt:=ARow; ColAnt:=ACol;
CeldaSeleccionada := False;
end
else
if Odd((ACol div 3) + (ARow div 3)) then
Brush.Color:= clAqua
else
Brush.Color:= clWhite;

if TableroGenerado[ACol, ARow] > 0 then
Font.Color:= clRed
else begin
if (TableroAyudado[ACol, ARow]=1) and
(Tablero[ACol, ARow]=TableroResuelto[ACol,ARow]) //Es celda ayudada
then Font.Color:= clBlue
else Font.Color:= clBlack;
end;
//beep; sleep(3000);
ExtTextOut(Handle,
(Rect.Left + Rect.Right - TextWidth(Cells[ACol,ARow])) div 2,
(Rect.Top + Rect.Bottom - TextHeight(Cells[ACol,ARow])) div 2,
ETO_CLIPPED or ETO_OPAQUE , @Rect, PChar(Cells[ACol,ARow]),
Length(Cells[ACol,ARow]),nil);
end; // With
LMDStatusBar1.Panels[0].Text:='Columna = '+IntToStr(GrdTablero.Col+1)+' / Fila = '+IntToStr(GrdTablero.Row+1);
end;


Pero ahora en DX no sé como voy a hacerlo, pues unas propiedades del TStgringGrid las han cambiado de nombre, otras las han eliminado y hay otras nuevas.
Seguiré peleando.
Gracias por todo.
Saludos.

jhonalone
01-03-2016, 14:13:04
Hola a todos.

Después de mucho probar y leer en la ayuda y ver las posibles funciones y procedimientos en muchos componentes de Delphi y, sobre todo, de dedicarle mucho tiempo esta semana, por fin he conseguido mi propósito.

Para ello, he utilizado el mismo evento que usaba en Windows, como decía Agustín, y como no podía ser de otro modo, es decir: el evento OnDraw del TStringGrid.

Por si le sirve a algún novato como yo, copio el código del evento a continuación, modificado desde el original de VCL (Windows), que ya he publicado más arriba, para FireMonkey. De forma que si alguien se encuentra con el mismo problema no tenga que perder tanto tiempo como yo.



procedure TPrinci.grdTableroDrawColumnCell(Sender: TObject;
const Canvas: TCanvas; const Column: TColumn; const [Ref] Bounds: TRectF;
const Row: Integer; const [Ref] Value: TValue; const State: TGridDrawStates);

var Tablero : TTablero;
R : TRectF;
S : String;
begin Cuantos:=Cuantos+1;
R:=Bounds;
StringGridToTablero(Tablero);
ColTableroActual:=Column.Index;
RowTableroActual:=Row;

with grdTablero, grdTablero.Canvas do
begin
R.Width := Bounds.Width - 1;
R.Height :=Bounds.Height-2;
R.Left := R.Left + 2;
R.Top := R.Top + 1;

if (ColAct = Column.Index) and (FilAct=Row) then
begin
ClearRect(R, claGreenyellow);
end
else begin
if Odd((Column.Index div 3) + (Row div 3))
then ClearRect(R, claLightgrey)
else ClearRect(R, claLavender);
end;

if TableroGenerado[Column.Index, Row] > 0 then
TextSettings.FontColor:=claRed
else begin
if (TableroAyudado[Column.Index, Row]=1) and
(Tablero[Column.Index, Row]=TableroResuelto[Column.Index,Row]) //Es celda ayudada
then TextSettings.FontColor:= claBlue
else TextSettings.FontColor:= claBlack;
end;
Canvas.Fill.Color:=TextSettings.FontColor;
Canvas.Font.SetSettings('Arial',22,grdTablero.TextSettings.Font.Style);
S := grdTablero.Cells[Column.Index, Row];
Canvas.FillText(R,S,False,1,[TFillTextFlag.ftRightToLeft],TTextAlign.taCenter, TTextAlign.taCenter);
end; // With
end;



Saludos a todos.