Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.09;
Скачать: CL | DM;

Вниз

Перекрыть приватный метод   Найти похожие ветки 

 
Rimdus   (2009-06-09 20:37) [0]

Мастера, доброй вечер!

Встала проблема в перекрытии приватного метода класса TCustomDBGrid, а именно procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;

Если здесь нет ничего криминального то это вопрос синтаксиса, пробовал писать так:
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; override; // еВыдат кучу ошибок
[Pascal Error] BuhDBGridU.pas(12): E2029 ";" expected but identifier "override" found
[Pascal Error] BuhDBGridU.pas(14): E2029 "," or ":" expected but "PROPERTY" found
[Pascal Error] BuhDBGridU.pas(91): E2361 Cannot access private symbol TCustomDBGrid.WMVScroll

Последняя ошибка смущает (


 
test ©   (2009-06-09 20:56) [1]

Процедура то не виртуальная динамическая, перегрузить таким макаром ты ее не сможешь, просто в потомке напиши обработчик и обрабатывать будет твоя процедура, а не предка. Для того чтобы работала процедура предка надо будет использовать inherited.


 
palva ©   (2009-06-09 21:20) [2]


> Для того чтобы работала процедура предка надо будет использовать
> inherited.

Приватную процедуру предка все равно вызвать не получится.


 
@!!ex ©   (2009-06-09 21:24) [3]

> [2] palva ©   (09.06.09 21:20)

??
TCustomDBGrid(self).WMVScroll()


 
oxffff ©   (2009-06-09 22:02) [4]


> Rimdus   (09.06.09 20:37)


Tabc=class
procedure abc(var A);message WM_PAINT;
end;

Tabc2=class(Tabc)
procedure abc(var A);message WM_PAINT;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:Tobject;
   b:word;
begin
a:=Tabc2.Create;
b:=WM_PAINT;
a.Dispatch(b);
a.free;
end;

{ Tabc }

procedure Tabc.abc(var A);
begin
showmessage("Tabc");
end;

{ Tabc2 }

procedure Tabc2.abc(var A);
begin
showmessage("Tabc2");
end;


 
Rimdus   (2009-06-10 06:53) [5]


> palva ©   (09.06.09 21:20) [2]
>
> > Для того чтобы работала процедура предка надо будет использовать
>
> > inherited.
>
> Приватную процедуру предка все равно вызвать не получится.
>


Вызываю как сказал test © (отдельное спасибо), "INHERITED", предварительно перекрыв проц. предка. Исключением является отсутствие возможности передать в процедуру предка (var message).

Может проблема в другом?


 
oxffff ©   (2009-06-10 08:28) [6]


> palva ©   (09.06.09 21:20) [2]
>
> > Для того чтобы работала процедура предка надо будет использовать
>
> > inherited.
>
> Приватную процедуру предка все равно вызвать не получится.
>


При должной сторовке получится.


 
test ©   (2009-06-10 08:32) [7]

Rimdus   (10.06.09 06:53) [5]
Inherited не перекрывает, а вызывает метод предка.


 
Rimdus   (2009-06-10 09:28) [8]


> test ©   (10.06.09 08:32) [7]
> Rimdus   (10.06.09 06:53) [5]
> Inherited не перекрывает, а вызывает метод предка.


Имел ввиду, что мой метод так же называется, а из него вызываю метод предка с помощью инхеритед.


> oxffff ©   (10.06.09 08:28) [6]

> При должной сторовке получится.


Немного не понял о чем речь?


 
oxffff ©   (2009-06-10 09:30) [9]


> > oxffff ©   (10.06.09 08:28) [6]
>
> > При должной сторовке получится.
>
>
> Немного не понял о чем речь?


О другом.


 
Плохиш ©   (2009-06-10 11:47) [10]


> Rimdus   (10.06.09 06:53) [5]


> Вызываю как сказал test © (отдельное спасибо), "INHERITED",
>  предварительно перекрыв проц. предка. Исключением является
> отсутствие возможности передать в процедуру предка (var
> message).
>

Неужели в справке по inherited ничего не написано?


 
Юрий Зотов ©   (2009-06-10 13:26) [11]

> Rimdus   (09.06.09 20:37)  

procedure Txxx.WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;

Это метод обработки сообщения. Такие методы:
- являются динамическими;
- не требуют указания директивы dynamic;
- в потомках объявляются без директивы override;
- не должны располагаться в private.


 
oxffff ©   (2009-06-10 13:36) [12]

>
> Юрий Зотов ©   (10.06.09 13:26) [11]

>  не должны располагаться в private.



Приветствую Вас.
Тогда вся иерархия VCL это нарушение этого правила.


 
Игорь Шевченко ©   (2009-06-10 14:31) [13]


> - не должны располагаться в private.


почему ? обработка динамических сообщений с директивой message не зависит от области видимости


 
oxffff ©   (2009-06-10 14:53) [14]


> Игорь Шевченко ©   (10.06.09 14:31) [13]


Здесь причина в том, что мы не видим приватных членов некоторого класса и соответственно не может ими пользоваться(то есть вызывать или перекрывать). Т.е. нельзя написать.

Tabc=class(ClassFromOtherUnitWithPrivateDynamicProc)
procedure BaseClassPrivateDynamicProcName;override; <-Compile error.
end;

Однако использование message нарушит инкапсуляцию. поскольку мы можем вмешаться в поведение private члена вне модуля его декларации и имплиментации.



Страницы: 1 вся ветка

Текущий архив: 2009.08.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
15-1244320205
Юрий
2009-06-07 00:30
2009.08.09
С днем рождения ! 7 июня 2009 воскресенье


8-1196165704
DmT
2007-11-27 15:15
2009.08.09
ПОЛУпрозрачность в некоторой области формы


15-1244233802
Юрий
2009-06-06 00:30
2009.08.09
С днем рождения ! 6 июня 2009 суббота


2-1244966873
Guriev
2009-06-14 12:07
2009.08.09
Возможно ли такое!!!??? ))) Поле MEMO с гиперссылками?


4-1213906630
pomashok
2008-06-20 00:17
2009.08.09
Эмулирование нажатия WIN+R