Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 11:22   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию как изменить видимость методов в наследнике стандартного класса?

Где-то видел очень похожий пример - как сделать видимым Canvas в TPanel.
там создавали наследника от панельки и писали в нем:
public
property Canvas;
и это работало - Canvas теперь виден был в новом классе

Как такое же сделать с процедурами?

Вот наследую я свой класс от панельки и хочу в нем использовать
стандартный SetWidth, который описан еще в TControl, и он там в private.

по аналогии с первым примером пытаюсь написать:
public
procedure SetWidth(value:integer);

но компилятор, в принципе, справедливо сообщает
что процедура объявлена, но не реализована...

Вот можно ли ему как-то объяснить, что это не новая процедура,
а попытка перенести старую в public ?

Заранее спасибо =)
xrob вне форума Ответить с цитированием
Старый 15.04.2013, 12:56   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
стандартный SetWidth, который описан еще в TControl, и он там в private.
Увы, для private это не пройдет.

Если бы она была protected (что и было в property Canvas)
то можно было бы написать СВОЮ процедуру(метод) в котором вызывать нужную. Но не private.
Смысл private как раз в том чтобы никто и никогда не смог бы напрямую пользоваться ею (только сам класс).
А для Tcontrol (и тем паче TPanel) есть же свойство public(а может protected) property Width которое как раз и "открывает" данную процедуру (выполняет действия по ее вызову).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.04.2013 в 12:59.
evg_m вне форума Ответить с цитированием
Старый 15.04.2013, 15:46   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Дело в том, что мне как раз и нужны эти имена свойств.
чтобы в моем компоненте было свойство Width, которое бы вызывало
стандартные действия + действия моего компонента на случай изменения размера -
перерассчет координат, перерисовка и т.п.
xrob вне форума Ответить с цитированием
Старый 16.04.2013, 09:57   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Для изменения реакций (включения дополнительных действий) есть динамические(dinamic) и виртуальные (virtual) методы.
Так в Tcontrol есть
Код:
Tcontrol =class
protected
procedure Resize; dinamic; 

end;
И вам надо всего лишь
Код:
TMycontrol =class(TControl)
protected
  procedure Resize; override;

end;

procedure TMyControl.Resize; override;
begin
  ...  // выполнить до родительской обработки
  inherited;  // использовать родительскую обработку
  .... // а это после родительской 
end;
Цитата:
перерассчет координат, перерисовка и т.п.
пересчет координат здесь да возможен.
А для перерисовки вообще-то есть
procedure Paint; virtual;
и много много других на все другие случаи.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 16.04.2013, 13:16   #5
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

evg_m, а если мне нужны разные действия на изменение высоты или ширины? =)

проверять в Resize что изменилось?
а если при вызове свойства ширины, но с таким же параметром, как сейчас,
нужно выполнить только действия, предназначенные для события ширины?

да что-то вроде
C.Width:=100;
// some actions
C.Width:=100;

вы, конечно скажете, что это глупо, мол, зачем устанавливать ширину 100, если она и так 100,
но вы не можете предусмотреть всех возможных ситуаций,
а у меня иногда возникает потребность в таких действиях.

а перекрытый Paint во всех моих компонентах
используется лишь с одной целью - отрисовать Frame на Canvas окна.

Frame - это битмап, который есть в каждом моем графическом компоненте.
его размеры равны размерам формы и отрисовка самого компонента
производится именно на него.

этот Frame - что-то вроде заднего буффера, поскольку если сразу
рисовать все на Canvas окна, то неизбежно мелькание (и никакой DoubleBuffered здесь не поможет).
это первая причина.
вторая - иногда делаю компоненты, у которых отрисовка некоторых элементов
сложнее, чем отрисовка всего Frame в итоге.
поэтому вся отрисовка происходит в процедуре Render, по МОЕМУ специальному запросу
(например в случае изменения размеров), а не по сообщению винды.

а в случае последнего, как я уже говорил - готовый Frame рисуется на Canvas окна.


С минусами, конечно не поспоришь - растяни компонент на весь экран и получишь
огромного размера битмап в памяти...
Но, если предложите более оптимальный способ отображения без мелькания -
перепишу все свои компоненты =)

