Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-02-2009
juscar juscar is offline
Registrado
 
Registrado: jun 2008
Posts: 3
Poder: 0
juscar Va por buen camino
Poner columna 'falsa' de checkbox dentro de dbgrid para hacer multiseleccion

Buenas, tengo un problema con un dbgrid, os explico. Tengo una tabla de la que extraigo X campos; mi idea es añadir una nueva columna de checkbox que permita al usuario seleccionar las filas que quiera, para recoger varios IDs y hacerles un tratamiento posterior.
He visto lo de pintar checkbox (http://delphi.about.com/od/usedbvcl/l/aa082003a.htm)
y me funciona creando un campo boleano que no existe en la tabla, pero no los puedo modificar.
Alguien me echa un cable, porque no encuentro nada en internet.
Saludos y gracias..

Última edición por juscar fecha: 11-02-2009 a las 10:01:20.
Responder Con Cita
  #2  
Antiguo 11-02-2009
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
Hola,
te cuento un poco lo que podrías hacer, pero no tengo delphi aquí para comprobarlo y darte mejores pistas.
En ocasiones, para seleccionar registros en un grid lo que hago es:
- crear un stringlist
- Cuando pulso espacio selecciono el registro. Cojo el id del registro y lo almaceno en el stringlist. Si está seleccionado lo borro del stringlist.
- Al pintar la fila, si el id está en la lista, pinto en negrita.

¿ Cómo encaja esto en tu pregunta ?
Sencillo, en lugar de pintar en negrita, añade un campo calculado que no dependa del dataset, y si el id del registro está en la lista, pintas checado el checkbox.
Después, si quieres hacer algo con los registros seleccionados, te coges el stringlist y procesas todos los ids que tenga.

Puedes mejorar la selección del registro obviamente utilizando el campo calculado del checkbox.

Espero que lo hayas entendido, es bastante sencillo.

Suerte y un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
Antiguo 13-02-2009
juscar juscar is offline
Registrado
 
Registrado: jun 2008
Posts: 3
Poder: 0
juscar Va por buen camino
hola de nuevo

Muchas gracias por contestar.EL tema es que la info la saco de una query que no puedo modificar en el dataset. Aunque por lo que dices y no habia pensado en eso, otra opcion sería ir coloreando filas cada vez que seleccione el usuario (usando el stringlist para guardar los IDs de cada fila).
Voy a intentar hacerlo por mi cuenta y ya os comento si me sale.
Gracias por darme otro punto de vista

Última edición por juscar fecha: 13-02-2009 a las 10:25:56.
Responder Con Cita
  #4  
Antiguo 13-02-2009
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.409
Poder: 22
fjcg02 Va camino a la fama
Para orientarte 'un poco'
Previamente he creado un campo en el dbgrid titulado 'Seleccionado'
Este campo no tiene asociado campo de la bbdd y es el primero de todos
Además mecesitas un memo con nombre Memo1. Puedes sustituirlo por un stringlist. A tu gusto.
Importante, el grid no permite editar. No sé que pasaría si fuese posible la edición!!

Pintado del grid. Si el id está en la lista, se escribe el checkbox y se pone en negrita toda la fila. Si no lo está
Código Delphi [-]
procedure TFSelPartidas.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var R:TREct; longitud, selecc: integer;
begin
Selecc:= 0;
// utilizo un memo para hacer de lista de id's de registros modificados ¿?
if  memo1.LineS.IndexOf(QTarifas.FieldByName('IdTarifa').AsString) >= 0 then
  begin
    (Sender as TDBGrid).Canvas.Font.Style:=[fsbold];
    (Sender as TDBGrid).Canvas.FillRect(Rect);
    Selecc:= DFCS_CHECKED;
  end
else DBGrid1.Canvas.Font.Style:=[];
   if Column.Title.Caption= 'Seleccionado' then 
// si es el campo indicado, pinto un check seleccionado o no en base al valor de selecc
        DrawFrameControl(DBGrid1.Canvas.Handle,REct, DFC_BUTTON, DFCS_BUTTONCHECK or Selecc)
    else
       (Sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;
Para incluir los id's en el memo utilizo el siguiente procedimiento
Código Delphi [-]
procedure TFSelPartidas.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var posicion: integer;
begin
if (key = ' ') and ( not WEdicion) then // si se pulsa espacio, se añade o borra el id
begin
  posicion:= memo1.LineS.IndexOf(QTarifas.FieldByName('IdTarifa').AsString);
 if posicion < 0 then Memo1.Lines.Add(QTarifas.FieldByName('IdTarifa').AsString)
 else Memo1.Lines.Delete(posicion);
 DBGrid1.Repaint;
end;
if not WEdicion then
StatusBar1.PAnels[0].Text:= 'Seleccionadas '+inttoStr(Memo1.lines.Count)+' partidas';

end;
También si clickamos sobre el checkbox de la fila seleccionamos o seleccionamos
Código Delphi [-]
procedure TFSelPartidas.DBGrid1CellClick(Column: TColumn);
var key:  char;
begin

if Column.Title.Caption= 'Seleccionado' then
begin
  key := ' ';
  DBGrid1KeyPress(DBGrid1, key);
end;
end;
La solución queda cuanto menos 'elegante'
Suerte y saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 16-02-2009
juscar juscar is offline
Registrado
 
Registrado: jun 2008
Posts: 3
Poder: 0
juscar Va por buen camino
Ya sale

Al final, usando parte de tu codigo y algo que tenia ya echo, he optado por colorear las filas, aunque me quedo con tu codigo por si alguna vez me hace falta. Funciona de p.m.

Has sido muy amable.
Responder Con Cita
  #6  
Antiguo 02-04-2013
Vales08 Vales08 is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 133
Poder: 14
Vales08 Va por buen camino
checkbox n dbgrid

Buenas tardes..
te hago una consulta fjcg02. Porque he probado tu código y me funciona a la perfección, pero yo querría que en lugar de pasar los ID al memo, me gustaria pasar los nombres de los registros, de paso sirve el memo para ir mostrando los registros que voy seleccionando
.. Eso se puede lograr con este mismo codigo??

Muchas gracias.!!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hacer que una columna de un DbGrid aparezca distinta según valor Aprendiendo OOP 11 30-11-2018 14:47:20
Poner checkbox en un dbgrid aitken Varios 4 19-07-2005 17:12:26
group by y dbgrid, poner condicion como columna? JoseQ Conexión con bases de datos 4 17-05-2005 03:57:24
Poner un checkbox dentro de un Dbgrid Nbull SQL 3 02-03-2005 17:47:22
checkbox dentro de DBGrid empty Varios 1 30-03-2004 17:58:10


La franja horaria es GMT +2. Ahora son las 01:39:21.


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
Copyright 1996-2007 Club Delphi