Делфи undeclared identifier ошибка

В 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.

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

  • delphi
  • delphi-7
  • undeclared-identifier

Darshan Mehta's user avatar

Darshan Mehta

30.1k11 gold badges68 silver badges102 bronze badges

asked Jun 17, 2013 at 13:48

rihsano's user avatar

rihsanorihsano

51 gold badge1 silver badge5 bronze badges

2

  • «Undeclared identifier» is an identifier that has not been declared.

    Jun 17, 2013 at 13:53

  • @Safa You should not edit error messages in questions, it would hide the real problem (as it definitely does with your edit).

    Mar 7, 2016 at 12:34

1 Answer

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

  • still say [Error] Unit1.pas(38): Undeclared identifier: ‘Showmassage’ , any solution ?

    Jun 17, 2013 at 13:53

  • The solution is that you carefully read the answer again and do what it says. You are trying to to display a message box. You are not trying to get a leg rub.

    Jun 17, 2013 at 13:53

  • Please re-read my answer carefully — you need to replace the first a with an e.

    Jun 17, 2013 at 13:54

  • yeah my fault i’m sorry , now it work thanks ^_^ , good bless you

    Jun 17, 2013 at 14:03

  • And for the next time, in the case that Keith mentioned: if you click on the word, hit Ctrl-F1, you get online help telling you (among other things) what unit the procedure/type is identified in — that’s the unit to add to your Uses clause. Try it now with ShowMessage.

    Jun 17, 2013 at 14:16

Go Up to Error and Warning Messages (Delphi)

The compiler could not find the given identifier — most likely it has been misspelled either at the point of declaration or the point of use. It might be from another unit that has not mentioned a uses clause.

program Produce;
var
  Counter: Integer;
begin
  Count := 0;
  Inc(Count);
  Writeln(Count);
end.

In the example, the variable has been declared as «Counter», but used as «Count». The solution is to either change the declaration or the places where the variable is used.

program Solve;
var
  Count: Integer;
begin
  Count := 0;
  Inc(Count);
  Writeln(Count);
end.

In the example we have chosen to change the declaration — that was less work.

В Delphi могут возникать различные ошибки. Некоторые из наиболее распространенных ошибок включают:

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

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

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

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

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

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

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

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

Если все вышеуказанные действия не помогли, можно также попробовать обратиться за помощью к сообществу Delphi или к специалистам по Delphi.

Дельфи в упор не видит таймеры, которые я создал… Он видит форму и имжйдж, но при попытке использовать таймер говорит, что его нет (Undeclared identifier:TimerSpawn). Вот код:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
ClassPanzer=class(TObject)
x,y,hp:integer;
Bmp:TBitmap;
end;
  TFormGame = class(TForm)
    ImageGround: TImage;
    TimerSpawn: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormGame: TFormGame;
  PanzerFaust:array of ClassPanzer;
  PanzerToRight,PanzerToUp,PanzerToLeft,PanzerToDown,BitMapGround,BitMapRoad,BitMapBaseSovjet,BitMapBaseNazi:TBitmap;
  WaveCount,Gold:integer;


implementation

{$R *.dfm}

procedure TFormGame.FormClose(Sender: TObject; var Action: TCloseAction);
var Counter1:integer;
begin
//
PanzerToRight.Free;
PanzerToUp.Free;
PanzerToLeft.Free;
PanzerToDown.Free;
BitMapGround.Free;
BitMapRoad.Free;
BitMapBaseSovjet.Free;
BitMapBaseNazi.Free;
//
for Counter1:=1 to Length(PanzerFaust) do PanzerFaust[Counter1].Free;
//
end;

procedure TFormGame.FormCreate(Sender: TObject);
var counter1,counter2, counter3 :integer;
begin
// procedure begin
counter3:=1;
PanzerToRight:=TBitmap.Create;
PanzerToRight.LoadFromFile('PanzerToRight.bmp');
//
PanzerToUp:=TBitmap.Create;
PanzerToUp.LoadFromFile('PanzerToUp.bmp');
//
PanzerToLeft:=TBitmap.Create;
PanzerToLeft.LoadFromFile('PanzerToLeft.bmp');
//
PanzerToDown:=TBitmap.Create;
PanzerToDown.LoadFromFile('PanzerToDown.bmp');
//
BitMapGround:=TBitmap.Create;
BitMapGround.LoadFromFile('Ground.bmp');
//
BitMapRoad:=TBitmap.Create;
BitMapRoad.LoadFromFile('Road.bmp');
//
BitMapBaseSovjet:=TBitmap.Create;
BitMapBaseSovjet.LoadFromFile('SovjetBase.bmp');
//
BitmapBaseNazi:=TBitmap.Create;
BitMapBaseNazi.LoadFromFile('NaziBase.bmp');
for   counter1:=1 to 20 do for counter2:= 1 to 20 do ImageGround.Canvas.Draw(counter2*50-50,counter1*50-50,BitMapGround);
//
for   counter1:=1 to 10 do for counter2:= 1 to 20 do ImageGround.Canvas.Draw(Counter2*50-50,counter1*100-50,BitMapRoad);
//
counter3:=100;
for counter1:=1 to 5 do begin
ImageGround.Canvas.Draw(950,counter3,BitMapRoad);
counter3:=counter3+200;
end;
//
counter3:=200;
for counter1:=1 to 4 do begin
ImageGround.Canvas.Draw(0,counter3,BitMapRoad);
counter3:=counter3+200;
end;
//
ImageGround.Canvas.Draw(0,050,BitMapBaseNazi);
ImageGround.Canvas.Draw(0,950,BitMapBaseSovjet);
//
WaveCount:=1;
//procedure end
end;
//
procedure WaveStart;
var SpawnCounter,Counter1:integer;
begin
// procedure begin
SpawnCounter:=WaveCount*50 div 4;
Setlength(PanzerFaust,SpawnCounter);
//
for Counter1 := 1 to SpawnCounter do begin
PanzerFaust[Counter1]:=ClassPanzer.Create;
PanzerFaust[Counter1].x:=50;
PanzerFaust[Counter1].y:=50;
PanzerFaust[Counter1].hp:=100;
PanzerFaust[Counter1].Bmp:=PanzerToRight;
TimerSpawn.Enabled:=True;
end;
// procedure end
end;

end.

Что я делаю не так???
Заранее спасибо.

Каныш2901

0 / 0 / 0

Регистрация: 18.10.2016

Сообщений: 16

1

19.11.2016, 11:12. Показов 25776. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, DBCtrls, jpeg, ExtCtrls, Menus, Buttons;
 
  const maxSymbols=10;
 
 
type
  TForm2 = class(TForm)
    img1: TImage;
    lbl1: TLabel;
    ds1: TDataSource;
    dbmmo1: TDBMemo;
    tbl1: TADOTable;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    WordGroup: TGroupBox;
    Char1: TPanel;
    Char2: TPanel;
    Char3: TPanel;
    Char4: TPanel;
    Char5: TPanel;
    Char6: TPanel;
    Char7: TPanel;
    Char8: TPanel;
    Char9: TPanel;
    Char10: TPanel;
    BtnGroup: TGroupBox;
    BtnA: TSpeedButton;
    BtnB: TSpeedButton;
    BtnC: TSpeedButton;
    BtnG: TSpeedButton;
    BtnD: TSpeedButton;
    BtnH: TSpeedButton;
    BtnI: TSpeedButton;
    BtnE: TSpeedButton;
    BtnF: TSpeedButton;
    BtnJ: TSpeedButton;
    BtnK: TSpeedButton;
    BtnL: TSpeedButton;
    BtnM: TSpeedButton;
    BtnN: TSpeedButton;
    BtnO: TSpeedButton;
    BtnQ: TSpeedButton;
    BtnR: TSpeedButton;
    BtnS: TSpeedButton;
    BtnT: TSpeedButton;
    BtnP: TSpeedButton;
    BtnV: TSpeedButton;
    BtnW: TSpeedButton;
    BtnX: TSpeedButton;
    BtnU: TSpeedButton;
    BtnY: TSpeedButton;
    BtnZ: TSpeedButton;
    tEdit: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
 
  private
    { Private declarations }
     procedure TForm2btnEnableAll;
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.show;
Form2.Hide;
end;
procedure TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 end;
 
end.

Ошибка:
[Error] Unit2.pas(90): Undeclared identifier: ‘BtnA’
[Error] Unit2.pas(91): Undeclared identifier: ‘BtnB’
[Error] Unit2.pas(92): Undeclared identifier: ‘BtnC’

0

Nanotentacle

884 / 404 / 174

Регистрация: 20.10.2016

Сообщений: 1,828

19.11.2016, 11:16

2

Delphi
1
2
3
4
5
6
7
8
procedure TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 end;
 
end.

Причина кроется в том, что у вас функция не принадлежит классу TForm2. Поэтому она и не знает, что это за btnA.
Правильно должно быть так:

Delphi
1
2
3
4
5
6
7
8
procedure TForm2.TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 end;
 
end.

И специально чтобы избежать подобных ситуаций придумали сочетание клавиш Ctrl+Shift+C.

0

5552 / 4335 / 1385

Регистрация: 14.04.2014

Сообщений: 19,406

Записей в блоге: 19

19.11.2016, 12:00

3

еще надежнее двойной клик по кнопке, чтобы сразу назначить обработчик, а не просто метод класса

0

Каныш2901

0 / 0 / 0

Регистрация: 18.10.2016

Сообщений: 16

20.11.2016, 13:02

 [ТС]

4

Тоже самый код, но ошибка другая

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, DBCtrls, jpeg, ExtCtrls, Menus, Buttons;
 
  const maxSymbols=10;
 
 
type
  TForm2 = class(TForm)
    img1: TImage;
    lbl1: TLabel;
    ds1: TDataSource;
    dbmmo1: TDBMemo;
    tbl1: TADOTable;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    WordGroup: TGroupBox;
    Char1: TPanel;
    Char2: TPanel;
    Char3: TPanel;
    Char4: TPanel;
    Char5: TPanel;
    Char6: TPanel;
    Char7: TPanel;
    Char8: TPanel;
    Char9: TPanel;
    Char10: TPanel;
    BtnGroup: TGroupBox;
    BtnA: TSpeedButton;
    BtnB: TSpeedButton;
    BtnC: TSpeedButton;
    BtnG: TSpeedButton;
    BtnD: TSpeedButton;
    BtnH: TSpeedButton;
    BtnI: TSpeedButton;
    BtnE: TSpeedButton;
    BtnF: TSpeedButton;
    BtnJ: TSpeedButton;
    BtnK: TSpeedButton;
    BtnL: TSpeedButton;
    BtnM: TSpeedButton;
    BtnN: TSpeedButton;
    BtnO: TSpeedButton;
    BtnQ: TSpeedButton;
    BtnR: TSpeedButton;
    BtnS: TSpeedButton;
    BtnT: TSpeedButton;
    BtnP: TSpeedButton;
    BtnV: TSpeedButton;
    BtnW: TSpeedButton;
    BtnX: TSpeedButton;
    BtnU: TSpeedButton;
    BtnY: TSpeedButton;
    BtnZ: TSpeedButton;
    tEdit: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BtnAClick(Sender: TObject);
 
  private
    { Private declarations }
    procedure TForm2btnEnableAll;
    procedure Tform2btnDisable(ch:char);
    procedure BtnClick(ch:char);
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
var Buttons:set of 'A'..'Z';
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.show;
Form2.Hide;
end;
procedure TForm2.TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 BtnD.Enabled:=true;
 BtnE.Enabled:=true;
 BtnF.Enabled:=true;
 BtnG.Enabled:=true;
 BtnH.Enabled:=true;
 BtnI.Enabled:=true;
 BtnJ.Enabled:=true;
 BtnK.Enabled:=true;
 BtnL.Enabled:=true;
 BtnM.Enabled:=true;
 BtnN.Enabled:=true;
 BtnO.Enabled:=true;
 BtnP.Enabled:=true;
 BtnQ.Enabled:=true;
 BtnR.Enabled:=true;
 BtnS.Enabled:=true;
 BtnT.Enabled:=true;
 BtnU.Enabled:=true;
 BtnV.Enabled:=true;
 BtnW.Enabled:=true;
 BtnX.Enabled:=true;
 BtnY.Enabled:=true;
 BtnZ.Enabled:=true;
 end;
 
 procedure TForm2.Tform2btnDisable(ch:char);
 var c:char;
