Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Campos booleanos en StringGrid con CheckBox

¡Hola de nuevo Delphinianos ...!

El motivo por el cual escribo, esque pretendo realizar la lectura de campos booleanos de una BD (SQL Server) y mostrarlos dependiendo su valor (True/False) en un StringGrid pintando un CheckBox que describa este status (Seleccionado/NoSeleccionado) respectivamente.

He revisado ya algunos hilos entre ellos http://delphi.about.com/od/usedbvcl/l/aa082003a.htm y algunos hilos de este foro.Y he tomado algunas de las funcionalidades para pintar el checkbox, pero en una sola columna.Estoy en Delphi5.

Lo que hasta ahorita llevo es cargar los valores de la tabla en el StrinGrid.Algunos de mis campos que son los booleanos me aparecen True/False en el StringGrid.

Intenté crear un componente TCheckBox y asiganarlo de esta forma
Código Delphi [-]
  
...
  StringGrid1.Objects[5,i] := NewCheckBox;  
  if (StringGrid1.Cells[5,i]='True') then     
    NewCheckBox.Checked :=true   
  else     
    NewCheckBox.Checked :=false;   
end;

El valor del campo asignado al StringGrid al debuguear si me lo está leyendo bien y entra a la condición true/false que corresponde pero ya cuando visualizo el resultado,el checkbox siempre aparece marcado.



¿Alguna sugerencia para poder visualizar este tipo de campos, de esta manera? o ¿Algún tip? Se agradece.

Gracias por el interés, saluditos!
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."

Última edición por ecfisa fecha: 23-06-2012 a las 01:39:56. Razón: corregir problema etiquetas interfaz mejorada
Responder Con Cita
  #2  
Antiguo 23-06-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Hola.

Echale un vistazo a este hilo a ver si te ayuda.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 25-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Gracias!!

Hola, te agradezco tu atención e interés, ya eché un vistazo en el link y si me sirvió de algo. Ya me aparecen los checks marcados conforme a los datos de la BD.

Pero ahora tengo otra situacíon. ¿Cómo puedo trabajar con los eventos de los ChecksBox creados? Sin necesidad de vincular este control a un CheckBox ya existente.Me interesa, el OnClick. Porque creeé los checks por código...:S

Creé el procedure, pero no me funciona.
Código Delphi [-]
procedure TForm1.NewCheckBoxClick(Sender: TObject);
begin
showMessage('hola');
end;

Saludos!

P.D. Estoy investigando por si encuentro alguna otra alternativa.

Gracias!
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."
Responder Con Cita
  #4  
Antiguo 26-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Hola de nuevo...

Bueno, he estado modificando mi codigo, para lograr lo que me he propuesto. Simulé la lectura de los campos booleanos de mi tabla al StringGrid con valores fijos, ya que esto ya lo he logrado.

*En el evento Create del Formulario es donde se realiza todo el proceso.
*En el evento Clic del StringGrid eh puesto validaciones dependiendo del "status" del campo (True/False).Al darle Click "modifica" el valor del StringGrid si está en True lo pone en False, si está en False, lo pone en True.

Pero es aqui donde me he perdido un poco en cuanto a referenciar al Check que va a cambiar de status, ya que siempre me cambia el status del ultimo check .

No sé como hacer para que el check respectivo cambie su status al dar dblclick.