Последний раз редактировалось xrob; 16.04.2013 в 14:18.
xrob вне форума Ответить с цитированием
Старый 16.04.2013, 13:24   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

OnCanResize и OnResize формы чем не нравятся? В первом из них вообще можно запретить изменение размеров или подавить их своими значениями
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.04.2013, 13:57   #7
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Аватар, мало информации.
Так мы узнаем только что что-то изменилось, а что именно - не знаем.
А что бы вы сделали?

Если вы едете на машине и прокололи колесо, вы менять все будете, или только проколотое?
вот в случае OnResize вы, похоже, все собираетесь менять...

Проблему, описанную в первом посте я решил радикально:

Код:
WHTL - Width, Height, Top, Left соответственно (нужное подчеркнуть)

(процедура TControl.Set-WHTL канула в лету и больше никогда не будет запущена)

TMyClass = class(TPanel)
public // не вижу смысла от самого себя что-то скрывать

F-WHTL:integer; // переменные для хранения параметров

procedure MySet-WHTL(value:integer);
property Width (<--- красивое название!!!) :integer read FWidth write MySetWidth; <-- св-во запускает мою процедуру

procedure Update;
end;

implementation

procedure TMyClass .MySet-WHTL(value:integer);
begin
F-WHTL:=value;
SomeActions; <-- мои действия в случае изменения конкретного параметра
Update;
end;

procedure TMyClass .Update;
begin
SetWindowPos(Handle, 0, FLeft, FTop, FWidth, FHeight, SWP_NOZORDER);
end;
конечно, в таком случае не выполняются действия стандартных
TControl.Set-WHTL (пока не разобрался какую роль они играют),
но все работает и результатом я доволен.

Последний раз редактировалось xrob; 16.04.2013 в 14:01.
xrob вне форума Ответить с цитированием
Старый 16.04.2013, 14:03   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
мало информации
Ни чего не мало. Исходные значения Width и Height можно запомнить в OnActivate в переменные доступные всем процедурам формы (в Private формы например их разместить). Далее в той же OnResize имеем старые и новые значения. На выходе из OnResize новые засунуть в те же переменные
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.04.2013 в 14:05.
Аватар вне форума Ответить с цитированием
Старый 16.04.2013, 14:31   #9
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

в посте #5 я выделил то, что я понимаю под "мало информации"

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

Как узнать что окно изменило видимость?

т.е. была запущена private процедура SetVisible.

Последний раз редактировалось xrob; 16.04.2013 в 15:59.
xrob вне форума Ответить с цитированием
Старый 16.04.2013, 16:02   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Для изменения реакций (включения дополнительных действий) есть динамические(dinamic) и виртуальные (virtual) методы.
Все virtual; dinamic; сделаны именно для тех кого не устраивает стандартное поведение.
Цитата:
и много много других на все другие случаи.
Код:
    function CanResize(var NewWidth, NewHeight: Integer): Boolean; virtual;
Цитата:
Description

CanResize is called automatically when an attempt is made to resize the control, after any autosizing has occurred. The NewWidth and NewHeight arguments specify the attempted new values for the control’s height and width. CanResize optionally adjusts the values of NewWidth and NewHeight, and returns true if the control can be resized to the returned values. CanResize returns false if the control cannot be resized.

CanResize generates an OnCanResize event. An OnCanResize event handler may change the values of NewHeight and NewWidth.
See Also
Цитата:
Occurs when an attempt is made to resize the control.
Код:
type TCanResizeEvent = procedure(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean) of object;

property OnCanResize: TCanResizeEvent;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.04.2013 в 16:10.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перегрузка методов класса (с++) Antej Общие вопросы C/C++ 2 24.07.2012 17:58
Видимость полей и методов sich_zp Общие вопросы C/C++ 19 16.08.2011 15:05
массив методов класса DartDayring Общие вопросы C/C++ 0 07.12.2010 20:00
видимость переменных и методов в c# Sparky Помощь студентам 5 26.07.2010 20:20
Типы данных стандартного класса mauar Общие вопросы Delphi 10 23.05.2009 18:24