Простой вопрос, По объявлению процедур в Delphi |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Простой вопрос, По объявлению процедур в Delphi |
Shmaniche |
1.12.2012 8:57
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
На форме компоненты Memo1 и MainMenu, где созданы подпункты TMenuItem.
В учебнике нашел процедуру: Код procedure TForm1.Put(Sender: TObject); begin Memo1.Text:=Memo1.Text+(Sender as TMenuItem).Caption; end; Из-за которой не компилируется проект. Поразмыслил понял, что это самодельная процедура. Ее заголовок я прописал после Private, т.е.: Код private { Private declarations } procedure TForm1.Put(Sender: TObject); public { Public declarations } end; Но проект все равно не компилируется. "[Pascal Error] Mainunit.pas(43): E2003 Undeclared identifier: 'TForm1'" . Может не туда добавляю заголовок? Name формы: Form1. Может не так добавляю? Када правильно писать заголовки самодельные процедур? Нашел пример объявления кода: Код unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private procedure HeCoBCemTak(Sender:Tobject); { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.HeCoBCemTak(Sender:Tobject); begin application.MessageBox('CoBceMheTak','HeCoBcemTak',MB_YESNO) end; procedure TForm1.FormCreate(Sender: TObject); begin Form1.HeCoBCemTak(Form1); end; end. Делаю все также, но не компилируется . Сообщение отредактировано: Shmaniche - 1.12.2012 9:12 |
мисс_граффити |
1.12.2012 12:23
Сообщение
#2
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
когда описываешь метод объекта, название класса (внутри этого же класса!) писать не нужно.
то есть private -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Shmaniche |
1.12.2012 14:09
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
Спасибо, мисс граффити.
|
IUnknown |
1.12.2012 16:29
Сообщение
#4
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Shmaniche, я тебе уже написал, что только этого недостаточно. Компилироваться будет, работать - нет.
Надо либо перенести описание процедуры Put в published-секцию, чтобы можно было назначать OnClick-у эту процедуру еще на этапе проектирования, либо придется делать это в рантайме. |
мисс_граффити |
2.12.2012 1:51
Сообщение
#5
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
ну вопрос был "почему не компилируется и ругается на Undeclared identifier: 'TForm1'". а уж что это за процедура и откуда она (и как) вызывается - я не в курсе...
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Shmaniche |
5.12.2012 8:38
Сообщение
#6
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
IUnknow
Я свой вопрос задавал в двух форумах и не знал, что ты тут тоже бываешь. Кстати, я столкнулся с еще одной проблемой при решении этого задания: Цитата Открыть модуль, не связанный с формой и поместить в него три класса: Класс Animal, который содержит в разделе public объявление конструктора Create и объявление метода-функции: Verse – звук, издаваемый животным. Тип результата возвращаемого функцией – string. Метод Verse объявить виртуальным и абстрактным. В разделе private класса определить переменную Kind : string. Класс Dog объявить потомком класса Animal. В разделе public этого класса объявить конструктор и методы Verse и Eat. Метод Eat типа string объявить виртуальным ( пища животного). Класс Cat объявить потомком класса Animal. Раздел public класса содержит те же определения, что и соответствующий раздел класса Dog. В реализациях конструктора каждого класса переменной Kind присваивается имя соответствующего животного, напрамир для класса Animal : Kind := ‘An Animal’. В реализациях методов Verse возвращается звук, издаваемый животным, например Verse := ‘Mieow’. В реализациях методов Eat возвращается название пищи, которой питается соответствующее животное. Задать имя модуля и имя проекта, в который этот модуль будет включен. Добавить в проект форму, которой присвоить имя Animals, также задать имя модулю, связанному с формой. В форме расположить три кнопки опций ( компонент RadioButton) с названиями Animal, Dog, Cat ; кнопкой команды (компонент Button) с названием Kind и две крупный надписи (компонент Label) . Нажатию одной из кнопок опций будет соответствовать выбор животного. При нажатии кнопки команды надписи должны отобразить звук, издаваемый животным и его пищу. Определите в классе формы private-переменную MyAnimal. Запишите код для обработчика события OnCreate формы, где создается объект типа Dog на который ссылается переменная MyAnimal. В обработчиках события OnClick каждой кнопки опций записать код, который удаляет текущий объект и создает новый. В обработчике события OnClick кнопки команды записать код, который будет помещать в надписи звук, издаваемый животным и его пищу. Для работы с методом Eat используйте операцию is для приведения типов. Если вы все сделали правильно, при запуске приложения надписи будут отображать пищу и звук для Dog и Cat и приложение завершит работу по ошибке при выборе Animal. Уберите ключевое слово abstract в объявлении метода Verse. Запустите приложение снова. Посмотрите что изменилось в работе приложения. Объясните различия. Попробуйте использовать метод Eat без приведения типов (без is). Разработайте два класса потомка от Dog или Cat (согласно варианту), которые будут отображать особенности двух пород собак или кошек соответственно. Разработайте методы для этих классов, позволяющие получить некоторые характеристики породы (рост, длина шерсти, длина ушей и т.д.). Дополните форму компонентами позволяющими увидеть все характеристики разработанных классов. Потомки должны показываться на форме, если пользователь выбирает родителя, и должны быть скрыты, если выбран другой класс. Проблема возникает на шаге отмеченным жирным шрифтом. Классы с животными, их конструкторы и методы я сохранил в модуле AnimalsUnit.pas. Главная форма программы храниться в модуле MainUnit. В ней я подключил модуль с животными: Код implementation uses AnimalsUnit; Далее в модуле MainUnit пишу: Код private { Private declarations } MyAnimal: TAnimal; // Переменная "Мое животное" от класса "Animal". public { Public declarations } end; Компилятор ругается на строку ”MAnimal: TAnimal;” (”[Pascal Error] MainUnit.pas(28): E2003 Undeclared identifier: 'TAnimal'”). И разумеется процедура Код procedure TMainForm.FormCreate(Sender: TObject); begin MyAnimal:=TDog.Create; end; не работает. Хотя в AnimalsUnit я в самом начале объявил Код type TAnimal = class(TObject) и подключил модуль ”AnimalsUnit” к "MainUnit". До введения переменной ”MyAnimal” все компилировалось прекрасно. Сообщение отредактировано: Shmaniche - 5.12.2012 9:10 |
TarasBer |
5.12.2012 10:24
Сообщение
#7
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ты модуль подключил в implementation а определения из него используешь в interface
-------------------- |
Shmaniche |
5.12.2012 10:36
Сообщение
#8
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
TarasBer
1. Модуль в implementation главного модуля подключается автоматически после команды File -> Use Unit. 2. Описывать классы в AnimalUnit я учился по этому этому шаблону. Если не туда написал переменную MyAnimal, скажите куда надо?! PS: Уже нашел! Код implementation uses AnimalsUnit; var MyAnimal: TAnimal; Сообщение отредактировано: Shmaniche - 5.12.2012 10:57 |
Shmaniche |
8.12.2012 19:36
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
Как думаете надо ли создавать деструкторы для "животных" и "пород собак"? Вроде бы программа и так хорошо работает (после того как я позаботился об удалении объектов из памяти в главном модуле методом Free когда они не нужны)?
Сообщение отредактировано: Shmaniche - 8.12.2012 19:37 |
IUnknown |
8.12.2012 20:31
Сообщение
#10
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Как думаете надо ли создавать деструкторы для "животных" и "пород собак"? А чего нам-то думать об этом? Ты написал код, ты и думай, нужны тебе деструкторы, или нет. Как можно сказать что-то, не видя конструкторов твоих классов? |
Shmaniche |
8.12.2012 20:45
Сообщение
#11
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
IUnknown
Фрагменты: Код type TAnimal = class(TObject) private { Private declarations } Kind: string; public { Public declarations } constructor Create; function GetKind: string; virtual; function Voice: string; virtual; function Eat: string; virtual; .... {там есть еще виртуальные функции-методы для пород собак} end; Код TDog = class(TAnimal) public constructor Create; function GetKind: string; override; function Voice: string; override; function Eat: string; override end; Код TCat = class(TAnimal) public constructor Create; function GetKind: string; override; function Voice: string; override; function Eat: string; override; end; Код TSheepDog = class(TAnimal) public constructor Create; function GetRace: string; override; function Stature: string; override; function LengthHair: string; override; function LengthEar: string; override; function LengthInfluence: string; override; end; И все таком духе. Сообщение отредактировано: Shmaniche - 8.12.2012 20:46 |
TarasBer |
9.12.2012 10:41
Сообщение
#12
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Внутри конструктора что написано?
И да, надо писать деструктор или нет, а вызывать Free в любом случае надо, поэтому я считаю модель ООП в Дельфи калечной и даже сраные структуры для меня, и те удобнее. -------------------- |
Текстовая версия | 10.11.2024 18:08 |