PDA

Ver la Versión Completa : Cuadricula


Omega
22-08-2008, 18:31:10
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:
http://img115.imageshack.us/img115/1227/delphips5.png
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
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 (http://dn.codegear.com/article/34325)
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
El TDrawGrid parece interesante salvo por dos cosas:
http://img115.imageshack.us/img115/1227/delphips5.png
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:


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ō!
http://img59.imageshack.us/img59/4226/delphi2zz5.png
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:
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.


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,

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


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:

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;