Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Campos en DBGrid que no pertenecen al DataSource (sin FieldName) (https://www.clubdelphi.com/foros/showthread.php?t=1203)

Sóstrato 06-06-2003 21:39:47

Campos en DBGrid que no pertenecen al DataSource (sin FieldName)
 
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:

Código:

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.


La franja horaria es GMT +2. Ahora son las 16:30: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