Lazarus: DBGrid показывает «(MEMO)» в качестве значения строковых полей в SQLite 3 - PullRequest
6 голосов
/ 26 января 2011

Я пытаюсь написать простое приложение SQLite 3, используя Lazarus и компоненты SQLdb.

Мне удалось подключиться к базе данных и заполнить TDBGrid.Проблема заключается в том, что все столбцы, являющиеся текстовыми полями, отображают значение «(MEMO)», а не строку в БД.

Ответы [ 6 ]

0 голосов
/ 23 января 2018

В довольно старой ветке форума я нашел подходящее мне решение (немецкий / английский):

SqLite, Zeos und keine Textanzeige, im DbGrid steht (MEMO) - Портал Zeoslib

Если вы измените типы полей в базе данных SQLite с text на varchar, текст отобразится, как ожидается, в TDBGrid.

изменение столбцов SQLite

Как вы, возможно, знаете, SQLite не позволяет вам изменять типы полей столбцов. Так что, если у вас уже есть ценные данные, хранящиеся в базе данных, используйте шаги, описанные в этом руководстве

SQLite ALTER TABLE и как преодолеть его ограничения

Вот еще один вариант

  • создать дамп (sqlite3 your.db .dump >your.sql)
  • изменить определения таблиц в результирующем sql (например, s/\<text\>/varchar/)
  • импорт в новую базу данных (sqlite3 your2.db <your.sql)
  • поменять имена старых и новых баз данных
0 голосов
/ 21 февраля 2017

У меня то же самое в MySQL и Tgrid, поэтому я надеюсь, что ответ такой же, как и довольно простой: -)

Скажите, если s - это поле, вызывающее проблему, то вместо записи

SELECT s

написать

SELECT LEFT(s,200) AS s 
0 голосов
/ 09 декабря 2014

Я забыл источник этого, но это то, что я делаю с мемо-полями в tdbgrid. bluish прав насчет события gettext, вот как его реализовать в коде:

Создайте класс с именем MemoDifier:

MemoDifier = class
  public
    procedure DBGridOnGetText(Sender: TField; var aText: string;
      DisplayText: boolean);
  end;                  

В разделе реализации вашего кода поместите это:

procedure MemoDifier.DBGridOnGetText(Sender: TField; var aText: string;
  DisplayText: boolean);
begin
  if (DisplayText) then
    aText := Sender.AsString;
end; 

Затем щелкните элемент управления tdbgrid в своей форме и в Инспектор объектов (Lazarus IDE) перейдите на вкладку События, прокрутите ниже, чтобы найти событие OnPrepareCanvas. Дважды щелкните по нему, чтобы сгенерировать код. Затем измените код в соответствии с вашими потребностями, например, именем вашего элемента управления tdbgrid:

procedure Tmainui.TDBGrid1PrepareCanvas(sender: TObject;
  DataCol: Integer; Column: TColumn; AState: TGridDrawState);
var
  MemoFieldReveal: MemoDifier;
begin
   if (DataCol = 1) then
   begin
     try
       TDBGrid1.Columns.Items[0].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
       TDBGrid1.Columns.Items[1].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
       TDBGrid1.Columns.Items[2].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
     except
       On E: Exception do
       begin
         ShowMessage('Exception caught : ' + E.Message);
       end;
     end;
   end;
end; 

Переменная MemoFieldReveal указывает на класс MemoDifier. Не забудьте изменить индекс (Items [x]), чтобы он указывал на ваш индексный номер элементов / полей tdbgrid, в котором отображается текст (MEMO).

0 голосов
/ 26 апреля 2012

Эта статья дает решение: Отображение и редактирование полей MEMO в TDBGrid Delphi .

Здесь я суммирую, что вы должны сделать:

  • в .dfm добавьте OnGetText = MyDataSetMyFieldGetText к TMemoField (здесь с именем MyField), принадлежащему вашему набору данных (например, TTable, здесь с именем MyDataSet)
  • в .pas> interface> type> внутри определения формы добавьте

    procedure MyDataSetMyFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
    
  • в .pas> implementation> добавить этот метод

    procedure TDM.WorkVisiteNoteGetText(Sender: TField; var Text: string; DisplayText: Boolean);
    begin
      Text := Copy(WorkVisiteNote.AsString, 1, 100);
    end;
    
0 голосов
/ 05 февраля 2011

Памятные поля не могут быть показаны в TDBGrid.Добавьте TDBMemo к форме и подключите его к тому же TDataSource.В этом случае вы увидите текст в своей записке.

0 голосов
/ 28 января 2011

Как сказано в IRC, вам, вероятно, нужно добавить поля формы в форму запроса (чтобы для них были созданы "полевые" компоненты), а затем реализовать событие TMemoField.GetText.

См.если при вводе поля «fields» в инспекторе объектов вызывается редактор для генерации компонентов (это происходит в Zeos iirc).

...