Создание своего класса в Delphi 7

Объекты Pascal, классы Object Pascal, интерфейсы, наследование, инкапсуляция и т.д
electric
Сообщения:1
Зарегистрирован:13 ноя 2007, 13:18

13 ноя 2007, 13:23

Прошу помощи в создании своего класса )

нужно создать свой класс фигуры для шахматной доски

сама шахматная доска уже создана

нужно создать свой класс имеющий некоторые свойства)

у меня вот так:

Код: Выделить всё

TFigure=Class(TObject)
  [B]Private[/B]
        Color:Boolean;              чёрная или белая
        TypeFigure:String;
        ImgFigure:TImage;
  [B]Protected[/B]
        DestroyFigure:Boolean;          срубление фигуры
        OcheredHodaFigure:Boolean;
  [B]Function[/B] Coord1:TPanel;
  [B]Procedure[/B] Coord2(Coord:Tpanel);
         [B]Property[/B] CoordFigure:TPanel         будет ходить по панелькам
                             [B]read[/B] Coord1
                             [B]write[/B] Coord2;

  [B]Public[/B]
  Procedure HodFigure(a:TPAnel);

  [B]Private[/B]
  constructor Fcreate (Coord:Tpanel);
  end;
1) прошу помочь куда и как написать правильно конструктор с деструктором
2) Как вообще правильно написать процедуру с функцией
3) Как правильно написать read write
4) и вообще что я сделал не так и почему не работает )
СПАСИБО.
Аватара пользователя
Insane
Сообщения:5
Зарегистрирован:28 ноя 2007, 03:08

28 ноя 2007, 03:21

Код: Выделить всё

TCellColor = (Black, White);
TFigure=Class
  Private
        FColor:TCellColor;
        FTypeFigure:String;  //Можно поступить, как с цветом.
        FImgFigure:TImage;
        DestroyFigure:Boolean;
        OcheredHodaFigure:Boolean; //???
        Function Coord1:TPanel;
        Procedure Coord2(Coord:Tpanel);
  Public
        Procedure HodFigure(a:TPAnel);
        Property [B]CoordFigure:TPanel read Coord1 write Coord2;[/B]
        constructor Сreate (Coord:Tpanel); 
  end;
1)Конструктор и деструктор обьявляются либо в Public либо в Protected обычно. Да вообще без разницы где. Смысл в том, что если ты объявляешь конструктор в Public, его смогут увидеть потомки данного класса...ну, и т.п.

2) офигеть у вас вопросики, батенька :)

3) read, write, default, index. Всё это ключевые слова для работы со свойствами.
например:

Код: Выделить всё

TMyClass = class
private
  FMyField: Integer;
published
  property MyProperty: Integer read {откуда читаем в свойство} FMyField write {куда записываем свойство} FMyFiled;
end;


4) :) ))
Аватара пользователя
somewhere
Сообщения:1837
Зарегистрирован:31 авг 2006, 17:14
Откуда:71 RUS
Контактная информация:

28 ноя 2007, 09:46

Ну вы ребят даете... Что можно сказать о шахматной фигуре в разрезе игры?
1. Однозначно имеет тип, причем перечисленный, так как фигур не много, игрок в процессе их не вырезает из дерева на станке.
2. Имеет свои координаты - просто числа, а не панельки - реализация вашей отрисовки коня например шахматного волнует мало.
3. Имеет свой цвет, здесь вы правы, который по сути даже и не цвет вовсе, а признак принадлежности к игроку. Для начала пусть будет цвет.
4. Имеет свои правила хода, в класе фактически будет функция GetAction которая даст список доступных ходов (опять же не панельки, а числа) ядру искуственного интелекта.
5. Должна уметь уничтожаться.

По-хорошему поле типа даже и не нужно. Должен быть общий класс TFigure и унаследованные от него классы TKnight, TKing и т.д. с перегруженными методами вроде GetAction
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Insane
Сообщения:5
Зарегистрирован:28 ноя 2007, 03:08

28 ноя 2007, 09:54

оффтоп:
Не вижу смысла даже вникать в суть написания этой проги, так как уже заранее известно, что работать ей не судьба, пока программер не подрастёт ;)

А вообще, вопрос стоял именно в объявлении класса.
Аватара пользователя
Игорь Акопян
Сообщения:1419
Зарегистрирован:13 окт 2004, 17:11
Откуда:СПБ
Контактная информация:

