Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Campos booleanos en StringGrid con CheckBox (https://www.clubdelphi.com/foros/showthread.php?t=79300)

Jetzuvely21 23-06-2012 00:46:56

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.

:confused::confused::confused:

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

Gracias por el interés, saluditos!

newtron 23-06-2012 08:50:19

Hola.

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

Saludos

Jetzuvely21 25-06-2012 19:26:37

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!

Jetzuvely21 26-06-2012 00:26:19

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!

newtron 26-06-2012 09:19:34

Hola.

Mira ahora este hilo a ver si te sirve.

(me está entrando complejo de índice :D)

Saludos

Casimiro Notevi 26-06-2012 10:15:15

Cita:

Empezado por newtron (Mensaje 436022)
Hola.
Mira ahora este hilo a ver si te sirve.
(me está entrando complejo de índice :D)
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 :D:D:D

Qué malo soy para los chistes :D

newtron 26-06-2012 10:29:37

Cita:

Empezado por Casimiro Notevi (Mensaje 436027)
Qué malo soy para los chistes :D

Pues la verdad es que no te veo en el club de la comedia. :p

TiammatMX 26-06-2012 16:51:14

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.

Jetzuvely21 26-06-2012 16:53:02

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.. :(

Jetzuvely21 26-06-2012 17:02:18

Gracias tiammat
 
:D 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.

Jetzuvely21 26-06-2012 17:53:45

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 :D....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;

Jetzuvely21 26-06-2012 22:59:13

Una pregunta mas...
 
Bueno, ya he logrado resolver mi duda, gracias a quienes prestaron interés y contestaron.
Se agradece! :D

Jetzuvely21 27-06-2012 17:48:47

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!


La franja horaria es GMT +2. Ahora son las 04:14:00.

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