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 := "Âûáåðèòå ôàéë ñ äàííûìè";
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
Предпочтительнее не использовать глобальные переменные, это чревато путаницей и усложнит дальнейшую отладку. Желательно спроектировать классы учитывая поведение объектов. Добавить методы отрисовки/перерисовки объекта, а также инициализации.