Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2013, 20:38   #1
Tclass
Пользователь
 
Регистрация: 02.06.2013
Сообщений: 11
По умолчанию Delphi. Использование абстрактных методов

При написании программы возникла ошибочка. Может кто объяснить ну и помочь немножечко

В этом юните я описываю классы, с которыми буду работать
Код:
unit Unit5;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

  type

    TLocation = class
        X,Y,Color:integer;
        constructor Init(initX,initY:integer);
        procedure PutX(newX:integer);
        procedure PutY(newY:integer);
        function GetX:integer;
        function GetY:integer;
        procedure Show; virtual; abstract;
        procedure Hide; virtual; abstract;
end;
 
type
 
    TPoint = class (TLocation)
        constructor Init(initX,initY:integer);
        procedure Show; override;
        procedure Hide; override;
end;
 

implementation
 
uses Unit2;

constructor TLocation.Init(initX,initY:integer);
begin
    X:=initX;
    Y:=initY;
 
end;
 
procedure TLocation.PutX(newX:integer);
begin X:=newX end;
 
procedure TLocation.PutY(newY:integer);
begin Y:=newY end;
 
 
function TLocation.GetX:integer;
begin GetX:=X end;
 
function TLocation.GetY:integer;
begin GetY:=Y end;
 
 
constructor TPoint.Init(initX,initY:integer);
begin
    inherited Init(initX,initY);
 
end;
 
procedure TPoint.Show;
begin Form2.PaintBox5.Canvas.Pixels[X,Y]:=ClBlack; end;
 
procedure TPoint.Hide;
begin Form2.PaintBox5.Canvas.Pen.Color:=clWhite;
form2.PaintBox5.Canvas.Pixels[X, Y]:=Form2.PaintBox5.Canvas.Pen.Color;
Form2.PaintBox5.Canvas.Pen.Color:=clBlack;
end;
 

end.
Вызываю я их в другом юните, в процедуре обработки события нажатия кнопки
Код:
   procedure MoveT(pF:Unit5.TLocation; newX,newY:integer);
begin
     pF.Hide;
     pF.PutX(newX);
     pF.PutY(newY);
     pF.Show;
end;


procedure TForm2.Button6Click(Sender: TObject);
var p1:Unit5.TPoint;
   
    pF:Unit5.TLocation;
    switcher: integer;
begin
  switcher:=StrToInt(Form2.Label5.Caption);
  p1:=Unit5.TPoint.Init(200,100);
  pF:=@p1;
  if switcher=0 then
  begin
    p1.Show;
  end;
  
   if switcher=1 then
   begin
    MoveT(pF, 100, 200);
   end;
  switcher:=switcher+1;
  Form2.Label5.Caption:=IntToStr(switcher);

end;
ругается на функция MoveT. Можете обьяснить почему?
Tclass вне форума Ответить с цитированием
Старый 07.06.2013, 14:57   #2
superedward
Форумчанин
 
Аватар для superedward
 
Регистрация: 27.11.2012
Сообщений: 190
По умолчанию

Несоответствие типов. Убери строку pF:=@p1; и работай с p1
superedward вне форума Ответить с цитированием
Старый 07.06.2013, 17:11   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

А где в конструкторе класса tlocation строчка в самом начале inherited(create);? Если не ошибаюсь, экземпляр класса у вас не создастся.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 07.06.2013, 18:30   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
А где в конструкторе класса tlocation строчка в самом начале inherited(create);? Если не ошибаюсь, экземпляр класса у вас не создастся.
Не зависит, при создании объекта без указания предка он автоматически ставит предка tobject, который всё что надо , умеет, а inherited для предков тобжекта вызывать не надо, т.к. сам конструктор занимается работой по созданию объекта, а не вызов его у предка (вызов у предка и не только в случае конструктора - для правильной работы в собственных иерархиях программиста).
Цитата:
Сообщение от superedward
Несоответствие типов. Убери строку pF:=@p1; и работай с p1
тоже не совсем так, типы соответствуют ибо tpoint потомок tlocation , а вот из-за pF:=@p1; адрес, записанный в переменной pf является адресом на адрес на объект tpoint, а не просто адресом на объект (как должно быть по-правильному). Надо просто убрать @ и всё должно быть норм, будет просто 2 ссылки на один объект.
А совет использовать для передачи в MoveT просто саму р1 - это дельно, меньше запутывает при чтении кода (и строка pF:=@p1; становится не нужна при этом), так мы просто передадим объект класса tpoint в метод ожидающий tlocation _или его потомка_
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявление и определение методов.Напишите функции в виде методов (подпрограмм). Напишите тестирующую программу с выдачей результа Vika_0_0 C# (си шарп) 0 04.10.2012 15:21
Использование методов из проекта на С++ в проекте на C# scailfon Общие вопросы .NET 7 06.06.2011 23:40
Использование методов вне класса prikolist Общие вопросы C/C++ 12 07.05.2009 13:57