begin c:=upcase(ch);
if not (c in ['A'..'Z']) then exit;
 if (c in ['A'..'Z']) then exit;
 case c of
 'A': BtnA.Enabled:=false;
 'B': BtnB.Enabled:=false;
 'C': BtnC.Enabled:=false;
 'D': BtnD.Enabled:=false;
 'E': BtnE.Enabled:=false;
 'F': BtnF.Enabled:=false;
 'G': BtnG.Enabled:=false;
 'H': BtnH.Enabled:=false;
 'I': BtnI.Enabled:=false;
 'J': BtnJ.Enabled:=false;
 'K': BtnK.Enabled:=false;
 'L': BtnL.Enabled:=false;
 'M': BtnM.Enabled:=false;
 'N': BtnN.Enabled:=false;
 'O': BtnO.Enabled:=false;
 'P': BtnP.Enabled:=false;
 'Q': BtnQ.Enabled:=false;
 'R': BtnR.Enabled:=false;
 'S': BtnS.Enabled:=false;
 'T': BtnT.Enabled:=false;
 'U': BtnU.Enabled:=false;
 'V': BtnV.Enabled:=false;
 'W': BtnW.Enabled:=false;
 'X': BtnX.Enabled:=false;
 'Y': BtnY.Enabled:=false;
 'Z': BtnZ.Enabled:=false;
 end;
end;
 
 
 
procedure TForm2.BtnAClick(Sender: TObject);
begin
BtnAClick('A');
end;
 
end.

[Error] Unit2.pas(161): Incompatible types: ‘TObject’ and ‘Char’

0

5552 / 4335 / 1385

Регистрация: 14.04.2014

Сообщений: 19,406

Записей в блоге: 19

20.11.2016, 13:36

5

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

но ошибка тут

procedure TForm2.

BtnAClick(Sender: TObject);
begin
BtnAClick(‘A’);
end;

процедура вызывает сама себя. т.е. один раз нажал и через 1-5 сек вывалится Stack overflow
параметр описан как TObject
а передается ‘A’ — это очевидно char
так и написано в сообщении об ошибке

0

D1973

Модератор

8506 / 5663 / 2293

Регистрация: 21.01.2014

Сообщений: 24,314

Записей в блоге: 3

20.11.2016, 15:58

6

Каныш2901, жуть какая-то…

Delphi
1
2
3
4
5
6
7
procedure TForm2.TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 ...
 BtnZ.Enabled:=true;
end;

а вот так нельзя было сделать?

Delphi
1
2
3
4
5
6
procedure TForm2.TForm2btnEnableAll;
var i : integer;
begin
 for i := 0 to ControlCount - 1 do
  if Controls[i] is TSpeedButton then (Controls[i] as TSpeedButton).Enabled := false;
end;

Добавлено через 6 минут

Цитата
Сообщение от Каныш2901
Посмотреть сообщение

if not (c in [‘A’..’Z’]) then exit;
if (c in [‘A’..’Z’]) then exit;

Вот тоже шедевр: сами-то понимаете, какую чушь написали?
Перевожу:
1. Если с не входит в множество [‘A’ .. ‘Z’] тогда выходим.
2. Если с входит в множество [‘A’ .. ‘Z’] тогда выходим.
Вообще в чем сакральный смысл этой процедуры, если, независимо от того, входит с в это множество или нет — мы все равно тут же процедуру покидаем?

Добавлено через 7 минут
Еще один жутик…

Delphi
1
2
3
4
5
6
case c of
 'A': BtnA.Enabled:=false;
 'B': BtnB.Enabled:=false;
...
 'Z': BtnZ.Enabled:=false;
end;

Не по теме:

FindComponent? Не, не слыхали…

Delphi
1
2
3
4
5
var SB : TSpeedButton;
begin
 SB := FindComponent('Btn' + c) as TSpeedButton;
 SB.Enabled := false;
end;

0

