Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.042 c
14-1081832179
MPS
2004-04-13 08:56
2004.05.02
Задачка логическая по информатике


14-1081422070
Ivolg
2004-04-08 15:01
2004.05.02
С++


14-1081175612
WebErr
2004-04-05 18:33
2004.05.02
Выбираю путер


6-1079087976
Dimmm
2004-03-12 13:39
2004.05.02
управление удаленным компьютером по локальной сети


3-1081333615
Kein
2004-04-07 14:26
2004.05.02
разрушение структуры таблицы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский