#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;