powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / double inherited
11 сообщений из 11, страница 1 из 1
double inherited
    #32187014
SerjaTo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте Господа.
Есть такой вопрос:
у компонента наследника для вызова переопределенного метода предка можно использовать inherited.
А вот как вызвать такой метод для дедушки этого компонента?
...
Рейтинг: 0 / 0
double inherited
    #32187022
В Билдере можнонаписать так
CDedushkaClass::Method(...);
а в дельфи незнаю
...
Рейтинг: 0 / 0
double inherited
    #32187028
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SerjaTo: идеологически неверный вопрос - хотите метод дедушки - наследуйте компонент от него
...
Рейтинг: 0 / 0
double inherited
    #32187469
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на самом деле всё банально:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  TObject=class
  ...
  Tmoney=class(TObject)
  ...
  TBigMoney=class(TMoney)
  ...
  
constructor TBigMoney.Init;
begin
  TObject.Init;
end;

то бишь это сделать можно, хоть и неудобно...
...
Рейтинг: 0 / 0
double inherited
    #32187473
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и самое главное забыл:
идеологически неверно так делать!!!! , потому и нет специальных ключевых слов для этого. Принципы ООП нарушаются, насколько я понимаю...
...
Рейтинг: 0 / 0
double inherited
    #32188747
Фотография Umak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>m_kus
Не то! Так можно вызывать только конструктор и методы класса.

А Задача такая: есть неплохой визуальный сторонний компонент.
Он наследован от Tcustomgrid,
в нем полностью переопределены MouseDown, KeyDown и т.д.
И ведет он себя не так как хотелось.
Надо чтобы управление было как в Tcustomgrid.
Как можно в MouseDown, KeyDown вернуться к Tcustomgrid?
...
Рейтинг: 0 / 0
double inherited
    #32188816
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Umak:
Не понял, как это "не то"? Как был сформулирован вопрос, так я на него не ответил. Был вопрос, как вызвать метод дедушки, я написал.
Про описанную тобой ситуацию нельзя ничего сказать, не взглянув на исходный код твоих "стороннего" компонента, да и не большой спец я... А между тем, всё зависит от того, как там это реализовано... Ты имеешь ввиду, переопределить события OnMouseDown, OnKeyDown? То есть сделать нечто подобное:
Код: plaintext
1.
2.
3.
4.
procedure TForm1.MyGridMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  TCustomGrid.MouseDown(...);
end;

?
В таком случае можно попробовать таким образом:
Код: plaintext
1.
2.
3.
4.
procedure TForm1.MyGridMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  TCustomGrid(MyGrid).MouseDown(Button, Shift, X, Y);
end;

но вряд ли получиться, да и не отменит (скорее всего) действие на MouseDown по умолчанию для "стороннего" компонента...
Другой способ - наследоваться от компонента и переопределить метод MouseDown указанном выше (в предыдущем посте) способом...
...
Рейтинг: 0 / 0
double inherited
    #32190757
Фотография Umak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>m_kus
Понял правильно, но такая реализация не годится.
TCustomGrid.MouseDown(...) - MouseDown процедура не класса!
TCustomGrid(MyGrid).MouseDown(Button, Shift, X, Y)
- MouseDown из секции Protected - не найдется!(попробуйте код откомпилить)
Если в этом модуле сначало
TGrid=class(TCutomGrid);
и TGrid(MyGrid).MouseDown(Button, Shift, X, Y);
То MouseDown(Button, Shift, X, Y) вызовется от TmyGrid, ибо медот виртуальный
и вызывать в оnMouseDown его нельзя - рекурсия,
а в MouseDown();overide; - бесполезно!
о задаче:
В TmyGrid выделяется и редактируется FixedCols - если MouseDown вернуть к TcustomGrid - было бы как хотелось.
Вопрос остаётся открытым!
...
Рейтинг: 0 / 0
double inherited
    #32190820
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
о задаче:
В TmyGrid выделяется и редактируется FixedCols - если MouseDown вернуть к TcustomGrid - было бы как хотелось.

А там нет события OnSelectCell? Твою задачу можно решить если такое событие есть и написать обработчик следующим образом.:
Код: plaintext
1.
2.
3.
4.
5.
  procedure TForm1.MyGridSelectCell(Sender: TObject; ACol, ARow: Longint;
    var CanSelect: Boolean);
  begin
     CanSelect:=(ACol> 0 )and(ARow> 0 ){например};
  end;

Если нет, и нет ничего подобного, то могу посоветовать последний способ:
переопределить обработчик событий для всей формы, где при событии WMMouseDown, с помощью TCustomGrid.MouseCoord() проверять ячейку, которую пытается выбрать пользователь и в случае возможности её выбрать передавать событие гриду, в противном случае - не передавать, соответственно. С KeyDown будет посложней, но тоже можно извартиться... Но для этого уж придётся разобраться в механизме обработки событий...
Другой способ (после последнего), заключается в написании своего компонента на основе данного (впрочем я уже это писал)... Кстати, у имеются исходники этого компонента?
А из обработчика событий OnMouseDown отменить действие TMyGrid.MouseDown, так как скорее всего оно уже выполнилось... Разве что попробовать вызвать исключение:
Код: plaintext
1.
2.
3.
4.
  procedure TForm1.MyGridMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  begin
    if ... then raise Exception.Create('Сюда никак нельзя.');
  end;

а исключение давить например в Application.OnException... :-)
но я сомневаюсь, что это будет работать как надо...
...
Рейтинг: 0 / 0
double inherited
    #32191836
Фотография Umak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
double inherited
    #32191875
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НУ И ЧТО?
Работает?
Что они тебе посоветовали?
То же что и я - наследоваться, то есть написать свой TMyGrid... А в таком случае всё просто...
И ты хочешь сказать, что такой код не работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
procedure TYourGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
 X, Y: Integer);
begin
 // вызов непосредственно метода TCustomGrid.MouseDown
 // для данного экземпляра

 TCustomGrid.MouseDown(Button,Shift,X,Y);
end;

а который reonid посоветовал, работает?
Или ты всё-таки из обработчика событий формы вызываешь и работает?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TMyForm.MyGridMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var 
 md: TMouseDownProc;
begin
 // вызов непосредственно метода TCustomGrid.MouseDown
 // для данного экземпляра

 TMethod(md).Code := @THackCustomGrid.MouseDown;
 TMethod(md).Data := Sender;

 md(Button, Shift, X, Y);
end;

Хорошо, если так работает и нет глюков, признаю, не знал, что такое возможно...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / double inherited
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]