Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про наследование форм   Найти похожие ветки 

 
Рыбба   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.049 c
15-1232696519
desc
2009-01-23 10:41
2009.03.29
Склеить видео файлы


15-1231675452
Shira
2009-01-11 15:04
2009.03.29
Кто возмется сделать диаграммер типа Visio?


4-1207309857
DiamondShark
2008-04-04 15:50
2009.03.29
Как узнать, что приложение запущено в терминальной сессии?


15-1232916784
Piter
2009-01-25 23:53
2009.03.29
Miranda IM: моя сборка (Mirapit)


15-1232375977
SP
2009-01-19 17:39
2009.03.29
Съемный диск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский