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 16-09-2008
Memo6015 Memo6015 is offline
Miembro
 
Registrado: ago 2008
Posts: 35
Poder: 0
Memo6015 Va por buen camino
Talking iluminenme amigos

hola amigos de club delphi, necesito que me den algunas ideas la verdad es que soy bastante novato con delphi y solo he aprendido a crear consultas a bases de datos y ponerlas en dbgrid pero lo que necesito ahora es diferente

lo que pasa es que tengo el siguiente form

http://img369.imageshack.us/my.php?image=formsi9.jpg

como pueden ver es sobre una venta de un plato de comida, el problema que tengo es cuando una persona vende un plato, este puede ser devuelto por algunas razones

se le puede cambair algun producto, o se le puede quitar algun producto ( con producto em refiero a ingredientes)

muchas veces le pasa a la persona que vende que la gente le cambia las cosas por ejemplo piden pollo con papas y las papas las deciden cambiar por alguna ensalada me comprenden???

ok, la cosa es que yo quiero hacer que cuando la persona que vende y le devuelven para que cambie me gustaria hacer que el tipo haga doble click en uno de los productos de la grilla y esta cambie de color

tengo el codigo

para que cambie de color
Código Delphi [-]
 
procedure TF_VentaPlato.DBG_DetallesPlatoOnDrawColumns(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if Column.Field.Dataset.FieldbyName('Cantidad').AsInteger = 0 then
begin
DBG_DetallesPlato.Canvas.Font.Style := DBG_DetallesPlato.Canvas.Font.Style + [fsBold];
DBG_DetallesPlato.Canvas.Brush.Color := clRed;{Al cumplirse la condicion cambias el
color a rojo}
DBG_DetallesPlato.Canvas.FillRect(Rect);
State := [gdSelected, gdFocused];
DBG_DetallesPlato.DefaultDrawColumnCell(Rect,DataCol,Column,State);
 
end;
end;
ese codigo me cambia de color una fila completa pero como ven la condicion es cuando en la columna cantidad una de las cantidades sea 0 lo hice asi para probar pero lei que este no se pinta hasta que se redibuje el dbgrid de nuevo
(ojo la condicion la puse solo para probar)

como le hago pa cuando le haga doble click en la grilla en uno de los productos este cambie de color??... eso si, si le hago doble click a Almejas
cambie la fila de color, si le hago doble clik a otra mas cambie tambien de color me comprenden??? que se vayan pintando a medida que les vaya haciendo doble click, revise el foro con el buscador pero no encontre a lo mejor no busque bien

se que no debe ser muy dificil pero no se que me pasa hoy no puedo pensar bien, denme una ayudita amigos no pido que me hagan todo uds solo una iluminada

a lo mejor si me fumo un buen porro !!

se los agradezco mucho

Última edición por marcoszorrilla fecha: 16-09-2008 a las 20:13:59.
Responder Con Cita
  #2  
Antiguo 16-09-2008
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Cita:
Empezado por Memo6015 Ver Mensaje
a lo mejor si me fumo un buen porro !!

se los agradezco mucho
Eso siempre ayuda a inspirarse no quiere decir que despues lo puedas llevar al codigo, pero que inspira ... inspira

Llendo a tu problema, lo que podrias hacer es modificar de acuerdo al doble click un campo de ese fila, por ejemplo que cambie de un valor 0 a 1 e inversamente.

Luego pintas de otro color todos las filas que tengan en ese campo el valor 1.

Ahora tendras que buscar otro problema para poder fumarte el porrito

.
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 16-09-2008
Memo6015 Memo6015 is offline
Miembro
 
Registrado: ago 2008
Posts: 35
Poder: 0
Memo6015 Va por buen camino
jejejjeje si de que inspira inspira

con el codigo del drawcolumns tengo pa pintar la fila del dbgrid pero
me falta la condicion del doble click

debo decirle al programa algo asi como

si el usuario hace doble click en uno de los productos de la grilla entonces colorea la fila entera

pero no se como
Responder Con Cita
  #4  
Antiguo 16-09-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 18
felipe88 Va por buen camino
OnCellClick tal vez pueda ayudarte... en realidad tu idea no parece tan complicada a simple vista, solo necesita un poco de codigo que tal vez lo haga en cierto modo, molesto
__________________
Web
Responder Con Cita
  #5  
Antiguo 16-09-2008
Avatar de Ana María
Ana María Ana María is offline
Miembro
 
Registrado: ago 2008
Posts: 40
Poder: 0
Ana María Va por buen camino
Hola, el primer bloque de código que pongo acontinuación cambia a rojo el color de la fuente de acuerdo a ala condición que le pongas.

Para el segundo bloque necestitas agregar 2 TImage con los nombres MiFoto1 y MiFoto2 y colocar su propiedad visible a False, cargar en ellas imagenes propias para lo que necesites expresar. Al DBGrid deberás agregar una nueva columna (con el editor de columnas) dejando vacía la propiedad FieldName, lo que hará será dibujar las imágenes de las TImages en la nueva columna.

Para los dos casos deberás interceptar el evento OnDrawColumnCell del DBGrid.

Espero te sirvan de algo.

Código Delphi [-]
//caso  1

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if MiCondicion then
TDBgrid(Sender).Canvas.Font.Color := clRed;
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;



//caso2

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with sender as TDBGrid do
if Column.FieldName <> '' then // Busca las columnas con campos asociados
 DefaultDrawColumnCell(Rect,DataCol,Column,State)//y no dibuja nada
 else
 if Condicion1 then // De acuerdo a la condicón
 canvas.StretchDraw(Rect,MiFoto1.Picture.Graphic)// dibuja algo
 else
  canvas.StretchDraw(Rect,MiFoto2.Picture.Graphic)// de lo contrario dibuja otra cosa
end;
Responder Con Cita
  #6  
Antiguo 16-09-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 18
felipe88 Va por buen camino
Hola,
Oportuno ejemplo compañera Ana Maria, creo que es una de las explicaciones mas simples y prácticas con las que Memo6015 podrá adaptar a su necesidad; planteadas tambien en La Cara Oculta
__________________
Web
Responder Con Cita
  #7  
Antiguo 17-09-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola, creo que el problema que tiene el amigo no es en el pintado ya que su codigo funciona sino en colocar la condición y que cuando se haga doble click sobre un registro del se pinte.

Como te dijo Crandel necesitas un campo que te haga de condición y que maneje los valores que necesitas, talvez sería bueno que aumentes un campo Estado donde 1 signifique activo y 0 No activo, los que tengas con 0 los pintas del color que quieras, ahora en el evento dobleClick del DbGrid tendrías que modificar el valor de 1 a 0 o de 0 a 1, una vez que se refresque nuevamente el DBGrid con los cambios que acabas de hacer se activara nuevamente el evento OnDrawColumnCell para hacer el repintado.

Código Delphi [-]
procedure TForm1.DBGridDblClick(Sender: TObject);
var
 codigo : String;
begin
 Query.Close;
 Case QueryDBGrid.FieldByName('estado').AsInteger Of
  0 : Query.SQL.Text := 'Update tabla set estado=1 '+
                                 'where codigo='+QueryDBGrid.FieldByName('codigo').AsInteger;
  1:  Query.SQL.Text := 'Update tabla set estado=0 where '+
                                 'codigo='+QueryDBGrid.FieldByName('codigo').AsInteger;
 end;  
 Query.ExecSQL;
 
 QueryDBGrid.Close;
 QueryDBGrid.SQL.Text := 'select * from tabla';
 QueryDBGrid.Open;
end;

Y despues como ya te han indicado preguntarías por ese campo estado.

Código Delphi [-]
procedure TF_VentaPlato.DBG_DetallesPlatoOnDrawColumns(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn;State: TGridDrawState);
begin
 if QueryDBGrid.FieldbyName('estado').AsInteger = 0 then
  begin
   DBG_DetallesPlato.Canvas.Font.Style := DBG_DetallesPlato.Canvas.Font.Style + [fsBold];
   DBG_DetallesPlato.Canvas.Brush.Color := clRed;
   DBG_DetallesPlato.Canvas.FillRect(Rect);
State := [gdSelected, gdFocused];

DBG_DetallesPlato.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 17-09-2008
Memo6015 Memo6015 is offline
Miembro
 
Registrado: ago 2008
Posts: 35
Poder: 0
Memo6015 Va por buen camino
genial, si ese es mi problema la condicion como lo puse el pintado lo hace la cosa es como decirle al programa que pinte cuando le haga doble click, programe ese evento y llamo al procedimiento drawcolumns pero me empieza a pintar todo xDDDD

ok amigo mirare tu codigo y les digo que tal

muchas gracias por la ayuda
Responder Con Cita
  #9  
Antiguo 17-09-2008
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Hola Memo... Creo haber tenido el mismo problema.... Tu das DobleClick en la grilla pero el color no cambia inmediatamente... Cierto?

Pues en tu caso yo lo resolvería poniendo en el evento OnDblClick la sentencia:

Código:
DBGrid1.Repaint;
Este a su vez llama al OnDrawColumGrid y hace el trabajo de pintura... Obviamente para que te coloree la casilla, debes cambiar la condición en la grilla o tabla antes de llamar al RePaint...

Bueno otra técnica para lograr un repaint es llamar al método INVALIDATE:

<TControl>.Invalidate;

Este se aplica bastante cuando estas creando tus propios componentes... Si algo ha cambiado en el componente tu puedes llamr al Invalidate en lugar de esperar que Windows lo haga cuando detecte un cambio...

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
Hola amigos Caral La Taberna 30 09-03-2008 16:36:12
S.O.S amigos programadores karlaoax La Taberna 19 19-10-2007 19:59:28
Para mis amigos los come uña jhonny La Taberna 8 11-05-2007 04:57:35
Hola amigos... DB-ADO Conexión con bases de datos 5 01-03-2005 14:30:54
Reencuentro de dos amigos. marcoszorrilla Humor 0 09-05-2004 00:38:01


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


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