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;
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.