Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.022 c
2-1233618168
koha!
2009-02-03 02:42
2009.03.29
Вопрос по функции API Openfile()


15-1232703880
123-ий
2009-01-23 12:44
2009.03.29
Шестисотая БМВ


2-1233154226
Scot Storch
2009-01-28 17:50
2009.03.29
наследник TForm


2-1234166106
CodeMaster
2009-02-09 10:55
2009.03.29
Свои компоненты


2-1233909755
kyn66
2009-02-06 11:42
2009.03.29
Не правильно работает MonthsBetween