Текущий архив: 2009.03.29;
Скачать: CL | DM;
Вниз
Вопрос про наследование форм Найти похожие ветки
← →
Рыбба (2009-01-20 11:34) [0]Здраствуйте все. Не могу найти ответа на свой вопрос
Допустим, есть форма-предок, в котором есть функцияfunction Ok: Boolean; virtual;
begin
if Result then ...
end;
Создаю форму наследника и переопределяю процедуруfunction Ok: Boolean; override;
begin
// действия в результате которых Result := True;
// а здесь я хочу вызывать функцию предка
inherited Ok;
Но при вызове inherited Ok в процедуре предка Result будет равно False. Как бы выполнить процедуру предка со значением Result, полученным из потомка?
Надеюсь, что понятно объяснил. Спасибо заранее всем ответившим.
← →
Ega23 © (2009-01-20 11:39) [1]Либо через параметр, либо через служебное private-поле.
← →
TUser © (2009-01-20 11:40) [2]Сделай поле FOkResult или передавай как параметр
function Ok (Res : bolean = false): boolean
← →
anonims (2009-01-20 11:40) [3]function Ok(defaultresult: boolean=true): boolean; virtual;
← →
KSergey © (2009-01-20 11:49) [4]по-моему, будет правильнее разнести функцию определяющую Ok или неOk и функцию делающую на этой основе какие-литбо действия.
Функцию определяющую ok или нет сделать виртуальной и переопределять в потомках, в базовой форме в методе, который на этот результат ориентируется вызывать функцию Ok() и выполнять нужные действия.
А сейчас мне ддумается интерфейс просто не правильно спроектирован, от того и траблы его использования, это верняцкий признак всегда.
PS
Исхожу из того, что метод Ok не начинается буквально с if Result then ... как написано в вопросе, а все ж есть какая-то перед тем логика определения этого Result
← →
Игорь Шевченко © (2009-01-20 11:52) [5]
> function Ok: Boolean; virtual;
> begin
> if Result then ...
> end;
Это неправильная функция, потому что Result-у до использования надо что-то присвоить
← →
Плохиш © (2009-01-20 11:59) [6]
> function Ok: Boolean; virtual;
> begin
> if Result then ...
> end;
>
Компилятор умный, он эту строку уже выкинул и информировал недокодера соответствующим сообщением.
← →
Медвежонок Пятачок © (2009-01-20 12:00) [7]function Ok: Boolean; override;
begin
// действия в результате которых Result := True;
// а здесь я хочу вызывать функцию предка
Result := inherited;
← →
Рыбба (2009-01-20 13:00) [8][4] Если вы мне приведете пример - я буду вам очень признателен. Ибо признаюсь, прочитав текст, не совсем понял.
Суть функции Ок в предке:
Если функция Ок в потомке выполнилась успешно, то выполнит какие-либо действия. Например,if Result then Func(Sender);
[5], [6] Согласен, что неправильная. Но я пока учусь и пробую.
[1], [2], [3] Так и подумал "через параметр", но думал может можно по другому. Приват-поле не подойдет по идее, т.к. в случае различных процедур (Boolean, Integer, String и т.д.) - придется делать 3 разных приват-поля
← →
Игорь Шевченко © (2009-01-20 13:10) [9]
> Согласен, что неправильная. Но я пока учусь и пробую
А чего хочется-то ? А то непонятно
← →
KSergey © (2009-01-20 13:15) [10]
TMyObject = class(TMyBaseObject);
.........
function TMyBaseObject.Ok: Boolean; virtual;
begin
Result := True;
end;
procedure TMyBaseObject.DoSomeAction;
begin
if Ok then ......
end;
.........
function TMyObject.Ok: Boolean; virtual;
begin
Result := False;
if ... then
begin
if ... then
begin
.....
Result := True
end;
end;
end;
← →
Рыбба (2009-01-20 15:46) [11]
> А чего хочется-то ? А то непонятно
Ну конкретно функция Ок вызывается по нажатию на кнопку Ок / Сохранить / Принять в модальном окне. Причем есть общие действия для всех окон и индивидуальные для каждого окна. Вот и думаю как правильно сделать.TfrmCustomModal = class(TForm)
procedure aOkExecute(Sender: TObject);
procedure aCancelExecute(Sender: TObject);
private
{ Private declarations }
protected
l_FuncCallBackOk, l_FuncCallBackCancel: TFuncCallBack; // Функция
public
{ Public declarations }
function Ok: Boolean; virtual;
function Cancel: Boolean; virtual;
end;function TfrmCustomModal.Ok: Boolean;
begin
if Result and Assigned(l_FuncCallBack) then
Result := l_FuncCallBackOk(dsRecord.DataSet, FKey);
end;
function TfrmCustomModal.Cancel: Boolean;
begin
if Result and Assigned(l_FuncCallBack) then
Result := l_FuncCallBackCancel(dsRecord.DataSet, FKey);
end;
procedure TfrmCustomModal.aOkExecute(Sender: TObject);
begin
try
aOk.Enabled := False;
aCancel.Enabled := False;
if Ok then
Close;
finally
aOk.Enabled := True;
aCancel.Enabled := True;
end;
end;
procedure TfrmCustomModal.aCancelExecute(Sender: TObject);
begin
try
aOk.Enabled := False;
aCancel.Enabled := False;
if Cancel then
Close;
finally
aOk.Enabled := True;
aCancel.Enabled := True;
end;
end;
Ну вот как бы так. И возник вопрос, как перекрыть методы Ok и Cancel в потомке. Судя по [10], придется значит разделять методы предка и методы потомка %)
← →
Рыбба (2009-01-20 15:48) [12]Неправильно вставил. В соответствующих местах:
if Result and Assigned(l_FuncCallBackOk) then
Result := l_FuncCallBackOk(dsRecord.DataSet, FKey);
иif Result and Assigned(l_FuncCallBackCancel) then
Result := l_FuncCallBackCancel(dsRecord.DataSet, FKey);
Но это, думаю, непринципиально
← →
Рыбба (2009-01-20 15:48) [13]И, вообще. Какого бы автора почитать про подобное наследование? Был бы очень признателен
← →
test (2009-01-20 15:55) [14]Рыбба (20.01.09 15:46) [11]
>>Судя по [10], придется значит разделять методы предка и методы потомка %)
Наследовать
TMyBaseObject=class(TForm)
public
function Ok: Boolean; virtual;
end;
TMyObject = class(TMyBaseObject);
public
procedure SomeThing;
end;
TMyObject1 = class(TMyBaseObject);
public
function Ok: Boolean; overload;
procedure SomeThing;
end;
function TMyBaseObject.Ok: Boolean; virtual;
begin
Result := True;
end;
procedure TMyObject.SomeThing;
begin
ok; //метод предка
end;
function TMyObject1.Ok: Boolean; virtual;
begin
Result := false;
end;
procedure TMyObject.SomeThing;
begin
ok; //свой метод
inherited ok;//метод предка
end;
← →
Игорь Шевченко © (2009-01-20 15:56) [15]
> Ну конкретно функция Ок вызывается по нажатию на кнопку
> Ок / Сохранить / Принять в модальном окне. Причем есть общие
> действия для всех окон и индивидуальные для каждого окна.
> Вот и думаю как правильно сделать.
Через OnCloseQuery
← →
Медвежонок Пятачок © (2009-01-20 15:57) [16]Но при вызове inherited Ok в процедуре предка Result будет равно False. Как бы выполнить процедуру предка со значением Result, полученным из потомка?
всего-то вар-параметр, пропущенный насквозь всей иерархии.
← →
test (2009-01-20 16:01) [17]TMyBaseObject=class(TForm)
public
function Ok(var i:integer): Boolean; virtual;
// потомок обязан иметь тот же вид что и предок
end;
← →
Рыбба (2009-01-20 16:02) [18]
> procedure TMyObject.SomeThing;
> begin
> ok; //свой метод
> inherited ok;//метод предка
> end;
В моем случае наверноеif ok then inherited ok;
> Через OnCloseQuery
Эээ... Недопонял. Вообще в OnCloseQuery проверяю допустим модифицированность записи и в случае True вывожу, например, диалог типа "Было изменено. Сохранить?"
[16] То бишь, [2] и [3] ?
А на вопрос о литературе можете ответить? Что почитать на эту тему?
← →
test (2009-01-20 16:05) [19]Рыбба (20.01.09 16:02) [18]
>>В моем случае наверное if ok then inherited ok;
Это уже сам решай))
>>А на вопрос о литературе можете ответить? Что почитать на эту тему?
Обьектно ориентрованное программирование, книг море.
← →
test (2009-01-20 16:07) [20]Рыбба (20.01.09 16:02) [18]
>>А на вопрос о литературе можете ответить? Что почитать на эту тему
Гради Буч хорошо на тему писал
← →
KSergey © (2009-01-20 16:16) [21]Рыбба (20.01.09 15:46) [11]
> function TfrmCustomModal.Ok: Boolean;
> begin
> if Result and Assigned(l_FuncCallBack) then
Т.е. оно буквально так и есть?? А смысл объяснить можете? Смущает использование неинициалихированной перенной Result; компилятор на этот счет ничего не говорит?
← →
Рыбба (2009-01-21 04:06) [22][21] Говорит ) Смысл - проба пера. Хотелось узнать правильность реализации. Приведенные примеры дали толчок. Буду попробовать. Спасибо всем ответившим
Страницы: 1 вся ветка
Текущий архив: 2009.03.29;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.039 c