Конференция "Прочее" » Вопрос про наследование форм
 
  • Рыбба (20.01.09 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 © (20.01.09 11:39) [1]
    Либо через параметр, либо через служебное private-поле.
  • TUser © (20.01.09 11:40) [2]
    Сделай поле FOkResult или передавай как параметр
    function Ok (Res : bolean = false): boolean
  • anonims (20.01.09 11:40) [3]
    function Ok(defaultresult: boolean=true): boolean; virtual;
  • KSergey © (20.01.09 11:49) [4]
    по-моему, будет правильнее разнести функцию определяющую Ok или неOk и функцию делающую на этой основе какие-литбо действия.

    Функцию определяющую ok или нет сделать виртуальной и переопределять в потомках, в базовой форме в методе, который на этот результат ориентируется вызывать функцию Ok() и выполнять нужные действия.

    А сейчас мне ддумается интерфейс просто не правильно спроектирован, от того и траблы его использования, это верняцкий признак всегда.

    PS
    Исхожу из того, что метод Ok не начинается буквально с if Result then ... как написано в вопросе, а все ж есть какая-то перед тем логика определения этого Result
  • Игорь Шевченко © (20.01.09 11:52) [5]

    > function Ok: Boolean; virtual;
    > begin
    > if Result then ...
    > end;


    Это неправильная функция, потому что Result-у до использования надо что-то присвоить
  • Плохиш © (20.01.09 11:59) [6]

    > function Ok: Boolean; virtual;
    > begin
    > if Result then ...
    > end;
    >

    Компилятор умный, он эту строку уже выкинул и информировал недокодера соответствующим сообщением.
  • Медвежонок Пятачок © (20.01.09 12:00) [7]
    function Ok: Boolean; override;
    begin
    // действия в результате которых Result := True;
    // а здесь я хочу вызывать функцию предка
    Result := inherited;
  • Рыбба (20.01.09 13:00) [8]
    [4] Если вы мне приведете пример - я буду вам очень признателен. Ибо признаюсь, прочитав текст, не совсем понял.

    Суть функции Ок в предке:
    Если функция Ок в потомке выполнилась успешно, то выполнит какие-либо действия. Например,
    if Result then Func(Sender);



    [5], [6] Согласен, что неправильная. Но я пока учусь и пробую.

    [1], [2], [3] Так и подумал "через параметр", но думал может можно по другому. Приват-поле не подойдет по идее, т.к. в случае различных процедур (Boolean, Integer, String и т.д.) - придется делать 3 разных приват-поля
  • Игорь Шевченко © (20.01.09 13:10) [9]

    > Согласен, что неправильная. Но я пока учусь и пробую


    А чего хочется-то ? А то непонятно
  • KSergey © (20.01.09 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;

  • Рыбба (20.01.09 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], придется значит разделять методы предка и методы потомка %)
  • Рыбба (20.01.09 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);



    Но это, думаю, непринципиально
  • Рыбба (20.01.09 15:48) [13]
    И, вообще. Какого бы автора почитать про подобное наследование? Был бы очень признателен
  • test (20.01.09 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;
  • Игорь Шевченко © (20.01.09 15:56) [15]

    > Ну конкретно функция Ок вызывается по нажатию на кнопку
    > Ок / Сохранить / Принять в модальном окне. Причем есть общие
    > действия для всех окон и индивидуальные для каждого окна.
    >  Вот и думаю как правильно сделать.


    Через OnCloseQuery
  • Медвежонок Пятачок © (20.01.09 15:57) [16]
    Но при вызове inherited Ok в процедуре предка Result будет равно False. Как бы выполнить процедуру предка со значением Result, полученным из потомка?

    всего-то вар-параметр, пропущенный насквозь всей иерархии.
  • test (20.01.09 16:01) [17]
    TMyBaseObject=class(TForm)
    public
    function Ok(var i:integer): Boolean; virtual;
    // потомок обязан иметь тот же вид что и предок

    end;
  • Рыбба (20.01.09 16:02) [18]

    > procedure TMyObject.SomeThing;
    > begin
    >  ok; //свой метод  
    >  inherited ok;//метод предка
    > end;

    В моем случае наверное
    if ok then inherited ok;




    > Через OnCloseQuery

    Эээ... Недопонял. Вообще в OnCloseQuery проверяю допустим модифицированность записи и в случае True вывожу, например, диалог типа "Было изменено. Сохранить?"

    [16] То бишь, [2] и [3] ?

    А на вопрос о литературе можете ответить? Что почитать на эту тему?
  • test (20.01.09 16:05) [19]
    Рыбба   (20.01.09 16:02) [18]
    >>В моем случае наверное if ok then inherited ok;
    Это уже сам решай))

    >>А на вопрос о литературе можете ответить? Что почитать на эту тему?
    Обьектно ориентрованное программирование, книг море.
 
Конференция "Прочее" » Вопрос про наследование форм
Есть новые Нет новых   [134453   +34][b:0][p:0.002]