среда, 27 ноября 2013 г.

Борьба с (WIDEMEMO) в DBGrid

При попытке вывести данные из БД в DBGrid, есть одна проблема. Данные в DBGrid могут отображаться как (WIDEMEMO). Что бы это подправить надо внести изменения в одну из двух процедур отрисовки.

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
  Grid : TStringGrid;
  Texto : String;
  Rectangulo : TRect;
begin
  Rectangulo:=Rect;
  Grid := TStringGrid(Sender);
  if Field.IsBlob then begin
    Grid.Canvas.FillRect(Rect);
    Texto := Field.AsString;
    DrawText( Grid.Canvas.Handle,
                      PChar(Texto),
                      StrLen(PChar(Texto)),
                      Rectangulo,
                      DT_WORDBREAK);
    end;
end;

Или вот другой вариант

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if Assigned(Column) then
  begin
   DBGrid1.Canvas.FillRect(Rect);
   DBGrid1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, ' '+Column.Field.AsString);
  end;
end;

2 комментария:

  1. РЕШЕНИЕ, работает в Embarcadero Delphi.
    - есть компоненты: DBGrid1 <- DataSource1 <- ADOQuery1
    - в ADOQuery1.SQL вставлен запрос "SELECT a, b, a & b AS Name FROM tabble1;"
    - в результате в DBGrid1, поле "Name" содержит (WIDEMEMO)

    - ПКМ по ADOQuery1 -> Fields editor
    - ПКМ по окну Fields editor, выбираем Add all fields
    - выбираем поле "Name", заходим в его Events, и создаем событие OnGetText
    - вставляем в него одну строчку и в итоге поулучаем следующий код

    DelphiВыделить код
    1
    2
    3
    4
    procedure TForm1.ADOQuery1NameGetText(Sender: TField; var Text: string; DisplayText: Boolean);
    begin
    Text := Sender.AsString;
    end;

    ОтветитьУдалить
  2. с ADOTable работает таким же образом.

    ОтветитьУдалить