Delphi, импорт файлов Excel, необъявленный идентификатор

#excel #delphi #import #undeclared-identifier

#excel #delphi #импорт #необъявленный идентификатор

Вопрос:

Я следую руководству по About.com при импорте файлов Excel в Delphi. Когда я пытаюсь скомпилировать файл, я продолжаю получать сообщение об ошибке о необъявленном идентификаторе. Насколько мне известно, форма именуется и доступна в проекте, как и должно быть. Я буду признателен за любые предложения по исправлению этой ошибки.

 unit sample_map;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Data.DB, Data.Win.ADODB,
  Vcl.AppEvnts, Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls, Vcl.DBCtrls, Vcl.StdCtrls,
  UWebGMapsCommon, System.Generics.Collections, UWebGMaps;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Button1: TButton;
    DataSource1: TDataSource;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DBNavigator1: TDBNavigator;
    ApplicationEvents1: TApplicationEvents;
    StatusBar1: TStatusBar;
    DBGrid1: TDBGrid;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ApplicationEvents1Exception(Sender: TObject; E: Exception);

  private
  procedure TForm1.FetchData;
    begin
      StatusBar1.SimpleText:='';
      ConnectToExcel;
      AdoQuery1.Close;
      AdoQuery1.SQL.Text:=Edit2.Text;
        try
          AdoQuery1.Open;
        except
        ShowMessage('Unable to read data from Excel,
                 make sure the query '   Edit1.Text  
                 ' is meaningful!');
        raise;
    end;
  end;

  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
  StatusBar1.SimpleText := E.Message;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  openDialog : TOpenDialog;    // Open dialog variable
  strConn : WideString; // Declare wide string for the connection
  FileName: string;

begin
  // Create the open dialog object - assign to our open dialog variable
  openDialog := TOpenDialog.Create(self);

  // Set up the starting directory to be the current one
  openDialog.InitialDir := GetCurrentDir;

  // Only allow existing files to be selected
  openDialog.Options := [ofFileMustExist];

  // Allow only .Excel and .pas files to be selected
  openDialog.Filter :=
    'Excel 2003|*.xls|Excel 2007 and older|*.xlsx';

  // Select pascal files as the starting filter type
  openDialog.FilterIndex := 2;

  // Procedure to read the Excel file
  FileName := '';
  if PromptForFileName(FileName,                          // Chosen filename holder
                      'Excel 2003 and older|*.xls|Excel 2007 and older|*.xlsx',  // Filter(s) (optional)
                      '.xlsx',                            // Default extension (opt)
                      'Choose file',                     // Dialog title (opt)
                      GetCurrentDir,                     // Initial dir (opt)
                      False) then                        // Is it a save dlg? (opt)
  begin
    strConn := 'Provider=Microsoft.Jet.OLEDB.4.0;'  
               'Data Source='   FileName   ';'  
               'Extended Properties=Excel 8.0;';
    // Connect the Excel file
    AdoConnection1.Connected:=False;
    AdoConnection1.ConnectionString:=strConn;

    // Insert the file name to the dialog box and so forth
    Edit1.Text := FileName;

    // Ad worksheets to the combo box

  end
  else
    ShowMessage('Dialog cancelled.');

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AdoConnection1.LoginPrompt := False;
  AdoQuery1.Connection       := AdoConnection1;
  DataSource1.DataSet        := AdoQuery1;
  DBGrid1.DataSource         := DataSource1;
  DBNavigator1.DataSource    := DataSource1;


end;

end.
  

Комментарии:

1. Какой идентификатор, по словам компилятора, является необъявленным?

2. По-видимому, это TForm1

3. Это процедура TForm1. fetchData; , спасибо 🙂

Ответ №1:

Вы разместили реализацию TForm1.FetchData не в том месте. Его нельзя поместить в объявление класса. Он должен быть в разделе реализации модуля. Ваш код должен выглядеть следующим образом:

 interface

....

type
  TForm1 = class(TForm)
    .... // IDE fields here
  private
    procedure FetchData;
  end;

....

implementation

....

procedure TForm1.FetchData;
begin
  .... body of function here
end;
  

Руководство, на которое вы ссылаетесь, содержит полный модуль. Я предлагаю вам сравнить код в этом полном блоке с кодом, который вы создали.

Комментарии:

1. Это сработало, но, похоже, есть другая ошибка. Компилятор возвращает: [Ошибка dcc32] sample_map.pas(43): E2029 ‘=’ ожидаемый, но «КОНЕЦ» найден после публичного объявления.

2. Очевидно, у вас другая проблема с вашим кодом. Помните, что мы больше не можем видеть ваш код. Ответ, который я написал, является ответом на вопрос, который вы задали. Что касается вашей новой проблемы, пожалуйста, попробуйте ее отладить. Почему компилятор ожидает = вместо end ? Вы можете увидеть код. Что вы думаете?

3. Дэвид, спасибо за ваши комментарии. Это работает, знаете, у меня было несколько небольших ошибок в коде.

Ответ №2:

Вы включили реализацию метода в раздел интерфейса. Исправьте раздел интерфейса, чтобы он выглядел следующим образом :-

 Private
  Procedure FetchData;
Public
End;
  

Затем переместите остальную часть кода в раздел реализации следующим образом :-

   procedure TForm1.FetchData;
    begin
      StatusBar1.SimpleText:='';
      ConnectToExcel;
      AdoQuery1.Close;
      AdoQuery1.SQL.Text:=Edit2.Text;
        try
          AdoQuery1.Open;
        except
        ShowMessage('Unable to read data from Excel,
                 make sure the query '   Edit1.Text  
                 ' is meaningful!');
        raise;
    end;
  end;