Типов сообщений компилятора — более двухсот. Рассмотрим перечень наиболее встречающихся сообщений класса Error

  • 0. <Что-то1> expected but <Что-то2> found. Обычно это сообщение возникает при синтаксической ошибке.Например,в случае небаланса скобок,компилятор сообщит: ‘)’ expected but ‘;’ found (вместо ожидавшейся скобки найдена запятая).

    Компилятор часто сообщает, что ‘end’ ожидается,например:x:= 5,7; здесь неуместен разделитель-запятая, а сообщается про end. (‘END’ expected but ‘,’ found)

  • 1. <Имя> is not a type identifier. Данное <Имя> не является именем типа.
  • 2. ‘;’ not allowed before ‘Else’. Перед else нельзя ставить точку с запятой
  • 3. Abstract method must be virtual or dynamic. Абстрактный метод должен быть виртуальным или динамическим.
  • 4. Ambiguous overloaded call to <Имя блока>. Компилятор не может однозначно выбрать перегружаемый блок. Измените параметр.
  • 5. Array type required. Ошибка возникает в случаях, когда в индексе элемента массива указано больше уровней, чем предусмотрено описанием, и если массив не описан. Например, после объявления двумерного массива х или простой переменной х ошибочно записывают элемент х[2,1,1] (в нем показано три измерения).
  • 6. Assignment to FOR-loop variable <Имя>. Присваивание значения параметру FOR-цикла в теле цикла.

    Например, вследствие описки дважды используется имя i в кратном цикле:

    For i:= 1 to n do For i:= 1 to m do ...
    
  • 7. Break or Continue outside of loop. Break или Continue — не в цикле.
  • 8. Cannot initialize local variables. Локальные переменные запрещено инициализировать (задавать им значения при описании).
  • 9. Cannot assign to/read a read-only/write-only property. Присвоение значения свойству read/only и чтение свойства write/only запрещены.
  • 10. Constant expression expected.В этом месте должна стоять константа или константное выражение, например константа выбора в структуре Case.
  • 11. Constant expression violates subrange bounds. Выход значения константы из диапазона. Контроль не полон. Например, «сойдет с рук» присваивание x:=3000000000, где х имеет тип integer, но начение х будет искажено.
  • 12. Constant or type identifier expected. Требуется имя типа или тип-диапазон.
  • 13. Could not compile used unit <Имя>. Компиляция присоединенного модуля <Имя> невозможна.
  • 14. Data type too large. Тип определяет структуру размером более 2 Гбайт; это слишком много.
  • 15. Declaration expected but <Что-то> found. Пропущено описание или оператор.
  • 16. Declaration of <Имя> differs from previous declarations… Данный заголовок блока не соответствует упреждающему объявлению блока.
  • 17. Default parameter <Имя> must be by-value or constant. Необязательный параметр (со значением по умолчанию) не должен вызываться по ссылке.
  • 18. Expression expected. В этом месте программы должно стоять выражение.
  • 19. Expression too complicated. Выражение излишне сложно для компиляции.
  • 20. File type not allowed here. В этом месте или в этой роли файловую переменную нельзя использовать. Например, она не может быть формальным параметром-значением.
  • 21. For loop control variable must be simple local variable. Параметр цикла должен быть простой локальной (описанной в этом же блоке) переменной.
  • 22. For loop control variable must have ordinal type. Параметр цикла должен иметь порядковый тип.Вещественный тип запрещен.
  • 23. Function needs result type. В заголовке функции надо указывать тип ее результата.
  • 24. Identifier expected but <Что-то> found. В этом месте должно стоять имя. Например, пропущено имя функции после Function.
  • 25. Identifier redeclared <Имя>.<Имя> описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока.
  • 26. Illegal character in input file <знак>. Запретный знак, например «русская» буква, либо вы оставили скобку }, убрав открывающую скобку {.
  • 27. Illegal type in Read/Readln (Write/Writeln) statement. Элемент запрещенного типа в списке ввода/вывода.
  • 28. Incompatible types <указание типов>. Несоответствие типов по присваиванию или типов операндов одной операции. Сообщение выдается и при неверном использовании структур. Например, z — запись, ошибочно записано присваивание z:= 0 (работать надо с полями записи).
  • 29. Invalid function result type. Недопустимый тип результата функции.
  • 30. Label already defined: <Метка>. <Метка> уже помечает другой оператор.
  • 31. Left side cannot be assigned to. He может быть такой левой части в присваивании. Примеры: попытка присвоить значение файловой переменной, присвоение значения формальному параметру-константе.
  • 32. Line too long. В строке программного текста больше 255 знаков.
  • 33. Low bound exceeds high bound. Нижняя граница превышает верхнюю.
  • 34. Missing operator or semicolon.Пропуск операции (например перед скобкой) или пропуск точки с запятой. При пропуске ‘;’ маркер ошибки стоит на очередном предложении (объявлении или операторе).
  • 35. Missing parameter type. He указан тип формального параметра-значения или параметра процедурного типа.
  • 36. Not enough actual parameters. He хватает фактических параметров.
  • 37. Need to specify at least one dimension … Нужно задавать в операторе SetLength хотя бы один размер динамического массива.
  • 38. Number of elements differs from declaration. Число элементов в структурной константе не соответствует ее описанию.
  • 39. Operator not applicable to this operand type. Операция не применима к операндам данного типа. Например: ‘А’ or ‘В’; ‘Text1’* ‘Text2’.
  • 40. Order of fields in record constant differs from declaration. Порядок полей в записи-константе не соответствует описанию записи.
  • 41. Ordinal type required. Требуется порядковый тип (например, в индексе).
  • 42. Out of memory. Компилятору не хватает памяти.
  • 43. Statement expected but <Что-то> found. В этом месте должен стоять оператор. Сообщение выдается во всех случаях, когда в тело блока или секцию инициализации ошибочно помещают описание (<Что-то>). Ошибочная форма обращения к процедуре Procedure <Имя> или к функции Function <Имя> также вызывает сообщение.
  • 44. Sets may have at most 256 elements. Множество (тип Set) не может содержать более 256 элементов.
  • 45. Slice standard function only allowed as open array argument. Функцию Slice можно использовать лишь как фактический параметр
  • 46. Statement not allowed in interface part. Предложения в секции интерфейса программного модуля недопустимы.
  • 47. Syntax error in real number. Синтаксическая ошибка в записи числа вещственного типа.
  • 48. There is no overload version of <Имя> that can be called with these arguments.Не предусмотрен перегружаемый блок <Имя>, который мог бы вызываться с таким аргументом. Пример: IntToStr(x), где х – выражение вещественного типа.
  • 49. Too many actual parameters. Фактических параметров больше, чем формальных.
  • 50. Type actual and formal var parameters must be identical. Тип фактического параметра должен быть идентичен типу формального параметра-переменной.
  • 51. Type of expression must be <Тип>. Выражение должно быть указанного типа. Например,после While и Until должно стоять логическое выражение.
  • 52. Undeclared identifier: <Имя>.Не описано <Имя>. Проверьте есть ли описание в нужном месте,нет ли описок в имени. Если указано имя компонента формы, проверьте,поместили ли компонент на данную форму.
  • 53. Unexpected end of file in comment started on line <N>. Неожиданный конец файла при незавершенном комментарии, начало комментария — в строке N.
  • 54. Unit name mismatch: <Имя>. Имя модуля ошибочно.
  • 55. Unsatisfied forward or external declaration <Имя>. Отсутствует описание блока, объявление которого было дано (заголовок в интерфейсе или в описании объектного типа, либо упреждающее описание).
  • 56. Unterminate string. He закрыта апострофом строка-константа типа string.

Рассмотрим также некоторые сообщения классов 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 Compiler Error

E2003 Undeclared identifier ‘%s’

Reason for the Error & Solution

The compiler could not find the given identifier – most likely it has been misspelled either at the point of declaration or the point of use. It might be from another unit that has not mentioned a uses clause.

program Produce;
var
Counter: Integer;
begin
Count := 0;
Inc(Count);
Writeln(Count);
end.

In the example, the variable has been declared as “Counter”, but used as “Count”. The solution is to either change the declaration or the places where the variable is used.

program Solve;
var
Count: Integer;
begin
Count := 0;
Inc(Count);
Writeln(Count);
end.

In the example we have chosen to change the declaration – that was less work.

Перейти к контенту

Каныш2901

0 / 0 / 0

Регистрация: 18.10.2016

Сообщений: 16

1

19.11.2016, 11:12. Показов 23309. Ответов 5

Метки нет (Все метки)


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, DBCtrls, jpeg, ExtCtrls, Menus, Buttons;
 
  const maxSymbols=10;
 
 
type
  TForm2 = class(TForm)
    img1: TImage;
    lbl1: TLabel;
    ds1: TDataSource;
    dbmmo1: TDBMemo;
    tbl1: TADOTable;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    WordGroup: TGroupBox;
    Char1: TPanel;
    Char2: TPanel;
    Char3: TPanel;
    Char4: TPanel;
    Char5: TPanel;
    Char6: TPanel;
    Char7: TPanel;
    Char8: TPanel;
    Char9: TPanel;
    Char10: TPanel;
    BtnGroup: TGroupBox;
    BtnA: TSpeedButton;
    BtnB: TSpeedButton;
    BtnC: TSpeedButton;
    BtnG: TSpeedButton;
    BtnD: TSpeedButton;
    BtnH: TSpeedButton;
    BtnI: TSpeedButton;
    BtnE: TSpeedButton;
    BtnF: TSpeedButton;
    BtnJ: TSpeedButton;
    BtnK: TSpeedButton;
    BtnL: TSpeedButton;
    BtnM: TSpeedButton;
    BtnN: TSpeedButton;
    BtnO: TSpeedButton;
    BtnQ: TSpeedButton;
    BtnR: TSpeedButton;
    BtnS: TSpeedButton;
    BtnT: TSpeedButton;
    BtnP: TSpeedButton;
    BtnV: TSpeedButton;
    BtnW: TSpeedButton;
    BtnX: TSpeedButton;
    BtnU: TSpeedButton;
    BtnY: TSpeedButton;
    BtnZ: TSpeedButton;
    tEdit: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
 
  private
    { Private declarations }
     procedure TForm2btnEnableAll;
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.show;
Form2.Hide;
end;
procedure TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 end;
 
end.

Ошибка:
[Error] Unit2.pas(90): Undeclared identifier: ‘BtnA’
[Error] Unit2.pas(91): Undeclared identifier: ‘BtnB’
[Error] Unit2.pas(92): Undeclared identifier: ‘BtnC’

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Nanotentacle

884 / 404 / 174

Регистрация: 20.10.2016

Сообщений: 1,828

19.11.2016, 11:16

2

Delphi
1
2
3
4
5
6
7
8
procedure TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 end;
 
end.

Причина кроется в том, что у вас функция не принадлежит классу TForm2. Поэтому она и не знает, что это за btnA.
Правильно должно быть так:

Delphi
1
2
3
4
5
6
7
8
procedure TForm2.TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 end;
 
end.

И специально чтобы избежать подобных ситуаций придумали сочетание клавиш Ctrl+Shift+C.

0

5425 / 4253 / 1371

Регистрация: 14.04.2014

Сообщений: 19,156

Записей в блоге: 19

19.11.2016, 12:00

3

еще надежнее двойной клик по кнопке, чтобы сразу назначить обработчик, а не просто метод класса

0

Каныш2901

0 / 0 / 0

Регистрация: 18.10.2016

Сообщений: 16

20.11.2016, 13:02

 [ТС]

4

Тоже самый код, но ошибка другая

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, DBCtrls, jpeg, ExtCtrls, Menus, Buttons;
 
  const maxSymbols=10;
 
 
type
  TForm2 = class(TForm)
    img1: TImage;
    lbl1: TLabel;
    ds1: TDataSource;
    dbmmo1: TDBMemo;
    tbl1: TADOTable;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    WordGroup: TGroupBox;
    Char1: TPanel;
    Char2: TPanel;
    Char3: TPanel;
    Char4: TPanel;
    Char5: TPanel;
    Char6: TPanel;
    Char7: TPanel;
    Char8: TPanel;
    Char9: TPanel;
    Char10: TPanel;
    BtnGroup: TGroupBox;
    BtnA: TSpeedButton;
    BtnB: TSpeedButton;
    BtnC: TSpeedButton;
    BtnG: TSpeedButton;
    BtnD: TSpeedButton;
    BtnH: TSpeedButton;
    BtnI: TSpeedButton;
    BtnE: TSpeedButton;
    BtnF: TSpeedButton;
    BtnJ: TSpeedButton;
    BtnK: TSpeedButton;
    BtnL: TSpeedButton;
    BtnM: TSpeedButton;
    BtnN: TSpeedButton;
    BtnO: TSpeedButton;
    BtnQ: TSpeedButton;
    BtnR: TSpeedButton;
    BtnS: TSpeedButton;
    BtnT: TSpeedButton;
    BtnP: TSpeedButton;
    BtnV: TSpeedButton;
    BtnW: TSpeedButton;
    BtnX: TSpeedButton;
    BtnU: TSpeedButton;
    BtnY: TSpeedButton;
    BtnZ: TSpeedButton;
    tEdit: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BtnAClick(Sender: TObject);
 
  private
    { Private declarations }
    procedure TForm2btnEnableAll;
    procedure Tform2btnDisable(ch:char);
    procedure BtnClick(ch:char);
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
var Buttons:set of 'A'..'Z';
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.show;
Form2.Hide;
end;
procedure TForm2.TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 BtnC.Enabled:=true;
 BtnD.Enabled:=true;
 BtnE.Enabled:=true;
 BtnF.Enabled:=true;
 BtnG.Enabled:=true;
 BtnH.Enabled:=true;
 BtnI.Enabled:=true;
 BtnJ.Enabled:=true;
 BtnK.Enabled:=true;
 BtnL.Enabled:=true;
 BtnM.Enabled:=true;
 BtnN.Enabled:=true;
 BtnO.Enabled:=true;
 BtnP.Enabled:=true;
 BtnQ.Enabled:=true;
 BtnR.Enabled:=true;
 BtnS.Enabled:=true;
 BtnT.Enabled:=true;
 BtnU.Enabled:=true;
 BtnV.Enabled:=true;
 BtnW.Enabled:=true;
 BtnX.Enabled:=true;
 BtnY.Enabled:=true;
 BtnZ.Enabled:=true;
 end;
 
 procedure TForm2.Tform2btnDisable(ch:char);
 var c:char;
begin c:=upcase(ch);
if not (c in ['A'..'Z']) then exit;
 if (c in ['A'..'Z']) then exit;
 case c of
 'A': BtnA.Enabled:=false;
 'B': BtnB.Enabled:=false;
 'C': BtnC.Enabled:=false;
 'D': BtnD.Enabled:=false;
 'E': BtnE.Enabled:=false;
 'F': BtnF.Enabled:=false;
 'G': BtnG.Enabled:=false;
 'H': BtnH.Enabled:=false;
 'I': BtnI.Enabled:=false;
 'J': BtnJ.Enabled:=false;
 'K': BtnK.Enabled:=false;
 'L': BtnL.Enabled:=false;
 'M': BtnM.Enabled:=false;
 'N': BtnN.Enabled:=false;
 'O': BtnO.Enabled:=false;
 'P': BtnP.Enabled:=false;
 'Q': BtnQ.Enabled:=false;
 'R': BtnR.Enabled:=false;
 'S': BtnS.Enabled:=false;
 'T': BtnT.Enabled:=false;
 'U': BtnU.Enabled:=false;
 'V': BtnV.Enabled:=false;
 'W': BtnW.Enabled:=false;
 'X': BtnX.Enabled:=false;
 'Y': BtnY.Enabled:=false;
 'Z': BtnZ.Enabled:=false;
 end;
end;
 
 
 
procedure TForm2.BtnAClick(Sender: TObject);
begin
BtnAClick('A');
end;
 
end.

[Error] Unit2.pas(161): Incompatible types: ‘TObject’ and ‘Char’

0

5425 / 4253 / 1371

Регистрация: 14.04.2014

Сообщений: 19,156

Записей в блоге: 19

20.11.2016, 13:36

5

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

но ошибка тут

procedure TForm2.

BtnAClick(Sender: TObject);
begin
BtnAClick(‘A’);
end;

процедура вызывает сама себя. т.е. один раз нажал и через 1-5 сек вывалится Stack overflow
параметр описан как TObject
а передается ‘A’ — это очевидно char
так и написано в сообщении об ошибке

0

D1973

Модератор

8220 / 5458 / 2244

Регистрация: 21.01.2014

Сообщений: 23,484

Записей в блоге: 3

20.11.2016, 15:58

6

Каныш2901, жуть какая-то…

Delphi
1
2
3
4
5
6
7
procedure TForm2.TForm2btnEnableAll;
begin
 BtnA.Enabled:=true;
 BtnB.Enabled:=true;
 ...
 BtnZ.Enabled:=true;
end;

а вот так нельзя было сделать?

Delphi
1
2
3
4
5
6
procedure TForm2.TForm2btnEnableAll;
var i : integer;
begin
 for i := 0 to ControlCount - 1 do
  if Controls[i] is TSpeedButton then (Controls[i] as TSpeedButton).Enabled := false;
end;

Добавлено через 6 минут

Цитата
Сообщение от Каныш2901
Посмотреть сообщение

if not (c in [‘A’..’Z’]) then exit;
if (c in [‘A’..’Z’]) then exit;

Вот тоже шедевр: сами-то понимаете, какую чушь написали?
Перевожу:
1. Если с не входит в множество [‘A’ .. ‘Z’] тогда выходим.
2. Если с входит в множество [‘A’ .. ‘Z’] тогда выходим.
Вообще в чем сакральный смысл этой процедуры, если, независимо от того, входит с в это множество или нет — мы все равно тут же процедуру покидаем?

Добавлено через 7 минут
Еще один жутик…

Delphi
1
2
3
4
5
6
case c of
 'A': BtnA.Enabled:=false;
 'B': BtnB.Enabled:=false;
...
 'Z': BtnZ.Enabled:=false;
end;

Не по теме:

FindComponent? Не, не слыхали…

Delphi
1
2
3
4
5
var SB : TSpeedButton;
begin
 SB := FindComponent('Btn' + c) as TSpeedButton;
 SB.Enabled := false;
end;

0

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,2763 gold badges33 silver badges46 bronze badges

5

Типов сообщений компилятора — более двухсот. Рассмотрим перечень наиболее встречающихся сообщений класса Error

  • 0. <Что-то1> expected but <Что-то2> found. Обычно это сообщение возникает при синтаксической ошибке.Например,в случае небаланса скобок,компилятор сообщит: ‘)’ expected but ‘;’ found (вместо ожидавшейся скобки найдена запятая).

    Компилятор часто сообщает, что ‘end’ ожидается,например:x:= 5,7; здесь неуместен разделитель-запятая, а сообщается про end. (‘END’ expected but ‘,’ found)

  • 1. <Имя> is not a type identifier. Данное <Имя> не является именем типа.
  • 2. ‘;’ not allowed before ‘Else’. Перед else нельзя ставить точку с запятой
  • 3. Abstract method must be virtual or dynamic. Абстрактный метод должен быть виртуальным или динамическим.
  • 4. Ambiguous overloaded call to <Имя блока>. Компилятор не может однозначно выбрать перегружаемый блок. Измените параметр.
  • 5. Array type required. Ошибка возникает в случаях, когда в индексе элемента массива указано больше уровней, чем предусмотрено описанием, и если массив не описан. Например, после объявления двумерного массива х или простой переменной х ошибочно записывают элемент х[2,1,1] (в нем показано три измерения).
  • 6. Assignment to FOR-loop variable <Имя>. Присваивание значения параметру FOR-цикла в теле цикла.

    Например, вследствие описки дважды используется имя i в кратном цикле:

    For i:= 1 to n do For i:= 1 to m do ...
    
  • 7. Break or Continue outside of loop. Break или Continue — не в цикле.
  • 8. Cannot initialize local variables. Локальные переменные запрещено инициализировать (задавать им значения при описании).
  • 9. Cannot assign to/read a read-only/write-only property. Присвоение значения свойству read/only и чтение свойства write/only запрещены.
  • 10. Constant expression expected.В этом месте должна стоять константа или константное выражение, например константа выбора в структуре Case.
  • 11. Constant expression violates subrange bounds. Выход значения константы из диапазона. Контроль не полон. Например, «сойдет с рук» присваивание x:=3000000000, где х имеет тип integer, но начение х будет искажено.
  • 12. Constant or type identifier expected. Требуется имя типа или тип-диапазон.
  • 13. Could not compile used unit <Имя>. Компиляция присоединенного модуля <Имя> невозможна.
  • 14. Data type too large. Тип определяет структуру размером более 2 Гбайт; это слишком много.
  • 15. Declaration expected but <Что-то> found. Пропущено описание или оператор.
  • 16. Declaration of <Имя> differs from previous declarations… Данный заголовок блока не соответствует упреждающему объявлению блока.
  • 17. Default parameter <Имя> must be by-value or constant. Необязательный параметр (со значением по умолчанию) не должен вызываться по ссылке.
  • 18. Expression expected. В этом месте программы должно стоять выражение.
  • 19. Expression too complicated. Выражение излишне сложно для компиляции.
  • 20. File type not allowed here. В этом месте или в этой роли файловую переменную нельзя использовать. Например, она не может быть формальным параметром-значением.
  • 21. For loop control variable must be simple local variable. Параметр цикла должен быть простой локальной (описанной в этом же блоке) переменной.
  • 22. For loop control variable must have ordinal type. Параметр цикла должен иметь порядковый тип.Вещественный тип запрещен.
  • 23. Function needs result type. В заголовке функции надо указывать тип ее результата.
  • 24. Identifier expected but <Что-то> found. В этом месте должно стоять имя. Например, пропущено имя функции после Function.
  • 25. Identifier redeclared <Имя>.<Имя> описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока.
  • 26. Illegal character in input file <знак>. Запретный знак, например «русская» буква, либо вы оставили скобку }, убрав открывающую скобку {.
  • 27. Illegal type in Read/Readln (Write/Writeln) statement. Элемент запрещенного типа в списке ввода/вывода.
  • 28. Incompatible types <указание типов>. Несоответствие типов по присваиванию или типов операндов одной операции. Сообщение выдается и при неверном использовании структур. Например, z — запись, ошибочно записано присваивание z:= 0 (работать надо с полями записи).
  • 29. Invalid function result type. Недопустимый тип результата функции.
  • 30. Label already defined: <Метка>. <Метка> уже помечает другой оператор.
  • 31. Left side cannot be assigned to. He может быть такой левой части в присваивании. Примеры: попытка присвоить значение файловой переменной, присвоение значения формальному параметру-константе.
  • 32. Line too long. В строке программного текста больше 255 знаков.
  • 33. Low bound exceeds high bound. Нижняя граница превышает верхнюю.
  • 34. Missing operator or semicolon.Пропуск операции (например перед скобкой) или пропуск точки с запятой. При пропуске ‘;’ маркер ошибки стоит на очередном предложении (объявлении или операторе).
  • 35. Missing parameter type. He указан тип формального параметра-значения или параметра процедурного типа.
  • 36. Not enough actual parameters. He хватает фактических параметров.
  • 37. Need to specify at least one dimension … Нужно задавать в операторе SetLength хотя бы один размер динамического массива.
  • 38. Number of elements differs from declaration. Число элементов в структурной константе не соответствует ее описанию.
  • 39. Operator not applicable to this operand type. Операция не применима к операндам данного типа. Например: ‘А’ or ‘В’; ‘Text1’* ‘Text2’.
  • 40. Order of fields in record constant differs from declaration. Порядок полей в записи-константе не соответствует описанию записи.
  • 41. Ordinal type required. Требуется порядковый тип (например, в индексе).
  • 42. Out of memory. Компилятору не хватает памяти.
  • 43. Statement expected but <Что-то> found. В этом месте должен стоять оператор. Сообщение выдается во всех случаях, когда в тело блока или секцию инициализации ошибочно помещают описание (<Что-то>). Ошибочная форма обращения к процедуре Procedure <Имя> или к функции Function <Имя> также вызывает сообщение.
  • 44. Sets may have at most 256 elements. Множество (тип Set) не может содержать более 256 элементов.
  • 45. Slice standard function only allowed as open array argument. Функцию Slice можно использовать лишь как фактический параметр
  • 46. Statement not allowed in interface part. Предложения в секции интерфейса программного модуля недопустимы.
  • 47. Syntax error in real number. Синтаксическая ошибка в записи числа вещственного типа.
  • 48. There is no overload version of <Имя> that can be called with these arguments.Не предусмотрен перегружаемый блок <Имя>, который мог бы вызываться с таким аргументом. Пример: IntToStr(x), где х – выражение вещественного типа.
  • 49. Too many actual parameters. Фактических параметров больше, чем формальных.
  • 50. Type actual and formal var parameters must be identical. Тип фактического параметра должен быть идентичен типу формального параметра-переменной.
  • 51. Type of expression must be <Тип>. Выражение должно быть указанного типа. Например,после While и Until должно стоять логическое выражение.
  • 52. Undeclared identifier: <Имя>.Не описано <Имя>. Проверьте есть ли описание в нужном месте,нет ли описок в имени. Если указано имя компонента формы, проверьте,поместили ли компонент на данную форму.
  • 53. Unexpected end of file in comment started on line <N>. Неожиданный конец файла при незавершенном комментарии, начало комментария — в строке N.
  • 54. Unit name mismatch: <Имя>. Имя модуля ошибочно.
  • 55. Unsatisfied forward or external declaration <Имя>. Отсутствует описание блока, объявление которого было дано (заголовок в интерфейсе или в описании объектного типа, либо упреждающее описание).
  • 56. Unterminate string. He закрыта апострофом строка-константа типа string.

Рассмотрим также некоторые сообщения классов 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, в случае если делитель — константное выражение.

Часть II. Delphi

Enter

Получение элементом управления

фокуса

Exit

Потеря элементом управления

фокуса

Текст сообщения

Причина ошибки

Array type required

Требуется массив.

Assignment to FOR-Loop variable

Переменная — параметр цикла FOR

‘<Имя>’

не может изменяться внутри цикла.

Assignment to FOR-Loop variable

Переменная — параметра цикла

‘<Имя>’

FOR может иметь неопределённое

значение после выполнения этого

цикла.

Case label outside of range of case

Значения указанные в операторе

expression

CASE таковы, что селектор не может

их принимать.

Compile terminated by user

Компиляция прервана

пользователем клавишами Ctrl и

Break.

Constant expression expected

Ожидалось выражение состоящее

из одних констант.

Constant expression violates

Константное выражение выходит

subrange bounds

за пределы заданного интервала.

Could not create output file

Невозможно создать exe-файл.

Declaration of <Имя> differs from

Текущее декларирование

previous declaration

отличается от предыдущего.

Division by zero

Выполняется деление на нуль.

Duplicate case label

Значения в операторе CASE

повторяются.

EXCEPT or FINALLY expected

Ожидается секция исключений

оператора TRY.

Expression has no value

Выражение не возвращает после

себя никакого значения.

File not found: ‘<Имя_файла>.dcu’

Файл внешнего модуля не был

обнаружен в текущем каталоге.

Часть II. Delphi

File not found: <Имя_файла>

Не был найден указанный файл.

File type not allowed here

Файловый тип в данном месте не

позволителен. Файловая переменная

может передаваться в подпрограмму

только как параметр — переменная.

FOR-Loop variable ‘<Имя>’ cannot

Переменная — параметр цикла не

be passed as var parameter

может передаваться в подпрограмму

как параметр. Она должна быть

описана локально.

For loop control variable must be

Переменная — параметр цикла FOR

simple local variable

должна быть описана локально.

For loop control variable must have

Переменная параметра цикла FOR

ordinal type

может быть целого, символьного

либо перечислимого типов.

FOR or WHILE loop executes zero

Цикл FOR или WHILE не будет

times — deleted

выполняться ни разу и поэтому

удален.

Function needs result type

Была определена функция в

которой не определено

результирующее значение.

Identifier redeclared: ‘<Имя>’

Повторно был описан указанный

идентификатор. Все имена в

программе должны быть уникальны.

Illegal character in input file:

В программе были обнаружены

‘<Символ>’ ($)

недопустимые символы.

Illegal type in Read/Readln statement

Несовместимость типов при

вызове оператора ввода.

Illegal type in Write/Writeln statement

Несовместимость типов при

вызове оператора вывода.

Inaccessible value

Значение данной переменной не

доступно либо не определено.

Incompatible types

Несовместимость типов.

Incompatible types: ‘<Тип1>’ and

Имеет место несовместимость

‘<Тип2>’

указанных типов.

Internal error: <Код_ошибки>

Внутренняя ошибка.

Invalid function result type

Была определена функция, в

которой выходное значение не

совместимо по типу с указанным в

Часть II. Delphi

заголовке.

Label already defined:

Указанная метка уже была

‘<Имя_метки>’

определена.

Left side cannot be assigned to

Имеет место попытка изменить

значение константы.

Line too long (more than 255

Строка слишком длинна.

characters)

Low bound exceeds high bound

Нижняя граница диапазона

определена большей чем верхняя

граница.

Method identifier expected

Требуется указать название

метода.

Missing operator or semicolon

Пропущен оператор либо точка с

запятой.

Missing parameter type

Формальные параметры

подпрограммы даны без указания

типов.

Not enough actual parameters

При вызове какой — либо

процедуры или функции было

указано недостаточное количество

фактических параметров.

Object type required

Требуется объект.

Operator not applicable to this

Оператор не предназначен для

operand type

работы с операндами данного типа.

Ordinal type required

В данном месте требуется

скалярный тип.

Pointer type required

Требуется указатель.

Procedure cannot have a result type

Процедура не может иметь

результирующего значения. В таких

случаях нужно использовать

функцию.

PROCEDURE or FUNCTION

В данном месте ожидается

expected

процедура либо функция.

Record, object or class type required

Требуется запись, объект или

класс.

Return value of function

Выходное значение указанной

‘<Имя_функции>’ might be undefined

функции может быть не определено.

Statement expected, but expression

Ожидался оператор, но было

Часть II. Delphi

of type ‘<Тип>’ found

обнаружено выражение указанного

типа.

String constant truncated to fit

Строковая константа укорочена.

STRING[<Номер>]

Syntax error in real number

Ошибка при написании

действительного числа.

Text after final ‘END.’ — ignored by

Текст, написанный в программе

compiler

после последнего END был

игнорирован.

Too many actual parameters

При вызове какой — либо

процедуры или функции было

указано слишком большое

количество фактических

параметров.

Type of expression must be

Тип выражения должен быть

BOOLEAN

логическим. Имеет место

несовместимость типов.

Type of expression must be

Тип выражения должен быть

INTEGER

целым. Имеет место

несовместимость типов.

Types of actual and formal var

Типы формальных и фактических

parameters must be identical

параметров должны совпадать.

Incompatible types

Несовместимые типы. В

инструкции присваивания тип

выражения не соответствует или не

может быть приведен к типу

переменной, получающей значение

выражения.

Тип фактического параметра

процедуры или функции не

соответствует или не может быть

приведен к типу формального

параметра

Undeclared identifier: ‘<Имя>’

Неизвестный идентификатор,

либо оператор написан с ошибкой.

Unexpected end of file in comment

Комментарий начатый в

started on line <Номер>

указанной строке не закрыт.

Понравилась статья? Поделить с друзьями:
  • Делонги кофемашина ошибки на панели приборов
  • Делонги кофемашина сбросить ошибку
  • Делонги кофемашина сброс ошибки
  • Делонги кофемашина ошибка слишком мелкий помол
  • Деление таксономическое и мереологическое правила деления ошибки классификация