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

我正在尝试使用Lazarus和SQLdb组件编写一个简单的SQLite 3应用程序。 我已设法连接到数据库并填充
TDBGrid
。问题是作为文本字段的所有列都显示值“(MEMO)”而不是DB中的字符串。     
已邀请:
正如在IRC上所说,您可能需要将查询的字段添加到表单中(以便为它们生成“字段”组件),然后实现
TMemoField.GetText
事件。 查看是否在对象检查器中输入“fields”字段会调出一个编辑器来生成组件(在Zeos iirc中会这样做)。     
备注字段无法显示在
TDBGrid
中。将
TDBMemo
添加到表单并将其连接到相同的
TDataSource
。在这种情况下,您将在备忘录中看到文本。     
我忘记了这个的来源,但这就是我在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)中,单击Events选项卡,在下面滚动以查找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项目/字段的索引号。     
我在MySQL和Tgrid中也一样,所以我希望答案是一样的,因为它非常简单:-) 假设s是导致问题的字段然后而不是写
SELECT s
SELECT LEFT(s,200) AS s 
    
在一个相当古老的论坛帖子中,我找到了一个适合我的解决方案(德语/英语): SqLite,Zeos和keine Textanzeige,im DbGrid steht(MEMO) - Zeoslib Portal 如果将SQLite数据库中的字段类型从
text
更改为
varchar
,则文本将在
TDBGrid
中按预期显示。 更改SQLite列 您可能知道,SQLite不允许您更改列的字段类型。因此,如果您已经在数据库中存储了有价值的数据,请使用本教程中描述的步骤 SQLite ALTER TABLE&如何克服其局限 这是另一种选择 创建转储(
sqlite3 your.db .dump >your.sql
) 更改生成的sql中的表定义(stlike
s/<text>/varchar/
) 导入新数据库(
sqlite3 your2.db <your.sql
) 交换旧数据库和新数据库的名称     
本文给出了一个解决方案:在Delphi的TDBGrid中显示和编辑MEMO fiels。 在这里,我总结了你要做的事情: 在.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;
    

要回复问题请先登录注册