Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Evento con una fila en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=71968)

verito_83mdq 21-01-2011 01:07:29

Evento con una fila en DBGrid
 
Holaa como andann?? La consulta es la siguiente tengo un TEdit al cual le ingreso el Apellido o nombre de la persona, por medio de una sentencia Sql like %% me muestra los apellido que se asemejen a la cadena que ingrese. La información me la muestra en un DBGrid conectado a un query. Cuando hago Clik en en DBGrig en la fila pintada esta me muestra información de si el cliente esta activo o rescindido. El problema es que si no hago Clik no me muestra esta información. Estuve buscando algún evento que sea cuando esta pintada la fila, pero no encontré . Sera posible esto?? Desde ya muchas gracias! Saludos!

Caral 21-01-2011 01:12:46

Hola
Tal vez no entiendo bien:
Dices 'Pintada', me imagino que es o cuando la recorres con las flechas o cuando la presionas con el raton.
Ten en cuenta que el dbgrid solo es un componente que muestra (un espejo) de lo que hay en el query.
Si recorres o quieres recorrer algo o lo haces en el dbgrid (visual) o lo haces en el dataset (tabla).
Cualquiera de los dos contiene el evento OnChange, se muestre o no, hara lo que necesitas.
Saludos

verito_83mdq 21-01-2011 02:20:13

Hoola Caral!! Claro cuando dije pintada me refería a recorrerla con las flechas y al posicionarme me muestra la info que te comentaba antes. Ahora bien, el evento OnChange no esta en el Dbgrig, vos que que lo ponga en el datasource? Se entiende un poco mas ahora?
Gracias como siempre.

Caral 21-01-2011 02:21:37

Hola
Ponlo en el Query, ahi te va a funcionar muy bien.
Saludos

verito_83mdq 21-01-2011 02:51:05

Andaaa Vos tenes la bola de cristal!!! Recién lo hice y funciona lo puse en el onchange del query, ahora puedo usar las fechas y ver el estado del cliente. Lo que si tengo miedo de que esto le genere mucho trafico al motor de mysql hacer tantas consultas al mover las flechas, que opinas?
Muchas gracias Caral!!

Caral 21-01-2011 02:52:13

Hola
No lo creo.
Saludos

verito_83mdq 21-01-2011 14:57:56

Hola Caral!! Tengo otro problema! :( El drama es el siguiente, los ZQuery y los TDataSource los tengo en un data module fuera de la unidad Buscar, el problema es que cuando pongo el evento onchange como ayer mencionabas me abre el datamodule hasta ahi todo bien, cuando
quiero escribir el cogido por ejem si el cliente este rescindido que me ponga la fuente de color rojo de los botones en el form Buscar ,este no me toma el color y me tira error.

Código Delphi [-]
procedure TQueryDataModule.ClienteDataSourceStateChange(Sender: TObject); 
begin 
              BuscarForm.DatosConyugeBitBtn.Font.Color:=clred; 
 
end;

Me arma la sintaxis perfecta pero cuando le quiero asignar en color no me lo toma, sera que no se puede hacer esto en un datamodule? El problema que si tengo que poner el Zquery en el Form Buscar tengo que modificar bastante el codigo del programa, porque todas las variables de las consultas las saco del DataModule. Espero que me hallas entendido, si me podes dar una mano te lo voy a agradecer!!
Saludos!

Aleca 21-01-2011 15:12:55

Código Delphi [-]
procedure TFormOrd_Cpra.DBGrillaOCDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  nEst, nImg: Byte;
  gCanvas: TCanvas;
begin
  if Column.Index = 0 then
  begin
    nEst := TDBGrid(Sender).DataSource.DataSet.FieldByName(_Est_Ped).AsInteger;
    gCanvas := TDBGrid(Sender).Canvas;
    case nEst of
      _Ingreso: nImg := 0;
      _Termino: nImg := 1;
      _Impreso: nImg := 2;
    else
      nImg := 3;
    end;
    ImgEstados.Draw(gCanvas, Rect.Left + 2, Rect.Top + 1, nImg);
  end;
con esta opción pongo una imagen según el estado.:)

jafera 21-01-2011 15:36:21

Creo que debes tener un campo con el estado del cliente.
Usa este valor para crear un if que compare y que haga la funcion de cambiar el color de la fuente.

Ej.

If estado = cerrado
boton.fuente.color := rojo
sino
boton.fuente.color := negro

Saludos

Josep

verito_83mdq 21-01-2011 15:39:38

Aleca como andas! Vos sabes que al principio había puesto el código en ese evento el drama es que tardaba mucho en cargar el grid con los datos, porque la búsqueda de clientes lo hago con un like entonces cuando en el buscador pongo la letra 'f' me aparecen 100 clientes y esto hace que se trabe el programa. Estaré haciendo algo mal?? Gracias!!!!

verito_83mdq 21-01-2011 15:41:49

Jose eso mismo tengo pasa que no puse el código pero lo tengo con un If a todas las observaciones del cliente. Saludos y gracias!!!!!!!!!!!!!!!!!!!!!!!:)

jafera 21-01-2011 15:47:08

