Диагностические сообщения компилятора Delphi
-
0. <Что-то1> expected but <Что-то2> found. Обычно это сообщение возникает при синтаксической ошибке.Например,в случае небаланса скобок,компилятор сообщит: ‘)’ expected but ‘;’ found (вместо ожидавшейся скобки найдена запятая).
Компилятор часто сообщает, что ‘end’ ожидается,например:x:= 5,7; здесь неуместен разделитель-запятая, а сообщается про end. (‘END’ expected but ‘,’ found)
Например, вследствие описки дважды используется имя i в кратном цикле:
Рассмотрим также некоторые сообщения классов warning и hint.
- Return value of function <Имя> might be undefined. В теле функции нет присваивания ее результата.
- Variable <Имя> might not have been initialized. Указывает имя переменой, которой не задали значения.
- For-Loop variable <Имя> may be undefined after loop. Попытка использования значения параметра For-цикла после завершения этого цикла.
- Text after final ‘END.’ ignored by compiler. Текст, идущий за конечной строкой модуля, игнорируется компилятором.
- Variable <Имя> is declared but never used in <Имя блока>. Обращает внимание на переменную <Имя>, описанную,но не нашедшую применения.
- Value assigned to <Имя> never used. Хотя бы одно значение переменной <Имя> никак не использовано.
Несколько рекомендаций
Сосредотачивайтесь на первом сообщении компилятора. Исправление хотя бы одной ошибки и повторная компиляция может значительно уменьшить число сообщений об ошибках,поэтому не упорствуйте, стремясь понять сразу причину каждого сообщения.
Не удаляйте прежний вариант кода,пока не убедитесь,что ошибка устранена. Лучше на время закомментировать код,заключив его в скобки:
Компилятор не анализирует, как будет выполняться программа, поэтому выход значения индекса из диапазона выявляет только если индекс задан константным выражением. Деление на ноль вообще пропускается, кроме оператора div, в случае если делитель — константное выражение.
Undeclared identifier: ‘XXXX’
When compiling a unit the compiler generates the following error:
[Error] MyUnit.pas(LL): Undeclared identifier: ‘NNNN’
MyUnit.pas Is the Delphi source file. LL Is the line number in the file. NNNN Is the name of the identifier.
Cause:
The compiler does not recognise the identifier ‘ NNNN ‘. This is either because the identifier is miss-spelt or because the compiler could not find a corresponding definition.
Remedy:
- The most common cause is a simple misspelling where the identifier is used. For example:
Here the identifier is defined as ‘ number ‘ but used in the code as ‘ numbr ‘. The solution is to correct the spelling. This is the error scenario dealt with in the Delphi online help.
- Another common cause is that the code is correct but that the necessary unit has not been included in the uses clause. For example:
the code is correct but in this example, the unit ‘ SysUtils ‘ was not included.
The following table (which is not exhaustive) lists types and functions (but generally not constants) together with the unit required:
Type Unit _Stream ADODB_TLB akTop, akLeft, akRight, akBottom Controls AnsiLowerCase SysUtils Application (the variable not a type) Forms Beep SysUtils or Windows (different functions) CGID_EXPLORER ShlObj CN_BASE Controls CoInitialize ActiveX CopyFile Windows CoUnInitialize ActiveX CreateComObject ComObj CreateOleObject ComObj Date SysUtils DeleteFile SysUtils or Windows (different versions) DispatchInvokeError ComObj DWORD Windows EDatabaseError DB EncodeDateTime DateUtils EnumWindows Windows EOleError ComObj EOleException ComObj EOleSysError ComObj Exception SysUtils ExtractFileName SysUtils FileExists SysUtils FileOpen SysUtils FILETIME Windows FindFirst SysUtils FindFirstFile Windows FindWindow Windows FlushFileBuffers Windows fmOpenRead SysUtils fmShareDenyWrite SysUtils Format SysUtils FormatDateTime SysUtils FreeAndNil SysUtils fsBold Graphics ftWideString DB ftString DB GetCurrentProcessId Windows GetEnvironmentVariable SysUtils or Windows (different versions) GetFileAttributes Windows GetFileVersionInfoSize Windows GetStdHandle Windows GetTickCount Windows GetWindowLong Windows GlobalAddAtom Windows HDC Windows HFont Windows HINTERNET WinInet HKEY_CURRENT_USER Windows HWND Windows IHTMLDocument2 MSHTML or MSHTML_TLB IHTMLElement MSHTML or MSHTML_TLB IHTMLElementCollection MSHTML or MSHTML_TLB IHTMLEventObj MSHTML or MSHTML_TLB IID_IWebBrowser2 SHDocVw or SHDocVw_TLB IMessage CDO_TLB InternetClosehandle WinInet InternetOpenUrl WinInet InternetReadFile WinInet IntToHex SysUtils IntToStr SysUtils IOleCommandTarget ActiveX IOleContainer ActiveX IOleInPlaceActiveObject ActiveX IPersistStreamInit ActiveX IsSameDay DateUtils IStream ActiveX IWebBrowser SHDocVw or SHDocVw_TLB IWebBrowser2 SHDocVw or SHDocVw_TLB LockWindowUpdate Windows Log10 Math LowerCase SysUtils LPSTR Windows MAX_PATH Windows MessageBox Windows MessageDlg Dialogs MB_YESNO, MB_OK etc Windows MinutesBetween DateUtils Now SysUtils OleInitialize ActiveX OleUninitialize ActiveX PItemIDList ShlObj POleCmd ActiveX POleCmdText ActiveX PostMessage Windows PosX StrUtils QueryHighPerformanceCounter Windows QueryPerformanceCounter Windows RandomRange Math RegisterHotKey Windows ReverseString StrUtils RoundTo Math SendMessage Windows SetForegroundWindow Windows ShellExecute ShellAPI ShellExecuteEx ShellAPI SHGetFileInfo ShellAPI SHFILEINFO ShellAPI ShowMessage Dialogs Sleep SysUtils StrAlloc SysUtils StrPas SysUtils StrToDate SysUtils StrToInt SysUtils StrToIntDef SysUtils TAdoConnection ADODB TAdoQuery ADODB TAlign Controls TAlignment Classes TAnchors Controls TBitmap Graphics TBlobStream DBTables TCanvas Graphics TClientSocket ScktComp TComboBox StdCtrls TComponent Classes TControl Controls or QControls TCriticalSection SyncObjs TField DB TFieldType DB TFileName SysUtils TFileStream Classes TForm Forms TFrame Forms TGroupBox StdCtrls TIID ActiveX TIniFile IniFiles TJPEGImage Jpeg TLabel StdCtrls TList Classes TMemo StdCtrls TMemoryStream Classes TMouseButton Controls TNofityEvent Classes TObjectList Contnrs TObjectList<T> System.Generics.Colletions TOSVersionInfo Windows TPanel ExtCtrls TPoint Types TProcessEntry32 TlHelp32 TProgressBar ComCtrls or QComCtrls TRadioButton StdCtrls TRadioGroup ExtCtrls TRect Types TRegistry Registry Trim SysUtils TRoundToRange Math TSearchRec SysUtils TSize Windows TSocketAddrIn Winsock TStaticText StdCtrls TStream Classes TStringList Classes TStrings Classes TStringStream Classes TSystemTime Windows TTable DBTables TTabSheet ComCtrls TThread Classes TTreeNode ComCtrls TWebBrowser SHDocVw or SHDocVw_TLB TWinSocketStream ScktComp TWMCommand Messages Unassigned Variants VarArrayCreate Variants VarArrayOf Variants VirtualProtect Windows VK_SNAPSHOT Windows WaitForSingleObject Windows WM_MOVE Messages WM_MOVING Messages WM_USER Messages YearOf DateUtils
Later versions of Delphi have better online help and depending on the version of Delphi installed the required unit may be clear from the on-line help.
I will add to this table over time. If you know of any types that are missing that you would like to see included then please e-mail these to brian@cryer.co.uk.
These notes are believed to be correct for Delphi 6 and Delphi 7, and may apply to other versions as well.
About the author: Brian Cryer is a dedicated software developer and webmaster. For his day job he develops websites and desktop applications as well as providing IT services. He moonlights as a technical author and consultant.
Диагностические сообщения компилятора Delphi
0. <Что-то1> expected but <Что-то2> found. Обычно это сообщение возникает при синтаксической ошибке.Например,в случае небаланса скобок,компилятор сообщит: ‘)’ expected but ‘;’ found (вместо ожидавшейся скобки найдена запятая).
Компилятор часто сообщает, что ‘end’ ожидается,например:x:= 5,7; здесь неуместен разделитель-запятая, а сообщается про end. (‘END’ expected but ‘,’ found)
Рассмотрим также некоторые сообщения классов warning и hint.
- Return value of function <Имя> might be undefined. В теле функции нет присваивания ее результата.
- Variable <Имя> might not have been initialized. Указывает имя переменой, которой не задали значения.
- For-Loop variable <Имя> may be undefined after loop. Попытка использования значения параметра For-цикла после завершения этого цикла.
- Text after final «END.’ ignored by compiler. Текст, идущий за конечной строкой модуля, игнорируется компилятором.
- Variable <Имя> is declared but never used in <Имя блока>. Обращает внимание на переменную <Имя>, описанную,но не нашедшую применения.
- Value assigned to <Имя> never used. Хотя бы одно значение переменной <Имя> никак не использовано.
Несколько рекомендаций
Сосредотачивайтесь на первом сообщении компилятора. Исправление хотя бы одной ошибки и повторная компиляция может значительно уменьшить число сообщений об ошибках,поэтому не упорствуйте, стремясь понять сразу причину каждого сообщения.
Не удаляйте прежний вариант кода,пока не убедитесь,что ошибка устранена. Лучше на время закомментировать код,заключив его в скобки:
Компилятор не анализирует, как будет выполняться программа, поэтому выход значения индекса из диапазона выявляет только если индекс задан константным выражением. Деление на ноль вообще пропускается, кроме оператора div, в случае если делитель — константное выражение.
«Необъявленный идентификатор» в Delphi 7 — что делать?
Еще один вопрос: что такое «необъявленный идентификатор»?
задан 17 июн ’13, 14:06
«Необъявленный идентификатор» — это идентификатор, который не был объявлен. — David Heffernan
@Safa Вам не следует редактировать сообщения об ошибках в вопросах, это скроет реальную проблему (как это определенно происходит с вашим редактированием). — Mark Rotteveel
1 ответы
Замените showmassage с ShowMessage (регистр не важен, важно написание!).
«Необъявленный идентификатор» означает, что Delphi не может найти объявление, которое говорит ему, что showmassage есть, поэтому он выделяет его как элемент, который не был объявлен.
все еще говорят [Ошибка] Unit1.pas(38): необъявленный идентификатор: ‘Showmassage’, любое решение? — Рихсано
Решение состоит в том, что вы еще раз внимательно прочитаете ответ и сделаете то, что он говорит. Вы пытаетесь отобразить окно сообщения. Ты не пытаясь получить массаж ноги. — Дэвид Хеффернан
Пожалуйста, внимательно перечитайте мой ответ — вам нужно заменить первый a с e . — w5m
да, моя вина, извините, теперь все работает, спасибо ^_^, благослови вас — Рихсано
И в следующий раз, в случае, который упомянул Кит: если вы щелкнете по слову, нажмете Ctrl-F1, вы получите онлайн-справку, сообщающую вам (среди прочего), в каком блоке идентифицируется процедура/тип — это блок для добавить в пункт Uses. Попробуйте прямо сейчас с ShowMessage. — Ян Догген
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками delphi delphi-7 undeclared-identifier or задайте свой вопрос.