Показаны сообщения с ярлыком DBGrid. Показать все сообщения
Показаны сообщения с ярлыком DBGrid. Показать все сообщения

среда, 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;

[SQLite] Отображение данных SQLite в DBGrid (Способ 1)

После Delphi 7, не смог сразу отобразить данные из базы SQLite в DBGrid. Необходимы дополнительные манипуляции.
В проекте который я пишу, мне нужно просто просматривать данные из базы в виде таблицы. Сделаем это. Есть несколько способов.

Способ 1. Используем провайдер


На форме у нас есть уже

  • DBServer(TSQLConnection),
  • SQLQuery1(TSQLQuery).

Они связаны и настроены (см. Подключаемся к базе данных (Delphi XE3 + SQLite3)).
Кроме этого необходимо задать запрос на отображение всех данных. У свойства SQL компонента SQLQuery1 прописываем следующую строку
SELECT * FROM myBid;
<myBid> - имя таблицы в базе.
Устанавливаем свойство Active в True.

Кидаем на форму DBGrid. Как я уже писал, просто так не получится его прикрутить. Необходимо использовать провайдер. Для этого нам потребуется несколько компонентов:

  • DataSetProvider1(TDataSetProvider),
  • ClientDataSet1(TClientDataSet),
  • DateSource(TDateSource).

У DataSetProvider устанавливаем DataSet = SQLQuery1
У ClientDataSet1 устанавливаем ProviderName = DataSetProvider1, Active=True
У DataSource устанавливаем DataSet = ClientDataSet1
И наконец у DBGrid устанавливаем DataSource = DataSource1

Можно все сделать в дизайнере, сразу увидите результат. Единственное, что при изменении данных в базе, чтоб они изменились в таблице DBGrid (в режиме дизайнера) надо выключить и включить ClientDataSet1.

Связать можно и кодом, например в отдельной процедуре.

procedure LinkDBGridToBase;
begin
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Text :='SELECT * FROM '+TableOfBase;
  SQLQuery1.Open;

  DataSetProvider1.DataSet := SQLQuery1;
  ClientDataSet1.ProviderName := 'DataSetProvider1';
  ClientDataSet1.Active := true;
  DataSource1.DataSet := ClientDataSet1;
  DBGrid1.DataSource := DataSource1;
end;

Обратите внимание, ClientDataSet1.ProviderName является строковым параметром.

P.S. Если в полях отображается (WIDEMEMO), есть пару решений. См. Борьба с (WIDEMEMO) в DBGrid