Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cuadricula (https://www.clubdelphi.com/foros/showthread.php?t=59333)

Omega 22-08-2008 18:31:10

Cuadricula
 
Buenas, estoy tratando de hacer algo y no se me ocurre que componente usar. Les explico lo que quiero hacer y haber si me pueden recomendar algún componente, ya sea de los incluidos en Delphi 7 o externo.

Necesito mostrar un tablero de 15x20 (*) cuadrados, cada cuadrado contendrá una imagen y siempre serán del mismo tamaño 32x32 (*), y también necesito poder detectar en que cuadrado se hizo click para cambiar dicha imagen.

* Eso son valores de ejemplo, en verdad nesesito poder cambiarlo en tiempo de ejecucion.

Saludos y gracias.

roman 22-08-2008 18:35:29

Podría servirte el TDrawGrid de la pestaña Additional.

// Saludos

egostar 22-08-2008 18:36:38

Hola,

Se me ocurre que podrías usar el TGridPanel

Salud OS

Omega 22-08-2008 18:50:33

Gracias a ambos por una respuesta tan rapida.


@roman: El TDrawGrid parece interesante salvo por dos cosas:

La 1º son esos cuadros gris, que no me sirven para nada. Y la 2º es que permite seleccionar las casillas mostrando el típico fondo azul.

@egostar: El TGridPanel no lo encuentro. mmm ¿Esta para Delphi 7?

Saludos.

egostar 22-08-2008 18:57:25

Cita:

Empezado por Omega (Mensaje 308854)
Gracias a ambos por una respuesta tan rapida.


@roman: El TDrawGrid parece interesante salvo por dos cosas:

La 1º son esos cuadros gris, que no me sirven para nada. Y la 2º es que permite seleccionar las casillas mostrando el típico fondo azul.

@egostar: El TGridPanel no lo encuentro. mmm ¿Esta para Delphi 7?

Saludos.

Pues pense que si, lo he visto aquí

New VCL features since Delphi 7 - 9:38am
2 Apr 2007 ... VCL Features Since Delphi 7. VCL Applications are themed by default. ... With a grid panel, a developer can specify the number of rows and ...

Salud OS

Edito: Mea culpa, esto es después de D7, perdón.

Abstract: See many of the major new VCL features available in releases after Delphi 7

roman 22-08-2008 19:06:52

Cita:

Empezado por Omega (Mensaje 308854)
El TDrawGrid parece interesante salvo por dos cosas:

La 1º son esos cuadros gris, que no me sirven para nada. Y la 2º es que permite seleccionar las casillas mostrando el típico fondo azul.

Los cuadros grises corresponden a las filas y columnas fijas. Simplemente pon FixedCols y FixedRows en 0 para que no haya columnas fijas.

La selección azul la puedes quitar al momento de dibujar las celdas en el evento OnDrawCell:

Código Delphi [-]
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if gdSelected in State then
  begin
    InflateRect(Rect, 1, 1);
    DrawGrid1.Canvas.Brush.Color := DrawGrid1.Color;
    DrawGrid1.Canvas.Rectangle(Rect);
  end;
end;

// Saludos

Omega 22-08-2008 22:22:07

@egostar: No pasa nada, gracias de todas formas. =)

@roman: Funciono todo perfecto, arigatō!

Ahora solo me queda ver si puedo eliminar la marca de selección y luego ya pintar las celdas al hacer click en una de ella. Creo que esto ultimo lo puedo lograr con lo siguiente, ahora lo probare:
Código Delphi [-]
ImageList1.Draw(DrawGrid1.Canvas,Rect.Left,Rect.Top,0);

Saludos.

egostar 22-08-2008 22:40:46

Hola

Si solo vas a usar una sola imagen para todos los "cuadros", tambien puedes hacer esto si es que quieres modificar la imagen desde fuera del programa.

Código Delphi [-]
var
  Form1: TForm1;
  imagen: TImage;

implementation

{$R *.dfm}

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  DrawGrid1.Canvas.Draw(Rect.Left,Rect.Top,Imagen.Picture.Graphic);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  imagen.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  imagen := TImage.Create(nil);
  imagen.Picture.LoadFromFile('C:\Desarrollo\Iconos\admin_32.ico');
end;

end.

Salud OS

Edito

Leyendo de nuevo, vi que quieres hacer clic en alguna celda y colocar una imagen en ella,
Código Delphi [-]
var
  Form1: TForm1;
  imagen: TImage;
  _Rect: TRect;

implementation

{$R *.dfm}

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  DrawGrid1.Canvas.Draw(_Rect.Left,_Rect.Top,Imagen.Picture.Graphic);
end;

procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  _Rect := DrawGrid1.CellRect(ACol,ARow);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  imagen.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  imagen := TImage.Create(nil);
  imagen.Picture.LoadFromFile('C:\Desarrollo\Iconos\admin_32.ico');
end;

end.

roman 22-08-2008 23:49:20

Por cierto, olviden lo anterior para evitar la selección azul. Es más fácil poniendo

Código Delphi [-]
DrawGrid1.DefaultDrawing := false;

:o

Eso también quita el rectángulo punteado de la selección. :D

// Saludos

Omega 23-08-2008 20:46:42

@roman: Menos código y mejor, perfecto. :p

@egostar: Te pasaste en tu respuesta :O El código funciona bien, pero si minimizas la ventana lo dibujado se pierde. Así que se me ocurre ir guardando en un array las celdas que tienen imagen y luego en el DrawCell recorrer el array con un for e ir pintando las imágenes. Ahora me pondré con ello, si lo consigo lo posteo por si a alguien le sirve.

Edito: Añado el código que he hecho (basado en el de egostar) para rellenar una celda con una imagen, ahora solo me falta la parte del array y el for:
Código Delphi [-]
 Imagen:TBitmap;
begin
 Imagen := TBitmap.Create;
 ImageList.GetBitmap(0,Imagen);
 l := (Nº_FILA * ANCHO_IMG) + Nº_FILA;
 t := (Nº_COLUMNA * ALTO_IMG) + Nº_COLUMNA;
 DrawGrid.Canvas.Draw(l,t,Imagen);
 Imagen.Free;
end;


La franja horaria es GMT +2. Ahora son las 22:07:29.

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