Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода предка из потомка, Как вызвать метод предка из потомка? 
V
    Опции темы
IgorMl
Дата 11.4.2014, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.4.2014

Репутация: нет
Всего: нет



Код

type
  TBase = class(TForm)   
    Panel1: TPanel;      
  private       
  public    
    procedure FormShow(Sender: TObject);    
  end;

type
  TMap = class(TBase)    
      Button: TButton;
  private    
  public    
    procedure FormShow(Sender: TObject);
  end;

  
.........
 Во время выполнения программы создаю окно.
 
Код

 aBase := TBase.Create; 
 aBase.ShowModal;

.... 

Хочу в FormShow класса TBase произвести перемещение кнопки TButton класса TMap в нужное мне место.

....

Вопрос как это сделать? 
PM MAIL   Вверх
Poseidon
Дата 11.4.2014, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(IgorMl @  11.4.2014,  08:48 Найти цитируемый пост)
Хочу в FormShow класса TBase произвести перемещение кнопки TButton класса TMap в нужное мне место.
TBase у тебя предок, TMap - потомок. Ты хочешь из предка обратиться к полю потомка? Если так, то название темы немного не корректное. Ну и без создания экземпляра TMap это сделать не получится. Вот из TMap можно обащаться к полям TBase (учитывая видимость, разумеется) без создания экземпляра TBase, а из TBase не получится.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
IgorMl
Дата 11.4.2014, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.4.2014

Репутация: нет
Всего: нет



 ой ... конечно же вместо
 
Код

aBase := TBase.Create; 
aBase.ShowModal;


 должно быть 
 
Код

aMap := TMap.Create; 
 aMap.ShowModal;


Т.е. создаётся обьект aMap. 
Но при этом я не хочу светить ненужную реализацию по упорядочиванию кнопок расположенных на обьекте aMap. Хочу спрятать этот алгоритм в базовом классе. 
Вот мне и не понятно как это сделать .
PM MAIL   Вверх
Poseidon
Дата 11.4.2014, 11:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Если я правильно понял, то тебе надо:
1) В TBase создать нужный метод (упорядочивание кнопок или что там надо) и поместить этот метод в любую секцию, кроме private (для подобных дел обычно protected используют).
2) В TMap вызывать этот метод напрямую (т.е как будто он в TMap и описан).

В случае, если этот метод должен работать с каким-то объектом, который не принадлежит TBase или его родителю (в твоем случае это TButton класса TMap), то нужно этот объект передавать в метод параметром. Вот пример

Код

type
  TBase = class(TForm)   
    Panel1: TPanel;       
  protected 
    procedure MyMethod(Button: TButton);
  public    
    procedure FormShow(Sender: TObject);    
  end;

type
  TMap = class(TBase)    
    Button: TButton;
  private    
  public    
    procedure FormShow(Sender: TObject);
  end;

{...}

procedure TMap.FormShow(Sender: TObject);
begin
  MyMethod(Button);
end;



Это сообщение отредактировал(а) Poseidon - 11.4.2014, 11:05


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
IgorMl
Дата 11.4.2014, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.4.2014

Репутация: нет
Всего: нет



Да, это то что нужно!
Спасибо за помощь!
PM MAIL   Вверх
IgorMl
Дата 11.4.2014, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.4.2014

Репутация: нет
Всего: нет



Код

type
  TBase = class(TForm)   
    Panel1: TPanel;       
  protected 
    procedure MyMethod(Button: TButton);
  public    
    procedure FormShow(Sender: TObject);    
  end;

type
  TMap = class(TBase)    
    Button: TButton;
  private    
  public    
    procedure FormShow(Sender: TObject);
  end;

{...}
procedure TBase.MyMethod(Button: TButton);
begin
  Button.Left := 100;
end;

{...}
procedure TMap.FormShow(Sender: TObject);
begin
  inherited;

  Button.Left := 10;
  MyMethod(Button);
end;

{...}
 aMap := TMap.Create; 
 aMap.ShowModal;


После вызова MyMethod кнопка осталась на позиции 
Код

Button.Left := 10
 
а задумка была в том чтобы дать возможность переместить этот обьект в зависимости от заданных координат в базовом классе.

Видимо обращение к Button в MyMethod должно происходить как то по другому?
PM MAIL   Вверх
Poseidon
Дата 11.4.2014, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Видать var хочет MyMethod(var Button: TButton);


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
IgorMl
Дата 11.4.2014, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.4.2014

Репутация: нет
Всего: нет



Цитата(Poseidon @ 11.4.2014,  12:59)
Видать var хочет MyMethod(var Button: TButton);

Не помогло
PM MAIL   Вверх
IgorMl
Дата 11.4.2014, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.4.2014

Репутация: нет
Всего: нет



Не совсем понятно ... но после внесения изменений в класс  TBase по указанным замечаниям от Poseidon выполнение программы не приносило нужного результата. Однако после повторного наследования от TBase все заработало. 
Неужели после каждого изменения Базового класса нужно пересоздавать всех его наследников?
PM MAIL   Вверх
Poseidon
Дата 12.4.2014, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(IgorMl @  11.4.2014,  21:26 Найти цитируемый пост)
Однако после повторного наследования от TBase все заработало. 
Что значит "повторное наследование"?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
IgorMl
Дата 14.4.2014, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.4.2014

Репутация: нет
Всего: нет



Когда внес изменения в уже созданные формы - ничего не получалось.

Но после того как создал нового наследника от TBase алгоритм в TBase.MyMethod заработал. С чем это связать ни знаю.

Это уже вопрос второстепенный ... основной вопрос вашей помощью решен. Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.