PDA

Ver la Versión Completa : iluminenme amigos


Memo6015
16-09-2008, 19:10:13
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

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 :D!!

se los agradezco mucho

Crandel
16-09-2008, 21:03:47
a lo mejor si me fumo un buen porro :D!!

se los agradezco mucho

Eso siempre ayuda a inspirarse :) no quiere decir que despues lo puedas llevar al codigo, pero que inspira ... inspira :D

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

.

Memo6015
16-09-2008, 22:08:40
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 :(

felipe88
16-09-2008, 22:43:20
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 :rolleyes: :D

Ana María
16-09-2008, 22:43:51
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.

//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;

felipe88
16-09-2008, 22:58:23
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 ;)

Caro
17-09-2008, 06:29:06
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.


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.


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

Memo6015
17-09-2008, 17:31:40
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

gatosoft
17-09-2008, 19:13:21
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:

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,