Undeclared identifier delphi что это значит
Перейти к содержимому

Undeclared identifier delphi что это значит

Undeclared identifier delphi что это значит

Была у меня прога (хотя исходный текст ее писал не я — я только как начинающий развиваю ее), в которой есть модуль MainFormUnit примерно такой структуры:

unit MainFormUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes.
type
 TMainForm = class(TForm)
   Button2: TButton;
   Button4: TButton;
   ComboBox1: TComboBox;
.
var  MainForm: TMainForm;.
procedure TMainForm.Button2Click(Sender:TObject);
begin
.
(основной цикл)
.
end;
end.

Недавно основной цикл программы понадобилось запускать из разных мест, поэтому я выделил его в отдельную процедуру:

unit MainFormUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes.
type
 TMainForm = class(TForm)
   Button2: TButton;
   Button4: TButton;
   ComboBox1: TComboBox;
.
var  MainForm: TMainForm;.

procedure TMainForm.Button2Click(Sender:TObject);
begin
Main_cycle("",false);
end;

procedure TMainForm.Button1Click(Sender:TObject);
begin
.
Main_cycle("abc",true);
end;

procedure Main_cycle(. );
begin
.
(основной цикл)
.
end;
end.

и теперь при попытке компиляции выводится следующая ругань:

Undeclared identifier: "Button2"
Undeclared identifier: "Button4"
Undeclared identifier: "ComboBox2"
.

В чем может быть дело?


Романов Р.В. ©   ( 2004-04-12 09:53 ) [1]

Область видимости переменных изменилась.
Поставь в цикле MainForm.Button2 или лучше сделай Main_cycle методом формы.


Digitman ©   ( 2004-04-12 09:54 ) [2]

сделай Main_cycle() методом класса TMainForm


cvg ©   ( 2004-04-12 10:03 ) [3]

