 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Lun 25 Jul, 2005 7:11 am Asunto: Seleccionar varias celdas en un TStringGrid |
|
|
Hola a todos, por mas que he buscado en el foro, no doy con esto.
Tengo un StringGrid, y al hacer click necesito se me pinten otras celdas tambien, por ejemplo a parte de la que le hago click... otras dos..
es por cosa de contexto.. al hacer click en una.. en realidad son 3 celdas las que cumplen el contexto.. ejemplo
Nombre
Direcion
Apellido
entonces al hacer click en cualquiera de ellos.... los tres deben pintarse o seleccionarse en un cuadrito... alguien sabe como se hace?...
He estado viendo el metodo drowRect... pero no se su utilizacion y no se como incorporar mas de una celda. |
|
| Volver arriba |
|
 |
Mónica Cmdr

Registrado: 27 Sep 2002Mensajes: 136Ubicación: Pontevedra (España)
|
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Jue 28 Jul, 2005 5:43 am Asunto: creo que no me sirve |
|
|
En el link... he visto como poder seleccionar multiples filas... pero lo que necesito es que al hacer un clik.. en una celda.. se seleccione ademas de la que le hago click... otras dos...
sabiendo yo cuales son las otras celdas que deben seleccionarse. |
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Lun 01 Ago, 2005 9:48 pm Asunto: aun no doy con la solucion... |
|
|
Estoy viendo el codigo que puso leo_ para un TListView, en el cual cambia la seleccion al pintarse el componente...
he intentado de todo con el tema de StringGrid->Canvar->Rectangule(TRect), pero no me funciona para nada....
alguna idea?... Gran Leo_... sabes como hacerlo?
de antemano muchas gracias. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 01 Ago, 2005 11:40 pm Asunto: |
|
|
No te entiendo bien, necesitas seleccionar una fila completa ? Si es así fíjate en la propiedad Options y activa "goRowSelect".
Si no es esto y puedes poner un ejemplo de lo que debe ocurrir al hacer click sobre una celda, cuanto más detalle mejor... |
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Lun 01 Ago, 2005 11:47 pm Asunto: no.. no es una fila |
|
|
mira, es un conjunto adyacente de celdas, que estan relacionadas( en mi caso, son 3 celdas relacionadas)
son celdas contiguas, no es ni una fila completa ni una columna completa.
ejemplo: un string grid de 9 x 9,
si selecciono el [1,1], entonces debiera seleccionarse la [1,1],[1,2],[1,3]
si selecciono el [1,2], entonces debiera seleccionarse la [1,1],[1,2],[1,3]
si selecciono el [1,3], entonces debiera seleccionarse la [1,1],[1,2],[1,3]
si selecciono el [1,4], entonces debiera seleccionarse la [1,4],[1,5],[1,6]
si selecciono el [2,0], entonces debiera seleccionarse la [2,0],[2,1],[2,2]..
.
.
.
.
etc.
yo tengo claro al hacer click en una celda, las otras dos que se relacionan, el problema es que no puedo hacer esa seleccion de 3 celdas al hacer click en solo una.
Espero ahora me haya explicado mejor.
De antemano muchas gracias por tu ayuda. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 02 Ago, 2005 12:37 am Asunto: |
|
|
La propiedad "Selection" permite seleccionar un rango de celdas contiguas, no se si te sirve. Un pequeño ejemplo para probarlo podría ser poniendo lo siguiente en el OnClick, lo que hace es que al pulsar sobre una celda marca las dos que tiene a la derecha:
| Código: | TGridRect rect;
rect.Left = StringGrid1->Col;
rect.Top = StringGrid1->Row;
rect.Right = rect.Left + 2;
rect.Bottom = rect.Top;
StringGrid1->Selection = rect; |
|
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Mar 02 Ago, 2005 8:14 am Asunto: si, con esto ya tengo algo. |
|
|
Gracias Leo_, esto me sirve, gracias.
Ya habia hecho algunas pruebas con el selection , estaba dando mal un parametro.
pero lo que tambien estoy intentando acoplar es el siguiente codigo que usaste para un TListView, para que la seleccion tomara esa apariencia..
pongo el codigo que hiciste para un ListView.
| Código: |
TListView* lv = static_cast<TListView*>(Sender);
TRect IconRect = Item->DisplayRect(drIcon);
TRect CaptionRect = Item->DisplayRect(drLabel);
TRect ItemRect = Item->DisplayRect(drBounds);
InflateRect(&ItemRect, -1, 0);
InflateRect(&CaptionRect, -2, 0);
// Pintamos el fondo del elemento
if (State.Contains(cdsSelected))
{
lv->Canvas->Brush->Color = static_cast<TColor>(0xF4E6DC);
lv->Canvas->Pen->Color = static_cast<TColor>(0xD48A4C);
lv->Canvas->Rectangle(ItemRect);
}
else
{
lv->Canvas->Brush->Color = lv->Color;
lv->Canvas->FillRect(ItemRect);
}
|
en el if, trato de validar que lo que se ha seleccionado sean las celdas que por el click están.
pero no me resulta el dibujar bien el rectangulo para las celdas seleccionadas... tu que eres experto en esto... como podria acoplar este codigo a las 3 celdas que ya tengo seleccionadas?.... ese efecto es demasiado bueno en el listview. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 03 Ago, 2005 4:57 am Asunto: |
|
|
La diferencia con el ListView es que este si prevee una forma de pintado que hace muy fácil esto, y es que además de recibir una notificación para pintar celda por celda al igual que el StringGrid, tiene otro modo que nos notifica cuando hay que pintar una fila completa y entonces pintamos la fila completa a nuestro gusto (o sea, celda por celda pero todas a la vez en la misma rutina, no se si me explico).
De todos modos a ver si te gusta de esta manera. Añade el siguiente código al OnDrawCell del StringGrid:
| Código: | TStringGrid* grid = static_cast<TStringGrid*>(Sender);
TCanvas* canvas = grid->Canvas;
if (State.Contains(gdSelected))
{
// Descomenta la linea siguiente si prefieres que el
// borde del recuadro se pinte sobre las lineas del grid
// InflateRect(&Rect, 1, 1);
// Pinta el interior de la celda y el borde de diferente color
canvas->Brush->Color = static_cast<TColor>(0xF4E6DC);
canvas->Pen->Color = static_cast<TColor>(0xD48A4C);
canvas->Rectangle(Rect);
canvas->Pen->Color = canvas->Brush->Color;
// Comprobamos si hay una celda seleccionada a la _izquierda_
// de esta y borramos la linea izquierda que hemos pintado antes
if (grid->Selection.Left < ACol)
{
canvas->MoveTo(Rect.Left, Rect.Top+1);
canvas->LineTo(Rect.Left, Rect.Bottom-1);
}
// Comprobamos si hay una celda seleccionada a la _derecha_
// de esta y borramos la linea izquierda que hemos pintado antes
if (grid->Selection.Right > ACol)
{
canvas->MoveTo(Rect.Right-1, Rect.Top+1);
canvas->LineTo(Rect.Right-1, Rect.Bottom-1);
}
// Pintamos el texto de la celda
String texto = grid->Cells[ACol][ARow];
canvas->Brush->Style = bsClear;
canvas->TextRect(Rect, Rect.Left+2, Rect.Top+2, texto);
} |
Y cambiamos el código que habíamos usado mas arriba para seleccionar varias celdas por lo siguiente. Y en vez de ponerlo en el OnClick lo ponemos en el OnMouseDown y OnMouseUp:
| Código: | TGridRect rect = StringGrid1->Selection;
rect.Right = rect.Left + 2;
rect.Bottom = rect.Top;
StringGrid1->Selection = rect;
StringGrid1->Repaint(); |
 |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mar 27 Jul, 2010 5:35 pm Asunto: |
