Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problema en un DbGrid (https://www.clubdelphi.com/foros/showthread.php?t=16141)

fmonte 17-11-2004 16:46:02

problema en un DbGrid
 
hola Gente tengo un problema, con un campo Memo en un dbgrid. Me muestra la palabra MEMO en ves de mostrarme la informacion, y para solucionarlo no encontre otra manera q cambiar el tipo del campo a Texto y ponerlo de tamaño 255 en Access. Si tienen otra solucion mejor!!!
Volviendo a lo que habia hecho quiero solucionar el problema que tengo q me lo muestra todo seguido o sea tendria que poner el tamaño de la columna del dbgrid muy grande para que me muestre todo, yo quisiera saber si se puede hacer que se muestre en varias filas, mejor dicho como se fuera el componente Memo, pero en la columna del Dbgrid.
Desde ya muchas gracias.
Pancho

Neftali [Germán.Estévez] 17-11-2004 17:16:18

Cita:

Empezado por fmonte
Me muestra la palabra MEMO en ves de mostrarme la informacion

No es muy complicado hacer que se sustituya el contenido del memo por el texto (MEMO) que ves ahora; Para ello puedes utilizar el evento OnDrawColumnCell del DBGrid; Se lee el memo y se repinta la celda con el texto; También puedes eliminar los saltos de línea si te molestan para mostrar todo el memo seguido.

Aquí tienes un pequeño ejemplo de cómo hacerlo.

Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Str: string;
begin
  // es la columna de memo?
  if (Column.Index = 3) then begin
    // Comprobar quees un memo
    if Column.Field is TMemoField then begin
      // Acceso al memo (texto)
      Str := TBlobField(Column.Field).AsString;
      // Elimiar Saltos de carro y final de línea
      while Pos(#13, Str) > 0 do
        Str[Pos(#13, Str)] := ' ';
      while Pos(#10, Str) > 0 do
        Str[Pos(#10, Str)] := ' ';
      // Limpiar y dibujar el texto
      DbGrid1.Canvas.FillRect(Rect);
      DbGrid1.Canvas.TextOut(Rect.Left, Rect.Top, Str);
    end;
  end;
end;

fmonte 18-11-2004 13:09:58

Muchas Gracias, me sirvio para que se veo el memo, pero con respecto a eliminar los saltos de linea yo no queria, pero yo la informacion la tengo todo seguido, es decir sin salto de linea, pero yo quiero que si haya salto en linea porque no quiero que se vea todo junto pòrque es largo la informacion y se feo, o sea quiero como si yo pudiera ingresar en la celda un componente TMEMO y ahi mostrar la informacion asi se ve en varias lineas y es mas vistoso.
Muchas Gracias por su ayuda.
Pancho

roman 18-11-2004 21:02:50

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


La franja horaria es GMT +2. Ahora son las 18:08:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi