Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   mostrar si o no según valor booleano (https://www.clubdelphi.com/foros/showthread.php?t=90876)

LACV 25-09-2016 00:20:34

mostrar si o no según valor booleano
 
buenas tardes lo que sucede es que tengo un campo con valor booleano y estoy mostrando los datos en un dbgrid pero no quiero que aparezca 0 ni 1 en la tabla como hago para que cuando se 0 muestre no y cuando sea 1 muestre si:( les agradezco de antemano.

BDWONG 25-09-2016 02:57:19

Hola puedes hacer una función que pida por parámetro un booleano y retorne SI o NO
Código Delphi [-]
function BoolToStr(v:Boolean):string;
begin
  if v then Result:='SI'
  else Result:='N0';
end;

begin
   Writeln(BoolToStr(FALSE));
   Writeln(BoolToStr(TRUE));
   Readln;
end.

AgustinOrtu 25-09-2016 04:08:39

Si pero eso no alcanza. Tiene que usar OwnerDraw y decirle al DBGrid que cuando toque el campo booleano, el valor lo obtenga llamando a esa funcion

No me acuerdo exactamente de los nombres, pero basicamente agregas un manejador a un evento de los que pintan (para el DBGrid deberia ser DrawColumCell) y le dices que pinte todas por defecto, usando el metodo DefaultDrawCollumnCell menos la columna que queres que salga "SI/NO"; para esa columna, usas una funcion como la de BDWONG

Si buscas por el foro ya fue contestado varias veces

ecfisa 25-09-2016 08:17:32

Hola LACV.

Dos opciones, una usando el evento OnDrawColumnCell:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  SINO : array[0..1] of String = ('NO', 'SI');
var
  gr: TDBGrid;
  R : TRect;
  sw: LongWord;
begin
  if Column.FieldName = 'Campo_0_1' then
  begin
    case Column.Alignment of
      taLeftJustify  : sw := sw or DT_LEFT;
      taRightJustify : sw := sw or DT_RIGHT;
      taCenter       : sw := sw or DT_CENTER;
    end;
    R := Rect;
    gr := TDBGrid(Sender);
    gr.Canvas.FillRect(R);
    DrawText(gr.Canvas.Handle, PChar(SINO[Column.Field.AsInteger]), -1, R, sw);
  end;
end;

Otra usando el evento OnGetText del campo en cuestión:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);  {1}
begin
  DataSet.FieldByName('Campo_0_1').OnGetText := DataSetCampo_0_1GetText;
end;

procedure TForm1.DataSetCampo_0_1GetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
const
  SINO : array[0..1] of String = ('NO', 'SI');
var
  v: Integer;
begin
  v := TField(Sender).AsInteger;
  if v in [0, 1] then
    Text := SINO[TField(Sender).AsInteger];
end;

...

procedure TForm1.FormDestroy(Sender: TObject); {2}
begin
  DataSet.FieldByName('Campo_0_1').OnGetText := nil;
end;
("Campo_0_1" sería el nombre del campo de tu tabla que almacena los valores enteros 0 y 1)

En la segunda opción podes ahorrarte los eventos {1} y {2} (y su código) si en tiempo de diseño creas los campos persistentes en el DataSet y asignas el evento OnGetText al campo desde el Object Inspector.

Saludos :)


La franja horaria es GMT +2. Ahora son las 10:50:14.

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