PDA

Ver la Versión Completa : Campos en DBGrid que no pertenecen al DataSource (sin FieldName)


Sóstrato
06-06-2003, 21:39:47
Hola a todos!,
tengo dos campos (columns) que no tienen FieldName porque pretendo que tomen valor de un mismo campo dependiendo si este es positivo o negativo. Mi preguntas es, como le asigno esos valores a las columnas del DBGrid que no tienen FieldName?.

andres1569
06-06-2003, 22:15:03
Una opción es asignar el FielName a ambas columnas y ocultar la aparición del valor interceptando el evento OnDrawColumnCell del DBGrid. Aquí va un ejemplito:


procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Column.Field.FieldName = 'SubTotal' then
with DBGrid1.Canvas do
begin
if gdSelected in State then Brush.Color := clHighLight
else Brush.Color := clWhite;
if ((Column.Field.AsCurrency >= 0) AND (Column.Index = 7)) OR
((Column.Field.AsCurrency < 0) AND (Column.Index = 8)) then
FillRect (Rect);
end;
end;


En este ejemplo, Column.Index te sirve para saber de qué columna se trata en cada caso. Si se cumple la condición se pinta el fondo de dicha celda y aparece en "blanco".

Sóstrato
06-06-2003, 22:28:04
Muy bien... excelente!...
perdona la ignorancia, pero... en estos campos tengo que aceptar valores!... debo protejer uno de ellos (el mismo FieldName) al momento de aceptar valores... como manejaria esto?

andres1569
06-06-2003, 22:48:30
Ufff!! Eso es harina de otro costal.

Puesto que las dos columnas apuntan al mismo campo, ¿no te parece suficiente que puedan escribir en ambas indistintamente? En el momento que graben el dato, desaparecerá de la columna correspondiente. Pruébalo a ver si te sirve.

Sóstrato
06-06-2003, 22:58:05
OK, hare lo siguiente, en el Onvalidate del campo que esta siendo utilizado en las dos columnas controlare el valor positivo o negativo introducido.

Gracias mi hermano.

andres1569
06-06-2003, 23:08:50
Hola de nuevo:

No creo que se trate de controlar el evento OnValidate del campo en cuestión, puesto que eso es actuar a nivel de Tabla, y lo otro es a nivel de DBGrid, deben separarse ambas cosas y supongo que la tabla la tienes en un DataModule y el DBGrid en un Form. Además, lo que hicieras en el OnValidate ¿cómo repercutiría en la visualización del DBGrid si ambas columnas apuntan al mismo campo?

Sóstrato
06-06-2003, 23:19:53
Tienes toda la razon, solo queda una solucion... usar una sola columna con su FieldName. Parece ser quien diseño la tabla desarrollaba en cobol y quiso ahorarce un campo. Creo un campo Monto si es negativo es credito y positivo es debito.

andres1569
06-06-2003, 23:45:36
Hola:

Aquí les llamamos Debe y Haber y en mi caso los implementé como campos separados; ahí sí intercepto el evento OnChange de cada uno, si el usuario llena un valor, el valor del otro campo se pone a NULL, puesto que no se admiten dos valores simultaneos en ambos campos.