Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизHelp me! Почему Undeclared identifier? Найти похожие ветки
← →
cvg © (2004-04-12 09:50) [0]Hi all!
Была у меня прога (хотя исходный текст ее писал не я -- я только как начинающий развиваю ее), в которой есть модуль 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 - метод формы. Делай по аналогии.
← →
cvg © (2004-04-12 10:18) [5]После
procedure Button1Click(Sender: TObject);
добавил
procedure Main_cycle(FN:string;ob:Boolean);
Ни фига не изменилось... :(
← →
Digitman © (2004-04-12 10:36) [6]
> После
"после" - понятие растяжимое
объяви метод конкретно в private-секции класса
← →
cvg © (2004-04-12 10:46) [7]"После" значит "сразу после". Вот тут мне умный фрэнд подсказал, что вызов Main_cycle теперь должен выглядеть как
procedure TMainForm.Main_cycle(FN:string;ob:Boolean);
Теперь, вроде, она по-другому уже ругается...
← →
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. При написании кода везде использовать ПОЛНЫЕ имена элементов - с привязкой к имени формы, на которой они находятся
Имя_формы.Имя_элемента()
← →
Digitman © (2004-04-12 10:58) [10]
> "После" значит "сразу после"
русский язык понимаешь ?
размести декларацию метода в 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"
А вот объявление формы:
unit MainFormUnit;
interface
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);
end;
← →
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)
type
TMainForm = class(TForm)
...
private
procedure Main_Cycle(...);
...
end;
procedure TMainForm.Main_Cycle(...);
begin
...
end;
При таком объявлении процедура Main_Cycle становится не просто процедурой, а методом класса TMainForm. Поэтому внутри нее становятся напрямую доступны все компоненты, лежащие на этой форме. Что Вам и требовалось.
Кстати, объявлять ее можно не обязательно в private. Зависит от того, какую Вы хотите иметь для нее область видимости.
P.S.
А книжку все же прочтите. Не пожалеете.
:o)
← →
cvg © (2004-04-12 12:08) [26]А что, не должно было? Странно... Мне показалось, что TMainForm в объявлении типа отлично заменит TmainForm в вызове... Но, видимо, я тут чего-то недощелкал. Ну ладно, вернул это самое TMainForm в объявление Main_cycle. Теперь ошибок, вроде, нет, но толга непонятно, какая разница, указывать его в секции private или нет?
← →
cvg © (2004-04-12 12:13) [27]Thanx, Юрий Зотов. Книжку читаю -- "Delphi 7. Учебный курс", но подробного обяснения подобных вещей я там что-то не видел. Может, потому, что это всего лишь "учебный курс"?
← →
Digitman © (2004-04-12 12:14) [28]
> какая разница
большая разница
читай книжку
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.047 c