Ver Mensaje Individual
  #4  
Antiguo 18-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por fmonte
ahi mostrar la informacion asi se ve en varias lineas y es mas vistoso.
Bueno pero, ¿te has fijado cuántas líneas caben en una fila de un DBGrid?

Para poder mostrar varias líneas tendrías que comenzar alterando la altura de las filas, pero las propiedades DefaultRowHeight y RowHeights del DBGrid están protegidas. Puedes usar el truco desprotección:

Código Delphi [-]
type
  THackGrid = class(TDBGrid);

...

THackGrid(DBGrid1).DefaultRowHeight := 100;
THackGrid(DBGrid1).RowHeight[0] := 17; // fila de títulos

pero la componente tiende a volver a sus dimensiones normales cuando mueves columnas o cambias el ancho de alguna de ellas (y quizá en otras situaciones).

Esto lo puedes solventar usando mejor un derivado de TDBGrid en el que redefinas los métodos ColumnMoved y ColWidthsChanged:

Código Delphi [-]
procedure TMiDBGrid.ColumnMoved(FromIndex, ToIndex: Integer);
begin
  inherited;

  DefaultRowHeight := 100;
  RowHeights[0] := 17;
end;

procedure TMiDBGrid.ColWidthsChanged;
begin
  inherited;

  DefaultRowHeight := 100;
  RowHeights[0] := 17;
end;

Haciendo esto puedes entonces usar el evento OnDrawColumnCell como te indica Neftali pero usando una función de escritura que me parece no viene en el objeto Canvas:

Código Delphi [-]
procedure TForm1.MiDBGrid1DrawColumnCell(
  Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  MemoText: String;
  MemoRect: TRect;

begin
  if Column.FieldName = 'Code' then
  begin
    (Sender as TDBGrid).Canvas.FillRect(Rect);
    MemoText := Column.Field.AsString;
    MemoRect := Rect;
    InflateRect(MemoRect, -2, -2);
    Windows.DrawText(
      (Sender as TDBGrid).Canvas.Handle,
      PChar(MemoText),
      -1,
      MemoRect,
      DT_WORDBREAK
    );
  end
  else
    (Sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Pero aún así te quedan varios problemas.
  • No puedes editar el texto directamente
  • En los registros con texto muy largo, puede no caber en la fila y no hay manera sencilla de colocar barras de desplazamiento.

A final de cuentas quizá lo más adecuado sea buscar alguna componente que maneje todas estas situaciones. También puedes optar por un TDBCtrlGrid que sí te permitirá mostrar mútiples registros con un TDBMemo en cada uno.

// Saludos

Última edición por roman fecha: 18-11-2004 a las 21:06:13.
Responder Con Cita