Lo que llevo hasta el momento es esto:
Código Delphi [-]
unit UPrueba3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, ExtCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure ClickLabels(Sender :TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  NewCheckBox: TCheckBox;
implementation

{$R *.DFM}


procedure TForm1.ClickLabels(Sender: TObject);
var
vfila: Integer;
begin
{with Sender as TCheckBox do
  begin
   ShowMessage(Caption);
   case Tag of
    1: ShowMessage('Accion especial para el primer ');
    2: ShowMessage('Accion especial para el segundo');

   end;
end;}
end;
procedure TForm1.StringGrid1Click(Sender: TObject);
var
  pt: TPoint;
  grid: TStringgrid;
  aCol, aRow: Integer;
begin
   GetCursorPos( pt );
   grid := Sender As TStringgrid;
   pt:= grid.ScreenToClient( pt );
   grid.MouseToCell( pt.x, pt.y, aCol, aRow );

  if (StringGrid1.Cells[ACol,ARow])= 'True' then
  begin
      StringGrid1.Cells[ACol,ARow] := 'False';
      NewCheckBox.Checked := False;
  end
  else
  begin
    if (StringGrid1.Cells[ACol,ARow])= 'False' then
    begin
     NewCheckBox.Checked := True;
     StringGrid1.Cells[ACol,ARow] := 'True';
     end;
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
 i,j: Integer;
 Rect: TRect;
 cant,aTop: integer;
begin
  StringGrid1.Cells[1,1] := 'True';
  StringGrid1.Cells[1,2] := 'False';
  StringGrid1.Cells[1,3] := 'False';
  StringGrid1.Cells[1,4] := 'True';

  aTop := 0;
  cant := 0;
  for i :=0  to stringgrid1.RowCount-1 do
  begin
    NewCheckBox := TCheckBox.Create(Application);
    NewCheckBox.Width := 5;
    NewCheckBox.Height := 5;
    NewCheckBox.Visible := True;
    NewCheckBox.State := cbUnchecked;
    NewCheckBox.Name := 'CheckBox'+IntToStr(cant);
    NewCheckBox.Top := aTop;
    NewCheckBox.Tag := i;
    NewCheckBox.Color :=clWhite;
    NewCheckBox.OnClick := ClickLabels; //Asignamos el evento
    Inc(Cant);
    Inc(aTop,20);

    if i <> 0 then
    begin
      if (StringGrid1.Cells[1,i]='True') then
      begin
        NewCheckBox.Checked :=true;
      end
      else
      begin
        NewCheckBox.Checked :=false;
      end;

      NewCheckBox.Parent := StringGrid1;
      StringGrid1.Objects[1,i] := NewCheckBox;
      NewCheckBox.Caption := '';
      NewCheckBox.Visible := True;
    end;
  end;

  for j := 0 to StringGrid1.RowCount-1 do
  begin
    NewCheckBox := (StringGrid1.Objects[1,j] as TCheckBox);
    if NewCheckBox <> nil then
    begin
      Rect := StringGrid1.CellRect(1,j);
      NewCheckBox.Left := (StringGrid1.Left + Rect.Left+2)-25;//(StringGrid1.Left + Rect.Left+2)-40;
      NewCheckBox.Top := (StringGrid1.Top + Rect.Top+2)-15;
      NewCheckBox.Width := 20;//Rect.Right - Rect.Left;
      NewCheckBox.Height :=20; //Rect.Bottom - Rect.Top;
      NewCheckBox.Visible := True;
    end;
  end;
end;

end.

Espero haberme dado a entender con lo que quiero y de verdad agradezco a quienes se interesen y sugieran =). Gracias!
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."

Última edición por Jetzuvely21 fecha: 26-06-2012 a las 00:27:30. Razón: falto explicacion final
Responder Con Cita
  #5  
Antiguo 26-06-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Hola.

Mira ahora este hilo a ver si te sirve.

(me está entrando complejo de índice )

Saludos
__________________
Be water my friend.
Responder Con Cita
  #6  
Antiguo 26-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por newtron Ver Mensaje
Hola.
Mira ahora este hilo a ver si te sirve.
(me está entrando complejo de índice )
Saludos
Es que como se ha hablado de 'casi' todo, sólo hay que hacer una búsqueda y enlazar la respuesta

Es como la reunión de contadores de chistes, que en lugar de contarse los chistes, se indicaban el número:
Oye, conté el #15 y la gente se tronchaba de risa. Pues menos mal que no empezaste con el #28. Ja ja ja... sí, o el #31

Qué malo soy para los chistes
Responder Con Cita
  #7  
Antiguo 26-06-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Qué malo soy para los chistes
Pues la verdad es que no te veo en el club de la comedia.
__________________
Be water my friend.
Responder Con Cita
  #8  
Antiguo 26-06-2012
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 18
TiammatMX Va camino a la fama
Wink Pues yo lo hago así...

¡Hola!

Para leer el dato desde la tabla:
Código Delphi [-]
CheckBox1.Checked := Tabla.FieldByName('CampoBit1').AsBoolean;
.
.
.

CheckBoxn.Checked := Tabla.FieldByName('CampoBitn').AsBoolean;

Para guardarlo en una tabla, el valor lo convierto a entero, lo agrego a la sentencia SQL que lo insertará y ¡listo!...

Espero que te sirva.
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco
Responder Con Cita
  #9  
Antiguo 26-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Ok!

Gracias por contestarme a ambos jiji, y sip, hice la respectiva busqueda en los hilos, y precisamente del hilo que me comentas al ultimo me sirvió porque de ahi pude hacer lo que llevo.

El problema ahora es que cada que ejecuto el programa, entra al evento
Código Delphi [-]
  NewCheckBox.OnClick := ClickLabels; //Asignamos el evento

y en ese evento , aunque no le de click al CheckBox ya cuando se crea en mi forma, ambos eventos se ejecutan mostrandome los dos mensajes. Agregué la variable tag, al momento de crearlos.
Código Delphi [-]
procedure TForm1.ClickLabels(Sender: TObject); 
var vfila: Integer;
begin 
{with Sender as TCheckBox do   
begin    
ShowMessage(Caption);    
case Tag of     
1: ShowMessage('Accion especial para el primer ');     
2: ShowMessage('Accion especial para el segundo');     
end; 
end;}
 end;