|
|
Leo,
Este ejemplo que has puesto es perfecto, pero podrías hacer una pequeña modificación? es que le estoy dando vueltas y no me sale.
La idea es justamente lo mismo pero no sobre celdas seleccionadas sino simplemente que tengan datos, me explico, si tenemos dos celdas rellenas una debajo de la otra que se haga un recuadro entre las dos, si hay tres pues tres y se hace el recuadro.
De arriba a abajo, en vez de izquierda a derecha, aunque imagino que eso es parecido.
Se te ocurre como?
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
Dream Lt JG


Registrado: 14 Feb 2003Mensajes: 57Ubicación: TOLEDO
|
Publicado: Lun 29 Jul, 2013 4:33 pm Asunto: |
|
|
Buenas tardes,
Necesito colorear un celdas de un listview pero me colorea toda la fila.
Estoy intentandolo pero nada, tengo que hacer un cuadrante de días ( Lunes, Martes,..) y horas. Al pulsar sobre una de las celdas, debe de cambiar de color.
Todo lo que he visto y lo que he hecho me colorea la fila completa. He conseguido hacer clic sobre la celda y obtener el dato pero de colorear nada.
Gracias por todo |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 22 Ago, 2013 7:13 pm Asunto: |
|
|
| Dream escribió: | Buenas tardes,
Necesito colorear un celdas de un listview pero me colorea toda la fila.
Estoy intentandolo pero nada, tengo que hacer un cuadrante de días ( Lunes, Martes,..) y horas. Al pulsar sobre una de las celdas, debe de cambiar de color.
Todo lo que he visto y lo que he hecho me colorea la fila completa. He conseguido hacer clic sobre la celda y obtener el dato pero de colorear nada.
Gracias por todo |
No te es más sencillo para esto usar el TStringGrid? si necesitas por ejemplo editar las celdas de esta manera lo tienes mucho más sencillo.. hay alguna razón por la que prefieras complicarte y hacerlo con el TListView? |
|
| Volver arriba |
|
 |
Dream Lt JG


Registrado: 14 Feb 2003Mensajes: 57Ubicación: TOLEDO
|
Publicado: Vie 23 Ago, 2013 10:37 am Asunto: GRACIAS |
|
|
Gracias por contestar LEO
No no tengo ninguna preferencia, lo unico que con ListView he trabajado mas y con StrinGrid no lo he hecho nunca.
Mirare información sobre StringGrid.
Muchas gracias |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|