Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Seleccionar varias celdas en un TStringGrid

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Seleccionar varias celdas en un TStringGrid Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Bueno, a ver si ésto te puede ayudar:

[url]
https://cppbuilder.es/viewtopic.php?t=3099&highlight=stringgrid+seleccionar+celdas
[/url]

De todas formas es bastante lioso, yo finalmente opté por utilizar un TListView.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: creo que no me sirve Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: aun no doy con la solucion... Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: no.. no es una fila Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: si, con esto ya tengo algo. Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: GRACIAS Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.