简体   繁体   中英

Delphi Bookmark Error: E2003 Undeclared identifier 'TBookmark'

Hey I wanted to use a TBookmark as a varialbe in my Form. I got it running in another Form and it is working there.

But in the new Form I get the Error.. I guess I have to include something in the uses statement but I cant remember what it was. Here is the code TBookmark is underlined in red so thats where the error sits.

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.

Your Form4 needs to Use the DB unit, because that's where TBookMark is declared.

Btw, what is in Form1's unit is irrelevant to this. The only relevant thing is that Form4's unit has to Use DB. What happens is that when the compiler tries to compile your Form4 unit, it needs to be able to find the definition of TBookMark, and that is in the standard DB.Pas unit along with lots of other dataset-related stuff. The same is true of any other identifier (or its class) that the compiler encounters in your project's source code.

99% of problems like this can be solved by doing a "Search | Find in Files" through Dephi's source code folders (and your project's folder if it's one of yours) to identify where the "undeclared" or missing item is declared.

Update So, you've got this code, which I'll assume is in your uForm4.Pas unit.

  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;

You want to be able to do something with the Name value that's shown in the current row of DBGrid1 on Form1. There's nothing particularly wrong with the way you've done it, just that it's long-winded, error-prone and invites problems like the one you've having with TBookMark.

The point is that somewhere in your project, maybe in your uForm1.Pas unit, you know, I don't, there must be a TDataSet-descendant (like TFDQuery, TAdoQuery or TTable) that is specified in the DataSet property of Form1's DataSource1. For the sake of argument, lets' say that the dataset component is FDQuery1 on Form1 and you want to get the Name field value from the current row in DBGrid1.

To get that Name value, you don't actually need the bookmarks your code is using. The way a TDBGrid works, the currently-selected row in the grid is always the current row in the dataset component. So you could simply write

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

because you don't need to go through the rigmarole of Form1.DBGrid1.DataSource.DataSet to get to it.

Now, to explain another little mystery, how come your code would work fine if it was in uForm1.Pas but you get the Undeclared Identifier: TBookMark error why you try the same code in uForm4.Pas unit? Well, if you've ever watched the top of a source code file as it's being saved, you'll notice that Delphi automatically adds, to the Uses list at the top, the units which contain any of the components you've added to the form since its last save. So adding a TDataSource to the form would add the DB unit to the Uses list, because that's where TDataSource is declared and so is TBookMark. Which is why Delphi could compile Form1's code without the error, whereas when you try to mention a TBookMark to uForm4, you need to add it to the unit's Uses list unless you add a component (like TDataSource) to Form4 which will cause it to automatically add DB to the Uses list if it isn't already there. Mystery solved.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM