Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.025 c
11-1065365976
Aotd
2003-10-05 18:59
2004.05.02
"приклеивание" окна к краям экрана


14-1081590683
Инкогнито
2004-04-10 13:51
2004.05.02
А солнышко играет...


3-1081317803
Студент1
2004-04-07 10:03
2004.05.02
ADO и SQL Server 2000 -> "Connection failure".


14-1081422498
Elast
2004-04-08 15:08
2004.05.02
IB


11-1065719451
Wiz@rd
2003-10-09 21:10
2004.05.02
Как сделать прокси?