Pues no se, yo tengo puesto en una de mis aplicaciones que si en un campo hay un valor X, entonces me ponga el fondo en color amarillo y la letra en rojo para que resalte y funciona perfectamente.

Igual si pones donde te lanza el error podemos ayudarte mejor.

En cuanto al like que dices que te traba, yo hago busquedas similares donde me devuelve mas de 100 registros y no se me bloquea.

Yo uso Firebird y IBX en Delphi 6

Saludos

Josep

verito_83mdq 21-01-2011 16:19:43

Jafera ahi lo puse otra vez en el evento DrawColumnCel y ahora anda fluido, ayer lo probé varias veces y se trababa todo. Si llega a andar así me ahorraría un montón de código. Lo que me hace es que a veces no me actualiza los estados de los clientes por ahí si un cliente esta activo pero vengo de un rescindido el que esta activo me lo marca como rescindido y viceversa, no se si te pasara esto a vos? Sera problema del código mio?

Código Delphi [-]
procedure TBuscarForm.ClientesDBGridDrawColumnCell(Sender: TObject; 
  const Rect: TRect; DataCol: Integer; Column: TColumn; 
  State: TGridDrawState); 
begin 
 
 
 
       if (gdSelected in State) then 
          begin 
           TDBGrid(sender).Canvas.Brush.Color:=$00E8D3B5; 
           TDBGrid(sender).DefaultDrawColumnCell(Rect,DataCol,Column,State); 
          end; 
 
 
 
 
           if QueryDataModule.ClienteZQuery.FieldByName('Baja').Value=1 then 
                  begin 
 
                     if QueryDataModule.ClienteZQuery.FieldByName('Conyuge').IsNull then 
                         DatosConyugeBitBtn.Visible:=false 
                     else 
                       begin 
                         DatosConyugeBitBtn.Visible:=QueryDataModule.ClienteZQuery.FieldByName('Conyuge').Value; 
                         DatosConyugeBitBtn.Font.Color:=clred; 
                       end; 
 
 
 
                     if QueryDataModule.ClienteZQuery.FieldByName('Observaciones_Check').IsNull then 
                         ObservacionesBitBtn.Visible:=false 
                     else 
                       begin 
                         ObservacionesBitBtn.Visible:=QueryDataModule.ClienteZQuery.FieldByName('Observaciones_Check').Value; 
                         ObservacionesBitBtn.Font.Color:=clred; 
                        end; 
 
 
                         BorrarBitBtn.Font.Color:=clRed; 
                         DatosClienteBitBtn.Font.Color:=clred; 
                         DatosVentaBitBtn.Font.Color:=clred; 
                         EstadoBitBtn.Font.Color:=clred; 
                         ExportarBitBtn.Font.Color:=clred; 
                         ImprimirBitBtn.Font.Color:=clred; 
                         UltimaModificacionBitBtn.Font.Color:=clred; 
                         PagosBitBtn.Font.Color:=clred; 
                         ContracargosBitBtn.Font.Color:=clred; 
                         TarjetasBitBtn.Font.Color:=clred; 
                         RescindirBitBtn.Font.Color:=clred; 
                         BitBtn1.Font.Color:=clred; 
                         BitBtn2.Font.Color:=clred; 
 
                  end 
 
                else 
 
                 begin 
                    // Si el cliente esta activo, pone botones en verde 
 
 
                    if QueryDataModule.ClienteZQuery.FieldByName('Conyuge').IsNull then 
                         DatosConyugeBitBtn.Visible:=false 
                    else 
                      begin 
                         DatosConyugeBitBtn.Visible:=QueryDataModule.ClienteZQuery.FieldByName('Conyuge').Value; 
                         DatosConyugeBitBtn.Font.Color:=clGreen; 
                      end; 
 
 
 
 
 
 
                      if QueryDataModule.ClienteZQuery.FieldByName('Observaciones_Check').IsNull then 
                         ObservacionesBitBtn.Visible:=false 
                     else 
                       begin 
                         ObservacionesBitBtn.Visible:=QueryDataModule.ClienteZQuery.FieldByName('Observaciones_Check').Value; 
                         ObservacionesBitBtn.Font.Color:=clGreen; 
                        end; 
 
 
 
                         DatosClienteBitBtn.Font.Color:=clGreen;; 
                         DatosVentaBitBtn.Font.Color:=clGreen; 
                         BorrarBitBtn.Font.Color:=clGreen; 
                         EstadoBitBtn.Font.Color:=clGreen; 
                         ExportarBitBtn.Font.Color:=clGreen; 
                         ImprimirBitBtn.Font.Color:=clGreen; 
                         UltimaModificacionBitBtn.Font.Color:=clGreen; 
                         PagosBitBtn.Font.Color:=clGreen; 
                         ContracargosBitBtn.Font.Color:=clGreen; 
                         TarjetasBitBtn.Font.Color:=clGreen; 
                         RescindirBitBtn.Font.Color:=clGreen; 
                         BitBtn1.Font.Color:=clGreen; 
                         BitBtn2.Font.Color:=clGreen; 
                  end; 
 
 
 
 
 
 
 
                         DatosClienteBitBtn.Visible:=True; 
                         DatosVentaBitBtn.Visible:=True; 
                         BorrarBitBtn.Visible:=True; 
                         EstadoBitBtn.Visible:=True; 
                         ExportarBitBtn.Visible:=True; 
                         ImprimirBitBtn.Visible:=True; 
                         UltimaModificacionBitBtn.Visible:=True; 
                         PagosBitBtn.Visible:=True; 
                         ContracargosBitBtn.Visible:=True; 
                         TarjetasBitBtn.Visible:=True; 
                         RescindirBitBtn.Visible:=True; 
                         BitBtn1.Visible:=True; 
                         BitBtn2.Visible:=True; 
 
 
 
 
