Delphi Bookmark Error: E2003 Undeclared identifier 'TBookmark'

Delphi Bookmark Error: E2003 Undeclared identifier 'TBookmark'

嘿,我想在我的表单中使用 TBookmark 作为变量。我在另一个表格中得到了它 运行,它在那里工作。

但是在新表单中我得到了错误。我想我必须在 uses 语句中包含一些东西,但我不记得它是什么。这是代码 TBookmark 带有红色下划线,所以这就是错误所在。

procedure TForm4.FormCreate(Sender: TObject);
var test : string;
var selectedRow, rows : TBookmark;
begin
  rows := Form1.DBGrid1.DataSource.DataSet.GetBookmark;
  Form1.DBGrid1.SelectedRows.CurrentRowSelected := True;
  Form1.DBGrid1.DataSource.DataSet.GotoBookmark(rows);
  test := Form1.DBGrid1.DataSource.DataSet.FieldByName('name').AsString;
  ShowMessage(test);

end;

end.

您的 Form4 需要使用 DB 单元,因为这是声明 TBookMark 的地方。

顺便说一句,Form1 的单元中的内容与此无关。唯一相关的是 Form4 的单元 使用 DB。发生的事情是,当编译器尝试编译您的 Form4 单元时,它需要能够找到 TBookMark 的定义,并且它在标准 DB.Pas 单元中以及许多其他与数据集相关的东西。编译器在项目源代码中遇到的任何其他标识符(或其 class)也是如此。

99% 的此类问题都可以通过 "Search | Find in Files" 通过 Dephi 的源代码文件夹(以及您的项目文件夹,如果它是您的文件夹)来确定 "undeclared" 或丢失项目的位置来解决已声明。

更新 所以,你已经得到了这段代码,我假设它在你的 uForm4.Pas 单元中。

  procedure TForm4.FormCreate(Sender: TObject);
  var
    test : string;
  var
    selectedRow, rows : TBookmark;
  begin
    rows := Form1.DBGrid1.DataSource.DataSet.GetBookmark;
    Form1.DBGrid1.SelectedRows.CurrentRowSelected := True;
    Form1.DBGrid1.DataSource.DataSet.GotoBookmark(rows);
    test := Form1.DBGrid1.DataSource.DataSet.FieldByName('name').AsString;
    ShowMessage(test);
  end;

您希望能够对当前行中显示的名称值执行某些操作 Form1 上的 DBGrid1。你做这件事的方式并没有什么特别的错误,只是 它冗长,容易出错,并且会引发像您遇到的问题 TBookMark.

关键是 在你的项目中的某个地方,也许在你的 uForm1.Pas 单元中,你知道, 我不知道,必须有一个 TDataSet 后代(如 TFDQuery、TAdoQuery 或 TTable)是 在Form1的DataSource1的DataSet属性中指定。为了争论,让' 假设数据集组件是 Form1 上的 FDQuery1 并且您想获取 Name 字段值 来自 DBGrid1 中的当前行。

要获得该名称值,您实际上不需要您的代码正在使用的书签。方式 TDBGrid 有效,网格中当前选定的行是 always 中的当前行 数据集组件。所以你可以简单地写

    procedure TForm4.FormCreate(Sender: TObject);
    var
      test : string;
    begin
      test := Form1.FDQuery1.FieldByName('name').AsString;
      ShowMessage(test);
    end;

因为您不需要通过 Form1.DBGrid1.DataSource.DataSet 的繁琐程序来获得它。

现在,解释另一个小谜团,如果你的代码在 uForm1.Pas 但是你得到 Undeclared Identifier: TBookMark 错误为什么你在 uForm4.Pas 中尝试相同的代码 单元?好吧,如果您在保存源代码文件时看过它的顶部,您会注意到 Delphi 自动向顶部的使用列表添加包含任何 自上次保存后添加到表单中的组件。所以向表单添加 TDataSource 会添加 将 DB 单元添加到 Uses 列表中,因为这是声明 TDataSource 的地方,TBookMark 也是如此。哪个 这就是为什么 Delphi 可以在没有错误的情况下编译 Form1 的代码,而当您尝试提及 TBookMark 时 对于 uForm4,您需要将其添加到单元的使用列表中除非您添加一个组件(如 TDataSource) 到 Form4 这将导致它自动将 DB 添加到 Uses 列表中(如果它不存在)。神秘 解决了。​​