Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

наследование [D6, XP]


Страницы:   1 2

Евгений07 ©   (2010-11-15 11:42:00) 

Доброго времени!
Не могу разобраться с наследованием форм.
Задача
 Было несколько прог, состоящих из нескольких больших похожих форм
Решение
 Разбить форму на 2 части типа
   TVxod = в основном логика
   ТVvod = в основном видимость
 Выделить
   Vvod0_N_T_; = форма родитель
   Vvod4;      = форма потомок, создан по inherited из       формы родителя в проекте
Примечание:
 логика и видимость переплетены, в логика использует   видимость и наоборот

Облом:
 если в родителе не создать переменные Vxod и Vvod, то
   при работе родитель выдает ошибку, Vxod = nil,
   Vvod = nil
 если в родителе создать переменные Vxod и Vvod, то
   при работе родитель работает правильно, а остальные
     модули выдают ошибку: Vxod = nil, Vvod = nil
По логике переменные Vxod и Vvod надо создавать в потомках,
 а родителей заставить в родительском коде с ними работать

unit Vvod00;              //****************** общее
type
 TVxod0 = class(TObject)
   ...
   Constructor Create;
end;

end.

unit   Vvod0_N_T_;//форма родитель ****
interface
uses  Vvod00

type
 TVxod = class(TVxod0)
   ...
   Constructor Create;
end;

type
 TVvod0_N_T = class(TForm)
   procedure FormCreate(Sender: TObject);
   ...
end;

var
 Vvod: TVvod0_N_T //
 Vxod: TVxod;

implementation

procedure TVvod0_N_T1.FormCreate(Sender: TObject);
begin          
 ...
 Vxod := TVxod.Create;
end;

end.

unit     Vvod4;//форма потомок****  
interface
uses  Vvod0_N_T_,  Vvod00

type
 TVxod1 = class(TVxod)
   ...
end;

type
 TVvod0_N_T1 = class(TVvod0_N_T)
   procedure FormCreate(Sender: TObject);
   ...
end;

var
 Vvod: TVvod0_N_T1;
 Vxod: TVxod1;

implementation

procedure TVvod0_N_T1.FormCreate(Sender: TObject);
begin          
 inherited;
 ...
 Vxod := TVxod1.Create;
end;

end.


Евгений07   (2010-11-15 12:49:00) [21]

unit   Vvod0_N_T_;//форма родитель ****
interface
uses  Vvod00

type
 TVxod = class(TVxod0)
   ...
   Constructor Create;
end;

type
 TVvod0_N_T = class(TForm)
   procedure FormCreate(Sender: TObject);
   ...
end;

var
 Vvod: TVvod0_N_T //
 Vxod: TVxod;  // зло здесь


implementation

procedure TVvod0_N_T1.FormCreate(Sender: TObject);
begin          
 ...
 Vxod := TVxod.Create;
end;

end.


stas   (2010-11-15 11:55:00) [22]

Непонятно зачем родителю класса работать с экземпляром класса потомка???
Вы чего-то напутали.


clickmaker   (2010-11-15 11:53:00) [23]

> TVvod0_N_T1

для начала стоит дать более осмысленные имена.


> логика и видимость переплетены, в логика использует   видимость
> и наоборот

когда такое "сплетенье рук, сплетенье ног" неизбежно последуют проблемы, описанные ниже.
Надо как-то логику причесать


> TVxod = в основном логика

по большому счету логики в формах не должно быть - только ввод и отображение.
Попробуйте логику отделить ото всех форм в отдельный класс/модуль - сразу полегчает


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо