Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Colorear las celdas de un TStringGrid (https://www.clubdelphi.com/foros/showthread.php?t=89856)

jhonalone 18-02-2016 18:13:54

Colorear las celdas de un TStringGrid
 
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 19: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 19: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 19:44:53

Si usas un string grid deberías interceptar el evento OnDraw para cambiar el color

ecfisa 18-02-2016 20: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 20:27:29

Cita:

Empezado por ecfisa (Mensaje 502273)
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 20:41:14

Cita:

Empezado por Casimiro Notevi (Mensaje 502275)
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 20:19:52

Gracias Agustín.
En Windows coloreaba las celdas al seleccionarlas de la siguiente manera:
Código Delphi [-]
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 13: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.

Código Delphi [-]

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.


La franja horaria es GMT +2. Ahora son las 05:15:49.

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