Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-11-2011
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
Color en dbgird en funcion a una variable

Buenas amigos del foro ,
Ya busque en el foro y en la web pero no encontre el problema que tengo,
Les explico , tengo un dbgrid asociado a un query , en la cual mestro dos campos
Lo que quiero hacer es:registrar el valor del campo dos del query por medio de un edit y qye al hacer click o en el evento del edit, se pinte de un color determinado la fila del dbgrid en el cual ese campo es igual al que registro en el edit
Si bien hay eventos en el dbgrid nose como hacer para cambiar los colores de las filas en funcion a valores registrados por un edit
Les explico con mayor detalle , tengo un query de oficinas con dos campos nombre y codigo, este query ya esta asociado a un dbgrid.
LO que quiero es registrar en un edit un codigo de oficina y si ese codigo esta en el grid que se pinte de un determinado color en un determinado tiempo ademas de emitir sonido
MUchas gracias amigos espero haber sido comprendido , estare atento a sus post, mil gracias
Responder Con Cita
  #2  
Antiguo 02-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Choclito.

Se me ocurren dos formas ahora.

Con un TButton podrías hacer:
Código Delphi [-]
...
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdSelected in State) and FPintar then
    with (Sender as TDBGrid) do
    begin
      Canvas.Brush.Color:= clRed;
      Canvas.Font.Color:= clWhite;
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
      MessageBeep(MB_OK);  // Beep
      FPintar:= False;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FPintar:= True;  // variable privada a TForm1
  DBGrid1.Invalidate;
end;

Con un TCheckBox, para que quede el pintado activo según la propiedad Checked:
Código Delphi [-]
...
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdSelected in State) and CheckBox1.Checked then
    with (Sender as TDBGrid) do
    begin
      Canvas.Brush.Color:= clRed;
      Canvas.Font.Color:= clWhite;
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
      MessageBeep(MB_OK);  //Beep
    end;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  DBGrid1.Invalidate;
end;

Un saludo.

Edito: Se me olvidaba el sonido...
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 02-11-2011 a las 01:46:57. Razón: Agregar código de sonido.
Responder Con Cita
  #3  
Antiguo 02-11-2011
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
falta algo

gracias por el aporte ecfisa;
El codigo que me brindaste lo cambie pero no hace nada el codigo cambiado es el sgte;
Código Delphi [-]
procedure TF_Principal.JvDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if ((gdSelected in State) and (FPintar<>'')) then
    with (Sender as TjvDBGrid) do
    begin
     if mdoq_listado.FieldByName('codigo').AsString=fpintar then
 begin
      Canvas.Brush.Color:= clblue;
      Canvas.Font.Color:= clWhite;
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
      FPintar:='';
      end;
    end;
y en el boton:
Código Delphi [-]
procedure TF_Principal.Button2Click(Sender: TObject);
var i:integer;
begin
FPintar:= edit1.Text;  // variable privada a TForm1
  jvDBGrid1.Invalidate;
end;
Como se ve lo que quisiera es que registrando en un edit el codigo de una de las oficinas que se busque en el dbgrid y se pinte la fila en un tiempo determinado y emitiendo un sonido
Gracias amigo por los aportes
Responder Con Cita
  #4  
Antiguo 02-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Choclito.

Cita:
El codigo que me brindaste lo cambie pero no hace nada
Debe ser por el componente TjVDBGrid, ya que el código estaba probado y funciona correctamente con un TDBGrid.

Cita:
Como se ve lo que quisiera es que registrando en un edit el codigo de una de las oficinas que se busque en el dbgrid y se pinte la fila en un tiempo determinado y emitiendo un sonido
Entonces el planteo ha cambiado, ahora se hace innecesaria la variable FPintar ya que se puede evaluar el contenido de Edit1.Text.

Te pongo un ejemplo con busqueda incremental:
Código Delphi [-]
...
implementation

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdSelected in State) and (Edit1.Text > '') then
    with (Sender as TDBGrid) do
    begin
      Canvas.Brush.Color:= clRed;
      Canvas.Font.Color:= clWhite;
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
      MessageBeep(MB_OK);
    end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  with Query1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM TU_TABLA ');   // reemplazá TU_TABLA  por el nombre de la tabla
    SQL.Add('WHERE CODIGO LIKE :FOUND ');
    ParamByName('FOUND').AsString:= Edit1.Text+'%';
    Open;
  end;
end;

Y otro que hace el posicionamiento ante el evento OnClick de un TButton:
Código Delphi [-]
...
implementation

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdSelected in State) and (Edit1.Text > '') then
    with (Sender as TDBGrid) do
    begin
      Canvas.Brush.Color:= clRed;
      Canvas.Font.Color:= clWhite;
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
      MessageBeep(MB_OK);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Locate(CODIGO', Edit1.Text,[]);
  DBGrid1.Invalidate;
end;

Pero como te comento no uso los mismos componentes...


Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 02-11-2011
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
consultando

Muchas gracias por el aporte lo probare con un dbgrid normal y ya te comento,
Entiendo que el codigo hace un filtrado de los datos en funcion al dato registrado en el edit(sin probar en delphi)
lo que quisiera es lo siguiente :
grilla con los siguientes datos asociado al query
Nombre Codigo
ADMINISTRACION C1
ESTADISTICA C2
GERENCIA C3
ESTADISTICA C4


Entonces en el edit.text colocar C3
y que pinte la tercera fila de cualquier color.
Lo voy a probar el codigo que me mostraste, gracias
Responder Con Cita
  #6  
Antiguo 02-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Entonces creo que buscas algo como el segundo ejemplo del mensaje anterior:
Código Delphi [-]
...
implementation

var
  Valor: string = '';

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Query1.FieldByName('Codigo').AsString = Valor then
    DBGrid1.Canvas.Brush.Color:= clLime;  // el color de tu gusto
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
   Valor:= Trim(Edit1.Text);
   if Query1.Locate('Codigo', Edit1.Text, []) then
     MessageBeep(MB_OK);
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 02-11-2011
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
lo que se queria

Muchas gracias ecfisa es justo lo que necesitava
Pero siguiendo con mi problema como puedo hacer para que esa seleccion parpadee en un tiempo determinado, entiendo que tengo que utilizar un timer pero la verdad nose por donde empezar.
Lo que quisiera es registrar el dato del codigo en el edit y luego que la fila donde este ese codgio en el grid parpadee con un color determinado y emita un sonido en un tiempo de 30 seg por ejemplo.
Estare buscando en la web,nuevamente gracias ecfisa, y estare atento a los comentarios del foro.
Responder Con Cita
  #8  
Antiguo 02-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Choclito.

Proba este código a ver si hace lo que estas buscando:
Código Delphi [-]
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  // variables privadas a Form1
  FValor:= '';
  FBlink:= False;
  // Timers
  TimerBlink.Interval:= 200; // velocidad de parpadeo
  TimerSound.Interval:= 30000; // Beep cada 30 seg.
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  CBLNK: array[0..1] of TColor = (clLime, clWhite); 
begin
  if Query1.FieldByName('Codigo').AsString = FValor then
    DBGrid1.Canvas.Brush.Color:= CBLNK[Integer(FBlink)];
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FValor:= Trim(Edit1.Text);
  Query1.Locate('Codigo', Edit1.Text, [])
end;

procedure TForm1.TimerBlinkTimer(Sender: TObject);
begin
  FBlink:= not FBlink;
  DBgrid1.Invalidate;
end;

procedure TForm1.TimerSoundTimer(Sender: TObject);
begin
  MessageBeep(MB_OK);
end;
...

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 02-11-2011
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
todo bien

gracias ecfisa muestra como quiero pero quisiera que de sonido y parpadee durante un tiempo deternimado con los dos timer da sonido y parpadeo de manera ilimitada, pero como hacer para que durante un tiempo determinado solamente las dos cosas , no se talves ni bien salgo del edit solo los proximos 30 o 45 seg
Espero respuestas, yo tambien vere con todo como lo soluciono, si lo soluciono muestro el codigo , gracias
Responder Con Cita
  #10  
Antiguo 02-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Añadí un tercer TTimer para espaciar el sonido, si no los usuarios te van a odiar

Código Delphi [-]
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  FValor:= '';
  FBlink:= False;
  // Timers
  TimerBlink.Interval:= 200; // velocidad de parpadeo
  TimerBlink.Enabled:= False;
  TimerBeep.Interval:= 2000; // 1 Beep c/ 2seg
  TimerBeep.Enabled:= False;
  TimerOff.Interval:= 30000; // Beep durante 30 segundos
  TimerOff.Enabled:= False;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  CBLNK: array[0..1] of TColor = (clLime, clWhite);
begin
  if Query1.FieldByName('Codigo').AsString = FValor then
    DBGrid1.Canvas.Brush.Color:= CBLNK[Integer(FBlink)];
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FValor:= Trim(Edit1.Text);
  Query1.Locate('Codigo', Edit1.Text, []);
  TimerBlink.Enabled:= True;
  TimerBeep.Enabled:= True;
  TimerOff.Enabled:= True;
end;

procedure TForm1.TimerBlinkTimer(Sender: TObject);
begin
  FBlink:= not FBlink;
  DBgrid1.Invalidate;
end;

procedure TForm1.TimerBeepTimer(Sender: TObject);
begin
  Beep;
end;

procedure TForm1.TimerOffTimer(Sender: TObject);
begin
  TimerBlink.Enabled:= False;
  TimerBeep.Enabled:= False;
  TimerOff.Enabled:= False;
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 02-11-2011
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
Otra alternativa

Gracias por la alternativa ,lo voy a probar ,pero tengo otra alternativa pues no se si es adecuada pero hasta donde veo da
el codigo es:
Código Delphi [-]
procedure TF_Principal.TimerBlinkTimer(Sender: TObject);
begin
//p variable privada 
 p:=p+1;
  FBlink:= not FBlink;
  DBgrid1.Invalidate;
  //p:=p+1;
  if p=50  then
TimerBlink.Enabled:=FALSE;
end;

y el otro timer este:
Código Delphi [-]
procedure TF_Principal.TimerSoundTimer(Sender: TObject);
VAR I:INTEGER;
begin
 M:=M+1;
 IF M MOD 5 =0 THEN
  MessageBeep(MB_OK);
   if M=20  then
TimerSound.Enabled:=FALSE;
end;


en el onexit del edit tengo
Código Delphi [-]
    P:=0;
     M:=0;
  TimerBlink.Enabled:=TRUE;
  TimerSound.Enabled:=TRUE;
      FValor:= Trim(Edit1.Text);
  mdoq_listado.Locate('Codigo', Edit1.Text, [])
el intervalo de los dos timer es de 200 y 300 y bueno ahi da, nose pero si seria lo mas correcto, el codigo de ecfisa lo probare , gracias , saludos
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
Funcion cambiar propiedades componente(variable) Dclase Varios 7 17-06-2011 13:37:48
Variable con color? jam888 Varios 2 06-04-2006 02:24:03
Llamar a una funcion almacenandola en una variable papulo Varios 15 02-02-2006 18:19:25
Llamada a una funcion que incluye en el nombre una variable papulo PHP 11 28-12-2005 16:38:19
Salir de un dbgird con el tabulador aram2r OOP 4 28-05-2004 18:12:00


La franja horaria es GMT +2. Ahora son las 08:12:08.


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