Помощь - Поиск - Пользователи - Календарь
Полная версия: Простой вопрос
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Shmaniche
На форме компоненты 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.
мисс_граффити
когда описываешь метод объекта, название класса (внутри этого же класса!) писать не нужно.
то есть
private
{ Private declarations }
procedure Put(Sender: TObject);
Shmaniche
Спасибо, мисс граффити. give_rose.gif
IUnknown
Shmaniche, я тебе уже написал, что только этого недостаточно. Компилироваться будет, работать - нет.

Надо либо перенести описание процедуры Put в published-секцию, чтобы можно было назначать OnClick-у эту процедуру еще на этапе проектирования, либо придется делать это в рантайме.
мисс_граффити
ну вопрос был "почему не компилируется и ругается на Undeclared identifier: 'TForm1'". а уж что это за процедура и откуда она (и как) вызывается - я не в курсе...
Shmaniche
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” все компилировалось прекрасно.
TarasBer
Ты модуль подключил в implementation а определения из него используешь в interface
Shmaniche
TarasBer
1. Модуль в implementation главного модуля подключается автоматически после команды File -> Use Unit.
2. Описывать классы в AnimalUnit я учился по этому этому шаблону.
Если не туда написал переменную MyAnimal, скажите куда надо?! smile.gif

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

Код

implementation
uses AnimalsUnit;
var MyAnimal: TAnimal;

Shmaniche
Как думаете надо ли создавать деструкторы для "животных" и "пород собак"? Вроде бы программа и так хорошо работает (после того как я позаботился об удалении объектов из памяти в главном модуле методом Free когда они не нужны)?
IUnknown
Цитата
Как думаете надо ли создавать деструкторы для "животных" и "пород собак"?
А чего нам-то думать об этом? Ты написал код, ты и думай, нужны тебе деструкторы, или нет. Как можно сказать что-то, не видя конструкторов твоих классов?
Shmaniche
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;


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