Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Color en dbgird en funcion a una variable (https://www.clubdelphi.com/foros/showthread.php?t=76447)

Choclito 02-11-2011 01:33:47

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

ecfisa 02-11-2011 01:35:44

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... ;)

Choclito 02-11-2011 02:02:53

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

ecfisa 02-11-2011 02:50:34

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.

Choclito 02-11-2011 04:11:38

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

ecfisa 02-11-2011 08:00:48

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.

Choclito 02-11-2011 13:51:59

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.

ecfisa 02-11-2011 14:20:14

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.

Choclito 02-11-2011 15:09:40

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

ecfisa 02-11-2011 15:57:46

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.

Choclito 02-11-2011 16:14:09

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


La franja horaria es GMT +2. Ahora son las 18:37:36.

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