IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите 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'" sad.gif. Может не туда добавляю заголовок?


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.


Делаю все также, но не компилируется sad.gif.

Сообщение отредактировано: Shmaniche - 1.12.2012 9:12
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 1.12.2012 12:23
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


когда описываешь метод объекта, название класса (внутри этого же класса!) писать не нужно.
то есть
private
{ Private declarations }
procedure Put(Sender: TObject);


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 1.12.2012 14:09
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Спасибо, мисс граффити. give_rose.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 1.12.2012 16:29
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Shmaniche, я тебе уже написал, что только этого недостаточно. Компилироваться будет, работать - нет.

Надо либо перенести описание процедуры Put в published-секцию, чтобы можно было назначать OnClick-у эту процедуру еще на этапе проектирования, либо придется делать это в рантайме.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 2.12.2012 1:51
Сообщение #5


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


ну вопрос был "почему не компилируется и ругается на Undeclared identifier: 'TForm1'". а уж что это за процедура и откуда она (и как) вызывается - я не в курсе...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 5.12.2012 8:38
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


IUnknow
Я свой вопрос задавал в двух форумах и не знал, что ты тут тоже бываешь.
smile.gif

Кстати, я столкнулся с еще одной проблемой при решении этого задания:

Цитата
Открыть модуль, не связанный с формой и поместить в него три класса:

Класс 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 5.12.2012 10:24
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ты модуль подключил в implementation а определения из него используешь в interface


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 5.12.2012 10:36
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


TarasBer
1. Модуль в implementation главного модуля подключается автоматически после команды File -> Use Unit.
2. Описывать классы в AnimalUnit я учился по этому этому шаблону.
Если не туда написал переменную MyAnimal, скажите куда надо?! smile.gif

PS: Уже нашел! smile.gif

Код

implementation
uses AnimalsUnit;
var MyAnimal: TAnimal;



Сообщение отредактировано: Shmaniche - 5.12.2012 10:57
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 8.12.2012 19:36
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Как думаете надо ли создавать деструкторы для "животных" и "пород собак"? Вроде бы программа и так хорошо работает (после того как я позаботился об удалении объектов из памяти в главном модуле методом Free когда они не нужны)?

Сообщение отредактировано: Shmaniche - 8.12.2012 19:37
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 8.12.2012 20:31
Сообщение #10


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Как думаете надо ли создавать деструкторы для "животных" и "пород собак"?
А чего нам-то думать об этом? Ты написал код, ты и думай, нужны тебе деструкторы, или нет. Как можно сказать что-то, не видя конструкторов твоих классов?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 9.12.2012 10:41
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Внутри конструктора что написано?
И да, надо писать деструктор или нет, а вызывать Free в любом случае надо, поэтому я считаю модель ООП в Дельфи калечной и даже сраные структуры для меня, и те удобнее.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 29.03.2024 0:56
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"