Tambien probé lo del hilo:
Código Delphi [-]
procedure TForm3.CheckBox3Click(Sender: TObject); 
var nfila: Integer; 
begin 
nfila:=ActiveControl.Tag; <= Este tag lo defini al momento de crear el checkbox.  
IF StringGrid1.Cells[3,nfila]='' THEN 
ShowMessage('La tarea esta vacia, Haga un clic sobre la tarea que quiere modificar');  
end;

Pero aqui siempre el tag me lo ponea en 0 cuando hago click en el checkbox creado. Estoy segura que ando haciendo algo mal. Pero no veo que? >_<

Lo qe hago es dar click sobre el checkbox creado, pero no hace nada...
y el tag me lo pone siempre en 0. Gracias..
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."

Última edición por Jetzuvely21 fecha: 26-06-2012 a las 16:54:50. Razón: No se mostraba el codigo de forma correcta.
Responder Con Cita
  #10  
Antiguo 26-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Gracias tiammat

Esto lo tomaré en cuenta para el guardado de mis campos.Y pues necesito checkbox creados de forma dinamica para agregarlos al StringGrid. Ahorita solo tengo el problema en como definir el evento para cada uno cuando de click sobre los checkbox creados.

He seguido las ligas, y googleado, pero no me está respetando los eventos definidos para cada uno.

Muchas gracias por tu interés.
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."
Responder Con Cita
  #11  
Antiguo 26-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Esto no me sale X:

Buscando en los hilos, esto es lo que necesito, como bien explica Caro en una duda que ella tenía en las labels, lo mio con checkbox.

http://www.clubdelphi.com/foros/showthread.php?t=21387

Cita:
Caro:"En este evento onclick me gustaria poder saber cual de los labels creados esta siendo presionado, quiero recuperar el nombre del label presionado, mi problema es que cada vez que hago click en los labels creados siempre me recupera el nombre del ultimo label creado".
Con la exepción de que cuando yo doy click en el checkbox creado no pasa nada ....solo al momento de ejecutar el programa..muestra los mensajes. Lo implementé asi, pero sigue sin funcionarme

Código Delphi [-]
procedure TForm1.ClickLabels(Sender: TObject);
begin
  if Sender is TCheckBox then
  case TCheckBox(Sender).Tag of
    1: ShowMessage('primer ');
    2: ShowMessage('segundo ');
    3: ShowMessage('tercero ');
    4: ShowMessage('cuarto');
  end;
end;
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."

Última edición por Jetzuvely21 fecha: 26-06-2012 a las 17:55:34. Razón: Codigo mal mostrado
Responder Con Cita
  #12  
Antiguo 26-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Una pregunta mas...

Bueno, ya he logrado resolver mi duda, gracias a quienes prestaron interés y contestaron.
Se agradece!
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."
Responder Con Cita
  #13  
Antiguo 27-06-2012
Jetzuvely21 Jetzuvely21 is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 22
Poder: 0
Jetzuvely21 Va por buen camino
Agrego solución.

Les comparto el código final, esperando que a alguien le sirva.

Código Delphi [-]
//Procedimiento para saber cuando el checkbox creado en tiempo de ejecución se marca
//y desmarca.
procedure TForm1.ClickLabels(Sender: TObject);
var
ACheck: TCheckBox;
a : string;
begin
  if (Sender is TCheckBox) then
  begin
    ACheck := TCheckBox(Sender);
    if ACheck.Checked  then
      ShowMessage(ACheck.Name + ' SI está seleccionado')
    else
      ShowMessage(ACheck.Name + ' NO está seleccionado');
  end;
end;

Y el error que tenia, del porque no me tomaba el tag... era por esta instrucción.

Código Delphi [-]
NewCheckBox.Parent := StringGrid1;La cual cambie por
NewCheckBox.Parent := Self;

Y pues la lectura de la BD para estos campos de tipo booleano, se asignan al StringGrid por posicion (x,y). Y se hace la respectiva validación if campo.AsBoolean = True then...'1' else '0'.

Saludos!
__________________
"El mejor alimento del alma, es la inspiración de uno mismo.."
Responder Con Cita
Respuesta



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
Campos Booleanos Raistlin Firebird e Interbase 4 26-08-2008 21:05:46
Campos Booleanos carinacarboni Firebird e Interbase 5 28-09-2004 21:36:49
Filtros y campos booleanos AdrianD Tablas planas 2 13-01-2004 21:28:51
Dbgrid Que Permita Checkbox Para Datos Booleanos SoftMakerMex OOP 4 19-12-2003 20:46:38
Campos booleanos Eduardo Firebird e Interbase 3 02-11-2003 22:11:20


La franja horaria es GMT +2. Ahora son las 00:42:05.


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