Форум: "Прочее";
Текущий архив: 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.005 c