Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No encuentro la forma (TStringGrid colores) (https://www.clubdelphi.com/foros/showthread.php?t=84301)

paquechu 03-10-2013 00:06:58

No encuentro la forma (TStringGrid colores)
 
Buenas noches,
Este es un tema recurrente, pero no doy con la "tecla".
Vereis, necesito crear un stringgrid (a falta de otro control mejor) con 50 celdas en total (10 filas x 5 columnas) de forma que cuando haga clic en una celda esta cambie a un color (verde por ejemplo) y si hago clic de nuevo sobre la misma celda le vuelva a dejar el color original del stringgrid, de esta forma luego podre recorrer el stringgrid y preguntar por el color de cada celda y proceder de una forma u otra segun sea su color.
Pues no encuentro la forma, he buscado pro ahí varios códigos pero no funciona ninguno ni consigo adaptarlo a la funcionalidad que os he comentado.
Me podeis echar una mano?
Saludos.
Paco.

ecfisa 03-10-2013 05:37:49

Hola paquechu.

Si te arreglas con el evento OnDblClick te puedo sugerir este código:
Código Delphi [-]
...
implementation   

const
  MAXCOL = 4;
  MAXROW = 9;

var
  vPainted : array[0..MAXCOL, 0..MAXROW] of Boolean; // 5 x 10

procedure TForm1.FormCreate(Sender: TObject);
var
  c,f: Integer;
begin
  for c := 0 to MAXCOL do
    for f := 0 to MAXROW do
      vPainted[c,f] := False;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
  COLORS : array[Boolean] of TColor = (clWindow, clGreen);
begin
  with TStringGrid(Sender) do
  begin
    Canvas.Brush.Color := COLORS[vPainted[ACol,ARow]];
    Canvas.FillRect(Rect);
    DrawText(Canvas.Handle,PChar(Cells[ACol,ARow]),-1,Rect,DT_SINGLELINE);
  end;
end;

procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
  with TStringGrid(Sender) do
  begin
   vPainted[Col, Row] := not vPainted[Col, Row];
   Invalidate;
  end;
end;

end.
Lamentablemente en el componente TStringGrid el evento OnClick se dispara también ante otras acciones que el click del mouse ...

Saludos :)

paquechu 03-10-2013 10:59:13

Hola ecfisa,
Pues la verdad es que me da igual que sea con un evento doble clic.
Lo he probado y funciona a la perfección.
Muchas gracias por tu ayuda y rapidez. Eres muy amable :-).
Saludos
Paco.

cloayza 03-10-2013 21:47:39

Con su permiso estimado Ecfisa...

Otra opción...

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  c,f: Integer;
begin
     for c := 0 to StringGrid1.ColCount-1 do
         for f := 0 to StringGrid1.RowCount-1 do
            StringGrid1.Objects[c,f] := Pointer(False);
end;

procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
     with TStringGrid(Sender) do
     begin
          StringGrid1.Objects[Col, Row] := Pointer(not Boolean(StringGrid1.Objects[Col, Row]));
          Invalidate;
     end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
const
  COLORS : array[Boolean] of TColor = (clWindow, clGreen);
begin
     with TStringGrid(Sender) do
     begin
       Canvas.Brush.Color := COLORS[Boolean(StringGrid1.Objects[ACol, ARow])];
       Canvas.FillRect(Rect);
       DrawText(Canvas.Handle,PChar(Cells[ACol,ARow]),-1,Rect,DT_SINGLELINE);
     end;
end;

Saludos

ecfisa 03-10-2013 23:01:17

Cita:

Empezado por cloayza (Mensaje 467806)
Con su permiso estimado Ecfisa...

Pero por supuesto que lo tenes! Y está muy bien encapsular la condición de las celdas en el mismo StringGrid evitando el uso del arreglo ;)

Saludos. :)

paquechu 04-10-2013 08:55:55

Buenos días,
Muchas gracias por este otro enfoque cloayza :-)
Lo exploraré también.
Saludos.


La franja horaria es GMT +2. Ahora son las 11:05:04.

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