![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по 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..." в
Отчего же всегда? Вовсе не всегда.