![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
наследование [D6, XP]
Евгений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 = в основном логика
по большому счету логики в формах не должно быть - только ввод и отображение.
Попробуйте логику отделить ото всех форм в отдельный класс/модуль - сразу полегчает