Lazarus:DBGrid显示“(MEMO)”作为SQLite 3中字符串字段的值

时间:2011-01-26 19:52:39

标签: delphi sqlite lazarus memo

我正在尝试使用Lazarus和SQLdb组件编写一个简单的SQLite 3应用程序。

我已设法连接到数据库并填充TDBGrid。问题是作为文本字段的所有列都显示值“(MEMO)”而不是数据库中的字符串。

9 个答案:

答案 0 :(得分:1)

另一个选择

如果您使用的是TZConection,则在连接数据库时将此行添加到代码中

TZConnection).Properties.Add('Undefined_Varchar_AsString_Length=100'); 

答案 1 :(得分:1)

我找到了一个简单的解决方案:

必须启用dgDisplayMemoText中的属性DBGrid

答案 2 :(得分:0)

正如在IRC上所说,您可能需要将查询的字段添加到表单中(以便为它们生成“字段”组件),然后实现TMemoField.GetText事件。

查看是否在对象检查器中输入“fields”字段会调出一个编辑器来生成组件(在Zeos iirc中这样做)。

答案 3 :(得分:0)

备注字段无法显示在TDBGrid中。将TDBMemo添加到表单并将其连接到同一TDataSource。在这种情况下,您将在备忘录中看到该文本。

答案 4 :(得分:0)

我忘记了这个的来源,但这就是我在tdbgrid中使用备注字段所做的事情。 关于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控件并在 Object Inspector (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])以指向显示(MEMO)文本的tdbgrid项目/字段的索引号。

答案 5 :(得分:0)

我在MySQL和Tgrid中也一样,所以我希望答案是一样的,因为它非常简单: - )

假设s是导致问题的字段,而不是写

SELECT s

SELECT LEFT(s,200) AS s 

答案 6 :(得分:0)

在一个相当古老的论坛帖子中,我找到了一个适合我的解决方案(德语/英语):

SqLite, Zeos und keine Textanzeige, im DbGrid steht (MEMO) - Zeoslib Portal

如果您将SQLite数据库中的字段类型从text更改为varchar,则文本会在TDBGrid中按预期显示。

更改SQLite列

您可能知道,SQLite不允许您更改列的字段类型。因此,如果您已经在数据库中存储了有价值的数据,请使用本教程中描述的步骤

SQLite ALTER TABLE & How To Overcome Its Limitations

这是另一个选项

  • 创建转储(sqlite3 your.db .dump >your.sql
  • 更改生成的sql(st like s/\<text\>/varchar/
  • 中的表定义
  • 导入新数据库(sqlite3 your2.db <your.sql
  • 交换旧数据库和新数据库的名称

答案 7 :(得分:0)

一个看似简单的解决方案是使用VARCHAR(n)这样的列类型来限制字段中TEXT的长度,其中n是允许的最大字符数。

答案 8 :(得分:-1)

本文提供了一个解决方案:Displaying and editing MEMO fiels in Delphi's TDBGrid

在这里,我总结了你要做的事情:

    <。>在.dfm中将OnGetText = MyDataSetMyFieldGetText添加到属于您的数据集的TMemoField(此处为MyField}(例如TTable,此处命名为MyDataSet }) .pas>

    中的

  • interface&gt; type&gt;在表单定义中,添加

    procedure MyDataSetMyFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
    
  • .pas>

    中的

  • implementation&gt;添加此方法

    procedure TDM.WorkVisiteNoteGetText(Sender: TField; var Text: string; DisplayText: Boolean);
    begin
      Text := Copy(WorkVisiteNote.AsString, 1, 100);
    end;