procedure TForm1.Button2Click(Sender: TObject);
begin
showmassage('Create by rihsano');
end;
Delphi reports the following error:
[Error] Unit1.pas(38): Undeclared identifier: 'showmassage'
One more question: what is «undeclared identifier»?
asked Jun 17, 2013 at 13:48
2
Replace showmassage
with ShowMessage
(case isn’t important, but spelling is!).
«Undeclared identifier» means that Delphi cannot find the declaration that tells it what showmassage
is, so it highlights it as an item that hasn’t been declared.
answered Jun 17, 2013 at 13:50
w5mw5m
2,2863 gold badges34 silver badges46 bronze badges
5
Дело тут вот в чем. В отличие от Си-подобных языков в pascal/delphi объявление массива подразумевает указание не размера массива, а начального и конечного индексов.
То есть если вам нужен двумерный массив размером n х m то объявлять его следует так:
massivCHisel : array [1..n, 1..m] of integer;
если же вы хотели создать одномерный массив с индексами от n до m, то так:
massivCHisel : array [n..m] of integer;
Но и это еще не все. Подобное объявление массива предполагает, что значения его индексов известно на этапе компиляции, то есть вышеприведенные записи по-прежнему не будут верными, поскольку m и n являются не константами, а переменными. Чтобы пример компилировался, вам нужно сделать что-то наподобие:
const n = 5;
m = 6;
var massivCHisel : array [1..n, 1..m] of integer;
Если же вас интересует иименно возможность задания границ массива с помощью переменных, то вам имеет смысл посмотреть в сторону динамических массивов
В Delphi могут возникать различные ошибки. Некоторые из наиболее распространенных ошибок включают:
- Ошибки компиляции: они возникают, когда Delphi не может скомпилировать код из-за нарушения синтаксиса языка или других проблем. Ошибки компиляции отображаются в окне «Message» в Delphi.
- Ошибки выполнения: они возникают, когда программа запущена, но при выполнении происходит ошибка. Обычно это связано с неправильным использованием указателей, попыткой доступа к несуществующей памяти или другими проблемами в коде.
- Ошибки логики: они возникают, когда программа работает без ошибок, но результат не соответствует ожиданиям из-за неправильной логики программы. Эти ошибки могут быть труднее всего выявить и исправить, так как код может быть написан верно, но результат неправильный.
- Ошибки доступа к файлам и данным: они возникают, когда программа не может получить доступ к файлам или данным, которые она пытается использовать. Это может быть связано с неправильными разрешениями или неправильными путями к файлам.
- Ошибки сборки: они возникают, когда проект не может быть собран из-за проблем с зависимостями или другими проблемами в проекте.
- Ошибки времени выполнения: они возникают, когда программа запущена, но в процессе выполнения происходит ошибка, которая может привести к аварийному завершению программы.
- Ошибки связи: они возникают, когда Delphi не может найти или подключиться к необходимым библиотекам или компонентам.
- Ошибки среды выполнения: они возникают, когда Delphi не может выполнить программу из-за проблем в среде выполнения, таких как отсутствие необходимых файлов или недостаточное количество свободной памяти.
Почему вылетает ошибка «undeclared identifier» в Delphi?
Ошибка «undeclared identifier» в Delphi возникает, когда компилятор не может найти объявление переменной, функции, константы или другого идентификатора, которые используются в коде.
Такая ошибка может возникнуть по нескольким причинам:
- Ошибки в написании имени переменной, функции или константы. Например, если имя переменной набрано с ошибкой или отличается от имени, указанного в объявлении.
- Объявление переменной, функции или константы не было сделано в том же модуле, где используется идентификатор.
- Несоответствие области видимости. Иногда идентификатор объявлен в другой области видимости, где его нельзя использовать в текущей области.
- Ошибки в порядке объявления. Иногда идентификатор используется до его объявления или после его выхода из области видимости.
Чтобы исправить эту ошибку, нужно убедиться, что имя идентификатора написано правильно и что идентификатор был объявлен в том же модуле, где его используют. Также следует проверить, что идентификатор находится в той же области видимости, где он используется, и что он объявлен до использования.
Как исправить ошибку «undeclared identifier» в Delphi?
Чтобы исправить эту ошибку, можно предпринять следующие шаги:
- Проверить правильность написания идентификатора: убедиться, что имя идентификатора написано правильно и точно соответствует объявлению.
- Проверить наличие объявления в том же модуле: убедиться, что идентификатор был объявлен в том же модуле, где его используют. Если идентификатор был объявлен в другом модуле, следует добавить в проект модуль с объявлением или использовать директиву «uses» для подключения этого модуля.
- Проверить область видимости: убедиться, что идентификатор находится в той же области видимости, где его используют. Если идентификатор находится в другой области видимости, следует переместить его в нужное место.
- Проверить порядок объявления: убедиться, что идентификатор был объявлен до использования. Если идентификатор используется до его объявления, следует переместить объявление перед использованием.
- Проверить файлы проекта: убедиться, что файлы проекта находятся в правильном месте и имеют правильные имена.
- Перекомпилировать проект: если вышеуказанные действия не помогли, следует попробовать перекомпилировать проект. Это может помочь в случае, если проблема связана с кэшем компилятора или другими временными проблемами.
Если все вышеуказанные действия не помогли, можно также попробовать обратиться за помощью к сообществу Delphi или к специалистам по Delphi.
#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;
Дело тут вот в чем. В отличие от Си-подобных языков в pascal/delphi объявление массива подразумевает указание не размера массива, а начального и конечного индексов.
То есть если вам нужен двумерный массив размером n х m то объявлять его следует так:
massivCHisel : array [1..n, 1..m] of integer;
если же вы хотели создать одномерный массив с индексами от n до m, то так:
massivCHisel : array [n..m] of integer;
Но и это еще не все. Подобное объявление массива предполагает, что значения его индексов известно на этапе компиляции, то есть вышеприведенные записи по-прежнему не будут верными, поскольку m и n являются не константами, а переменными. Чтобы пример компилировался, вам нужно сделать что-то наподобие:
const n = 5;
m = 6;
var massivCHisel : array [1..n, 1..m] of integer;
Если же вас интересует иименно возможность задания границ массива с помощью переменных, то вам имеет смысл посмотреть в сторону динамических массивов