А пример записи можно? А то я слишком ламер еще :((


Романов Р.В. ©   ( 2004-04-12 10:13 ) [4]

Button1Click — метод формы. Делай по аналогии.

добавил
   procedure Main_cycle(FN:string;ob:Boolean);

"после" — понятие растяжимое

объяви метод конкретно в private-секции класса


cvg ©   ( 2004-04-12 10:46 ) [7]

"После" значит "сразу после". Вот тут мне умный фрэнд подсказал, что вызов Main_cycle теперь должен выглядеть как

Теперь, вроде, она по-другому уже ругается.


Anatoly Podgoretsky ©   ( 2004-04-12 10:52 ) [8]

Это не вызов, а объявление, при том неизвестно где.
И теперь ты предлагаешь нам догадаться как?


Андрей Сенченко ©   ( 2004-04-12 10:58 ) [9]

cvg ©   (12.04.04 10:46) [7]

Послушай Мастеров. Попробую объяснить простым языком.

Проблема в том, что Твои собственные процедуры и функции НИКАК НЕ ПРИВЯЗАНЫ к форме, поэтому даже в пределах юнита, в котором объявлена эта форма они не могут использовать напрямую элементы этой формы ( кнопки, боксы и прочее ). Вариантов выхода 2 :

1. Объявить Твою процедуру или функцию в PRIVATE секции объявления формы
2. При написании кода везде использовать ПОЛНЫЕ имена элементов — с привязкой к имени формы, на которой они находятся
Имя_формы.Имя_элемента()

русский язык понимаешь ?
размести декларацию метода в private-секции класса TMainForm !


cvg ©   ( 2004-04-12 11:07 ) [11]

Ну вот я, получается, полное имя и использовал.


Андрей Сенченко ©   ( 2004-04-12 11:10 ) [12]

cvg ©   (12.04.04 11:07) [11]

Приведи пожалуйста следующие куски кода :
1. Объявление Твоей формы ( полностью ).
2. Объявление процедуры, в которой происходят ошибки.
3. Строки кода, где происходит обращение к элементам формы.

Что-то Ты делаешь не так.


Anatoly Podgoretsky ©   ( 2004-04-12 11:14 ) [13]

cvg ©   (12.04.04 11:07) [11]
Не верю, чей копирайт говорить не буду.


cvg ©   ( 2004-04-12 11:21 ) [14]

Да не, там, вроде мой последний варипнт она уже скушала. Хотя не совсем. Пишет:

Unsatisfied forward or external declaration: "TMainForm.Button2Click"
Unsatisfied forward or external declaration: "TMainForm.FormCreate"
Unsatisfied forward or external declaration: "TMainForm.Button1Click"

А вот объявление формы:

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, OleServer, ClipBrd, StrUtils, ExcelXP, math,
 ketools, DateUtils, RpMemo, TeeProcs, TeEngine, Chart, Series, BubbleCh;

type
 STR_ARR = array [1..6] of string;
 TMainForm = class(TForm)
   Button2: TButton;
   Button4: TButton;
   ComboBox1: TComboBox;
   Edit5: TEdit;
   Edit2: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   Edit3: TEdit;
   Edit4: TEdit;
   Label3: TLabel;
   Label4: TLabel;
   Label5: TLabel;
   verkauft: TLabel;
   gekauft: TLabel;
   Zeit: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   ar1_0: TLabel;
   ar1_1: TLabel;
   ar1_2: TLabel;
   ar2_0: TLabel;
   ar2_1: TLabel;
   ar2_2: TLabel;
   _delta: TLabel;
   Label8: TLabel;
   Label9: TLabel;
   _count: TLabel;
   Excel: TExcelApplication;
   ComboBox2: TComboBox;
   Label11: TLabel;
   in_shares: TLabel;
   Label12: TLabel;
   im_Geld: TLabel;
   Label13: TLabel;
   in_shares_: TLabel;
   tempo: TLabel;
   Edit1: TEdit;
   Edit6: TEdit;
   Label10: TLabel;
   im_Geld_: TLabel;
   Label14: TLabel;
   Label17: TLabel;
   Edit7: TEdit;
   Label15: TLabel;
   _ma: TLabel;
   Label16: TLabel;
   Label18: TLabel;
   Chart1: TChart;
   Series1: TLineSeries;
   Series2: TLineSeries;
   Series3: TLineSeries;
   Series4: TPointSeries;
   Series5: TPointSeries;
   Series6: TPointSeries;
   Series7: TPointSeries;
   OpenDialog1: TOpenDialog;
   Button1: TButton;
   procedure Button2Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Main_cycle(FN:string;ob:Boolean);
 private
   < Private declarations >
 public
   < Public declarations >
 end;

А вот сами процедуры:

procedure TMainForm.Button2Click(Sender:TObject);
begin
Main_cycle("",false);
end;

procedure TMainForm.Button1Click(Sender: TObject);
var list:TStringList; line:string; F:textfile; lines:array of string;
val:array of double;
begin
SetLength(val,3);
OpenDialog1.Filter := "Text files|*.txt|All files|*.*";
OpenDialog1.Title := "&#194;&#251;&#225;&#229;&#240;&#232;&#242;&#229; &#244;&#224;&#233;&#235; &#241; &#228;&#224;&#237;&#237;&#251;&#236;&#232;";
OpenDialog1.FilterIndex := 1;
if OpenDialog1.Execute
then Main_cycle(F,true);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  ComboBox1.ItemIndex := 11;
  ComboBox2.ItemIndex := done1;
  Edit4.Text := floattostr(diff);
  Edit3.Text := inttostr(in_lot);
  Edit1.Text := floattostr(hook);
  Edit6.Text := my_count;
  Edit5.Text := inttostr(parts);
  Edit7.Text := inttostr(_size);
  Edit2.Text := floattostr(step);


Anatoly Podgoretsky ©   ( 2004-04-12 11:24 ) [15]

Ты так и будешь над нами смеяться?


Oyster ©   ( 2004-04-12 11:25 ) [16]

А если попробовать Main_Cycle перед теми местами, с которых она вызывается, поставить?


Digitman ©   ( 2004-04-12 11:25 ) [17]

упрямство, достойное уважения любого осла


cvg ©   ( 2004-04-12 11:30 ) [18]

Над кем я смеюсь и причем упрямство? Скорее, тупость :((. Или то, что в секцию private я ее объявление не засунул?


Digitman ©   ( 2004-04-12 11:34 ) [19]


> не засунул

вот именно
третий раз сказать ?


Плохиш   ( 2004-04-12 11:35 ) [20]


> cvg ©   (12.04.04 11:30) [18]
> Над кем я смеюсь

Ты уже просто издеваешься, имея высшее образование (по анкете)

1. Купи словарь
2. Купи и прочитай книгу по программированию
3. Где описание Main_cycle?
4. Тебе выдаётся ещё несколько сообщений об ошибках, которые ты то же должен прочитать


Oyster ©   ( 2004-04-12 11:35 ) [21]


> Скорее, тупость

Похоже. А ты знаешь, что в Паскале подпрограммы, переменные и другие идентификаторы можно использовать только после того, как они объявлены?


cvg ©   ( 2004-04-12 11:53 ) [22]

Ну, перенес я в секцию private:

 private
   < Private declarations >
   procedure Main_cycle(FN:string;ob:Boolean);

Результат: опять на все элементы интерфайса стало выдаваться Undeclared identifier.

Описание Main_cycle вот:

procedure Main_cycle(FN:string;ob:Boolean);

До переноса его объявления в секцию private оно выглядело как

procedure TMainForm.Main_cycle(FN:string;ob:Boolean);

Другие сообщения об ошибках отношения к делу не имеют и связаны с тем, что я еще пытался разбить Main_cycle на процедуры и наопроделял переменных, но потом раздумал, а полностью текст программы еще не вычистил.

Когда я высшее образование получал (1991), AFAIK никакого Delphi еще в природе не существовало. А заняться ими мне пришлось все три мясяца как.

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


Digitman ©   ( 2004-04-12 11:57 ) [23]


> До переноса его объявления в секцию private оно выглядело
> как

почему же ПОСЛЕ переноса оно стало выглядеть иначе ?


Плохиш   ( 2004-04-12 12:02 ) [24]

>cvg ©   (12.04.04 11:53) [22]

> Описание Main_cycle вот:
> procedure Main_cycle(FN:string;ob:Boolean);
> До переноса его объявления в секцию private оно выглядело
> как
> procedure TMainForm.Main_cycle(FN:string;ob:Boolean);

Ну очень информативно

Придётся тебе ждать возвращения телепатов из отпуска


Юрий Зотов ©   ( 2004-04-12 12:02 ) [25]

> cvg ©   (12.04.04 09:50)  

procedure TMainForm.Main_Cycle(. );
begin
 .
end;

При таком объявлении процедура Main_Cycle становится не просто процедурой, а методом класса TMainForm. Поэтому внутри нее становятся напрямую доступны все компоненты, лежащие на этой форме. Что Вам и требовалось.

Кстати, объявлять ее можно не обязательно в private. Зависит от того, какую Вы хотите иметь для нее область видимости.

Почему у меня ошибка Undeclared identifier: ‘Series’ в delphi

type
TForm1 = class(TForm)
Chart1: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
Series3: TBarSeries;
Series4: TBarSeries;
Series5: TAreaSeries;
Series6: TAreaSeries;
Series7: TPointSeries;
Series8: TPointSeries;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
n,m:integer;
implementation
procedure grafiK(n,m:integer);
var x:real;
i:integer;
begin
Chart.Series[M].Clear;
Chart.Series[M+1].Clear;
x:=0;
for i:=0 to 18 do begin
Chart.Series[N].AddXY(x, exp(x), », clBlue);
Chart.Series[N+1].AddXY(x, exp(x)/2, », clRed);
x:=x+0.2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
N:=0;Grafik(N,M); M:=0;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
N:=2;Grafik(N,M); M:=2;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
N:=4;Grafik(N,M); M:=4;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
N:=6;Grafik(N,M);M:=6;
end;

Прежде, чем ответить на Ваш вопрос, я побродил по Интернету с помощью поисковика (Яндекса).
На странице результатов по запросу
Свойства компонента TChart в Delphi
я выбрал статью
Работа по теме: Тема 11 Компонент Chart. ВУЗ: ДНУ
, пробежался по ней глазами и всё-таки нашёл свойство Series!
Это значит, что используемое Вами свойство объекта Chart класса TChart действительно существует!

Внимательно изучив текст модуля Unit1, я заметил опечатку. Обратите внимание на то, что объект класса TChart определён с именем Chart1

type
TForm1 = class(TForm)
Chart1: TChart;

Ниже Вы обращаетесь к этому объекту по имени, однако у Вас он назван Chart (без цифры 1 в конце).

Дельфи не видит объект на форме и говорит Undeclared Identifier

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

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

Тут два варианта:

Либо сделать procedure WaveStart; членом класса (т.е. procedure TFormGame.WaveStart; ), чтобы виделся таймер, так как он является членом класса TFormGame

Либо указать экземпляр класса к которому этот таймер принадлежит FormGame.TimerSpawn

Предпочтительнее не использовать глобальные переменные, это чревато путаницей и усложнит дальнейшую отладку. Желательно спроектировать классы учитывая поведение объектов. Добавить методы отрисовки/перерисовки объекта, а также инициализации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *