Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по VCL [D7, WinXP]


Uriy ©   (2006-04-21 20:44:00) 

Изучаю тут сейчас исходники VCL, и у меня возникло 2 вопроса по поводу них:
1: Почему в Image перерисовка идугие там разные действия сделаны в процедуре PictureChanged а не в SetPicture? Можно было бы обойтись без PictureChanged и реализовать все это в SetPicture? Вот так там:

TImage = class(TGraphicControl)
 private
 FPicture: TPicture;
 procedure PictureChanged(Sender: TObject);
 procedure SetPicture(Value: TPicture);

...

constructor TImage.Create(AOwner: TComponent);
begin
...
 FPicture.OnChange := PictureChanged;
...
end;

procedure TImage.SetPicture(Value: TPicture);
begin
 FPicture.Assign(Value);
end;

procedure TImage.PictureChanged(Sender: TObject);
begin
....
Invalidate;
end;


2: Почему в свойствах которые имеют типы такие как Integer или Boolean и т.д. всегда пишут процедуру "Set..." в которой идет простое присваивание переменной "F..." значения Value и все... почему нельзя сделать так:
property Size: Integer read FSize write FSize;
а делают так:
property Size: Integer read FSize write SetSize;


Мефисто   (2006-04-22 15:17:00) [1]

Uriy   (22.04.06 01:09) [9]

Можно было бы обойтись без PictureChanged и реализовать все это в SetPicture?

constructor TImage.Create(AOwner: TComponent);
begin
...
FPicture.OnChange := PictureChanged;
...
end;

Моно, но не нужно т.к. кроме метода SetPicture бывают и другие. Например LoadFromFile. И на вызов подобного метода компонент должен адекватно отреагировать.


Uriy   (2006-04-22 01:09:00) [2]

Спасибо


Джо   (2006-04-21 23:05:00) [3]

> [7] Uriy   (21.04.06 22:02)
> а еще в догонку вопрос когда в Set объявлять пемеменную
> как const а когда нет? вот например тип TRect?

Объявляй как const, в нек. случаях приведет к более оптимизированному коду. Хотя именно на счет TRect не уверен, что приведет, но и не помешает точно, хотя бы для ясности.


Uriy   (2006-04-21 22:02:00) [4]

а еще в догонку вопрос когда в Set объявлять пемеменную как const а когда нет? вот например тип TRect?


Uriy   (2006-04-21 21:54:00) [5]

если быть точнее OnChange сработает после присвоения в SetPicture =))


Uriy   (2006-04-21 21:53:00) [6]

вроде как понятно... если нужно выполнить какое-то действие, не только присвоить какое-то значение, но и по ходу с этим изменением сделать еще что-то... вот для это Set используется, а изменение этого свойства ниначно не влияет, то можно и без Set обойтись...
А что вы скажете по первому вопросу? Можно при изменении изображения Invalidate; написать в "SetPicture"?  ведь в этом случае событие OnChange и SetPicture почти одновременно сработают...


Desdechado   (2006-04-21 21:48:00) [7]

Set... делается, в частности, еще и для того, что в будущем такое присваивание в наследниках (или новых версиях) потребует дополнительной обработки, что и можно сделать, перекрыв метод


Рамиль   (2006-04-21 21:41:00) [8]


> неиспользование "Set..." присваиваться не будет или что?

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


Uriy   (2006-04-21 20:57:00) [9]

Мне пока попадалось во всех случаях... может где-то и не увидел правда... А в чем разница использования и неиспользование "Set..." присваиваться не будет или что?


Джо   (2006-04-21 20:52:00) [10]

> 2: Почему в свойствах которые имеют типы такие как Integer
> или Boolean и т.д. всегда пишут процедуру "Set..." в

Отчего же всегда? Вовсе не всегда.


Наверх

Титульная страница Поиск, карта сайта Написать письмо