end;



Ahi esta el procedimiento entero, Desde ya gracias por la ayuda a todos no solo a jafera, son todos muy amables.

jafera 21-01-2011 16:32:55

El campo observaciones_check que valores toma?

Pones algo de valor null, yo le asignaria siempre un valor 0-1, S-N y no trabajaria con null porque null no es nada.

Cuando tengo un campo chek yo por defecto le asigno siempre valor en el newrecord, esto me ahorra muchos problemas.

Tambien podrias dejar los botones siempre visibles pero ponerle enabled a false, no se lo digo sin ver el resultado que quieres conseguir con tu interface.

Hasta pronto

Josep

Aleca 22-01-2011 12:42:08

fijate este codigo (no lo pude probar)
Código Delphi [-]
procedure TBuscarForm.ClientesDBGridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
  cColor: TColor;
begin
  if State = [] then
    TDBGrid(sender).Canvas.Brush.Color := clWhite
  else
  begin
    TDBGrid(sender).Canvas.Brush.Color := $00E8D3B5;
    //Veo que esto lo haces x cada celda cuando no te cambia la info, lo haria para la primer celda nada más.
    if Column.Index = 0 then
    begin
      with QueryDataModule.ClienteZQuery do
      begin
        //por lo que vi la visibilidad depende del valor del campo y no si esta activo o no.
        if FieldByName('Conyuge').IsNull then //Aca coincido con jafera
          DatosConyugeBitBtn.Visible := false
        else
          DatosConyugeBitBtn.Visible := FieldByName('Conyuge').Value;

        if FieldByName('Observaciones_Check').IsNull then
          ObservacionesBitBtn.Visible:=false
        else
          ObservacionesBitBtn.Visible := FieldByName('Observaciones_Check').Value;

        if FieldByName('Baja').Value = 1 then
          cColor := clRed
        else
          // Si el cliente esta activo, pone botones en verde
          cColor := clGreen;

        DatosConyugeBitBtn.Font.Color := cColor;
        ObservacionesBitBtn.Font.Color := cColor;
        BorrarBitBtn.Font.Color := cColor;
        DatosClienteBitBtn.Font.Color := cColor;
        DatosVentaBitBtn.Font.Color := cColor;
        EstadoBitBtn.Font.Color := cColor;
        ExportarBitBtn.Font.Color := cColor;
        ImprimirBitBtn.Font.Color := cColor;
        UltimaModificacionBitBtn.Font.Color := cColor;
        PagosBitBtn.Font.Color := cColor;
        ContracargosBitBtn.Font.Color := cColor;
        TarjetasBitBtn.Font.Color := cColor;
        RescindirBitBtn.Font.Color := cColor;
        BitBtn1.Font.Color := cColor;
        BitBtn2.Font.Color := cColor;

        //Estos true no harian falta x que no veo que los pongas en falso
        DatosClienteBitBtn.Visible:=True;
        DatosVentaBitBtn.Visible:=True;
        BorrarBitBtn.Visible:=True;
        EstadoBitBtn.Visible:=True;
        ExportarBitBtn.Visible:=True;
        ImprimirBitBtn.Visible:=True;
        UltimaModificacionBitBtn.Visible:=True;
        PagosBitBtn.Visible:=True;
        ContracargosBitBtn.Visible:=True;
        TarjetasBitBtn.Visible:=True;
        RescindirBitBtn.Visible:=True;
        BitBtn1.Visible:=True;
        BitBtn2.Visible:=True;
        //se podria sacar.
      end;
    end;
  end;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
:)

verito_83mdq 22-01-2011 19:04:19

Aleca como andas?? Hace poco que estoy en esta comunidad y ya les tome aprecio, espero que con el tiempo yo también pueda dar una mano como hacen ustedes, recién estoy empezando en esto. Vos sabes que con el código que me pasaste pude arreglar el problema, le modifique algunas cosas que mencionaron ustedes salvo la ultima parte de los botones que los pongo en Visible:=True, eso es porque en el form create los oculto, y si no aparece el cliente también los oculto, es por eso.

Bueno a todos los que me ayudaron Aleca, Jafera,Caral, les digo gracias! Seguiré trabajando en en el programa, nunca les conté pero este trabajo es para un final de la facultad, no es para venderlo!
Saludos!


La franja horaria es GMT +2. Ahora son las 11:06:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi