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

Вниз

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

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

Наверх




Память: 0.48 MB
Время: 0.004 c
15-1244207036
DeadMeat
2009-06-05 17:03
2009.08.09
Каталогизатор фильмов


2-1244723611
bot77
2009-06-11 16:33
2009.08.09
Перевод файла в троичной системе в аски и обратно.


11-1204867469
ILPU
2008-03-07 08:24
2009.08.09
Сохранение содержимого TreeView


6-1205463868
prodex
2008-03-14 06:04
2009.08.09
Асинхронные сокеты


1-1211900401
viperv
2008-05-27 19:00
2009.08.09
скачать файл из инета





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский