Ошибка необъявленный идентификатор делфи

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»?

Darshan Mehta's user avatar

asked Jun 17, 2013 at 13:48

rihsano's user avatar

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

w5m's user avatar

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 могут возникать различные ошибки. Некоторые из наиболее распространенных ошибок включают:

  1. Ошибки компиляции: они возникают, когда Delphi не может скомпилировать код из-за нарушения синтаксиса языка или других проблем. Ошибки компиляции отображаются в окне «Message» в Delphi.
  2. Ошибки выполнения: они возникают, когда программа запущена, но при выполнении происходит ошибка. Обычно это связано с неправильным использованием указателей, попыткой доступа к несуществующей памяти или другими проблемами в коде.
  3. Ошибки логики: они возникают, когда программа работает без ошибок, но результат не соответствует ожиданиям из-за неправильной логики программы. Эти ошибки могут быть труднее всего выявить и исправить, так как код может быть написан верно, но результат неправильный.
  4. Ошибки доступа к файлам и данным: они возникают, когда программа не может получить доступ к файлам или данным, которые она пытается использовать. Это может быть связано с неправильными разрешениями или неправильными путями к файлам.
  5. Ошибки сборки: они возникают, когда проект не может быть собран из-за проблем с зависимостями или другими проблемами в проекте.
  6. Ошибки времени выполнения: они возникают, когда программа запущена, но в процессе выполнения происходит ошибка, которая может привести к аварийному завершению программы.
  7. Ошибки связи: они возникают, когда Delphi не может найти или подключиться к необходимым библиотекам или компонентам.
  8. Ошибки среды выполнения: они возникают, когда Delphi не может выполнить программу из-за проблем в среде выполнения, таких как отсутствие необходимых файлов или недостаточное количество свободной памяти.

Почему вылетает ошибка «undeclared identifier» в Delphi?

Ошибка «undeclared identifier» в Delphi возникает, когда компилятор не может найти объявление переменной, функции, константы или другого идентификатора, которые используются в коде.

Такая ошибка может возникнуть по нескольким причинам:

  1. Ошибки в написании имени переменной, функции или константы. Например, если имя переменной набрано с ошибкой или отличается от имени, указанного в объявлении.
  2. Объявление переменной, функции или константы не было сделано в том же модуле, где используется идентификатор.
  3. Несоответствие области видимости. Иногда идентификатор объявлен в другой области видимости, где его нельзя использовать в текущей области.
  4. Ошибки в порядке объявления. Иногда идентификатор используется до его объявления или после его выхода из области видимости.

Чтобы исправить эту ошибку, нужно убедиться, что имя идентификатора написано правильно и что идентификатор был объявлен в том же модуле, где его используют. Также следует проверить, что идентификатор находится в той же области видимости, где он используется, и что он объявлен до использования.

Как исправить ошибку «undeclared identifier» в Delphi?

Чтобы исправить эту ошибку, можно предпринять следующие шаги:

  1. Проверить правильность написания идентификатора: убедиться, что имя идентификатора написано правильно и точно соответствует объявлению.
  2. Проверить наличие объявления в том же модуле: убедиться, что идентификатор был объявлен в том же модуле, где его используют. Если идентификатор был объявлен в другом модуле, следует добавить в проект модуль с объявлением или использовать директиву «uses» для подключения этого модуля.
  3. Проверить область видимости: убедиться, что идентификатор находится в той же области видимости, где его используют. Если идентификатор находится в другой области видимости, следует переместить его в нужное место.
  4. Проверить порядок объявления: убедиться, что идентификатор был объявлен до использования. Если идентификатор используется до его объявления, следует переместить объявление перед использованием.
  5. Проверить файлы проекта: убедиться, что файлы проекта находятся в правильном месте и имеют правильные имена.
  6. Перекомпилировать проект: если вышеуказанные действия не помогли, следует попробовать перекомпилировать проект. Это может помочь в случае, если проблема связана с кэшем компилятора или другими временными проблемами.

Если все вышеуказанные действия не помогли, можно также попробовать обратиться за помощью к сообществу 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;

Если же вас интересует иименно возможность задания границ массива с помощью переменных, то вам имеет смысл посмотреть в сторону динамических массивов

Понравилась статья? Поделить с друзьями:
  • Ошибка неполного деления
  • Ошибка нельзя установить свойство visible класса worksheet
  • Ошибка некорректный номер счета
  • Ошибка неполадки подключения или неверный код mmi
  • Ошибка нельзя установить свойство orientation класса pagesetup