28 ноя 2007, 14:12

ну если про класс...
Конструктор класса унаследованного от TObject должен быть как минимум перекрытым (override),называться Create и иметь сходный набор параметров. Первой строкой в нём должен быть вызов родительского конструктора с помощью инструкции Inherited
Изображение
Аватара пользователя
somewhere
Сообщения:1837
Зарегистрирован:31 авг 2006, 17:14
Откуда:71 RUS
Контактная информация:

28 ноя 2007, 14:50

&quot писал(а):Конструктор класса унаследованного от TObject должен быть как минимум перекрытым (override),называться Create и иметь сходный набор параметров. Первой строкой в нём должен быть вызов родительского конструктора с помощью инструкции Inherited
Да зачем надо от TObject наследоваться, его методы и свойства никак в задаче жизнь не облегчат. Надо класс с нуля начинать.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Duncon
Сообщения:1974
Зарегистрирован:10 окт 2004, 14:11
Откуда:Питер
Контактная информация:

28 ноя 2007, 15:28

somewhere очень интересно посмотреть на твой класс с нуля.
Аватара пользователя
somewhere
Сообщения:1837
Зарегистрирован:31 авг 2006, 17:14
Откуда:71 RUS
Контактная информация:

28 ноя 2007, 16:29

TObject не есть низ классовой структуры, вот например как он описан:

Код: Выделить всё

TObject = class
    constructor Create;
    procedure Free;
    class function InitInstance(Instance: Pointer): TObject;
    procedure CleanupInstance;
    function ClassType: TClass;
    class function ClassName: ShortString;
    class function ClassNameIs(const Name: string): Boolean;
    class function ClassParent: TClass;
    class function ClassInfo: Pointer;
    class function InstanceSize: Longint;
    class function InheritsFrom(AClass: TClass): Boolean;
    class function MethodAddress(const Name: ShortString): Pointer;
    class function MethodName(Address: Pointer): ShortString;
    function FieldAddress(const Name: ShortString): Pointer;
    function GetInterface(const IID: TGUID; out Obj): Boolean;
    class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
    class function GetInterfaceTable: PInterfaceTable;
    function SafeCallException(ExceptObject: TObject;
      ExceptAddr: Pointer): HResult; virtual;
    procedure AfterConstruction; virtual;
    procedure BeforeDestruction; virtual;
    procedure Dispatch(var Message); virtual;
    procedure DefaultHandler(var Message); virtual;
    class function NewInstance: TObject; virtual;
    procedure FreeInstance; virtual;
    destructor Destroy; virtual;
  end;
...
...
class function TObject.ClassParent: TClass;
{$IFDEF PUREPASCAL}
begin
  Pointer(Result) := PPointer(Integer(Self) + vmtParent)^;
  if Result <> nil then
    Pointer(Result) := PPointer(Result)^;
end;
{$ELSE}
asm
        MOV     EAX,[EAX].vmtParent
        TEST    EAX,EAX
        JE      @@exit
        MOV     EAX,[EAX]
@@exit:
end;
{$ENDIF}

class function TObject.NewInstance: TObject;
begin
  Result := InitInstance(_GetMem(InstanceSize));
end;

procedure TObject.FreeInstance;
begin
  CleanupInstance;
  _FreeMem(Self);
end;
...
...
...
ну и так далее...
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Duncon
Сообщения:1974
Зарегистрирован:10 окт 2004, 14:11
Откуда:Питер
Контактная информация:

28 ноя 2007, 16:44

somewhere а зачем мне показывать класс TObject который по умолчанию является родителем всего..
Твоя запись дословно означает
TObject = class
Создаю новый класс TObject унаследованный от TObject, видимо пространство имен это позволяет.
Аватара пользователя
somewhere
Сообщения:1837
Зарегистрирован:31 авг 2006, 17:14
Откуда:71 RUS
Контактная информация:

29 ноя 2007, 08:55

Duncon, ты прямо подорвал мою веру во все хорошее ))))
Сколько лет считал что класс может быть пустым и можно строить его как угодно, а тут такая подстава. Что интересно, раньше я этого не замечал и вышеприведенный код это только и доказывал, хотя сейчас мне сложно понять как TObject был создан из самого себя. Очень жаль, что все эти детища от него наследованы. Спасибо за объяснение, впредь буду знать...
It's a long way to the top if you wanna rock'n'roll
Ответить