Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
ВнизВопрос по VCL Найти похожие ветки
← →
Uriy (2006-04-21 20:44) [0]Изучаю тут сейчас исходники 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-21 20:52) [1]> 2: Почему в свойствах которые имеют типы такие как Integer
> или Boolean и т.д. всегда пишут процедуру "Set..." в
Отчего же всегда? Вовсе не всегда.
← →
Uriy (2006-04-21 20:57) [2]Мне пока попадалось во всех случаях... может где-то и не увидел правда... А в чем разница использования и неиспользование "Set..." присваиваться не будет или что?
← →
Рамиль © (2006-04-21 21:41) [3]
> неиспользование "Set..." присваиваться не будет или что?
Будет. Процедура делается для проверки значения и выполнения каких либо действий. Например, при присвоение Color компонент сразу мняет цвет, а без процедуры это не сделаешь.
← →
Desdechado © (2006-04-21 21:48) [4]Set... делается, в частности, еще и для того, что в будущем такое присваивание в наследниках (или новых версиях) потребует дополнительной обработки, что и можно сделать, перекрыв метод
← →
Uriy (2006-04-21 21:53) [5]вроде как понятно... если нужно выполнить какое-то действие, не только присвоить какое-то значение, но и по ходу с этим изменением сделать еще что-то... вот для это Set используется, а изменение этого свойства ниначно не влияет, то можно и без Set обойтись...
А что вы скажете по первому вопросу? Можно при изменении изображения Invalidate; написать в "SetPicture"? ведь в этом случае событие OnChange и SetPicture почти одновременно сработают...
← →
Uriy (2006-04-21 21:54) [6]если быть точнее OnChange сработает после присвоения в SetPicture =))
← →
Uriy (2006-04-21 22:02) [7]а еще в догонку вопрос когда в Set объявлять пемеменную как const а когда нет? вот например тип TRect?
← →
Джо © (2006-04-21 23:05) [8]> [7] Uriy (21.04.06 22:02)
> а еще в догонку вопрос когда в Set объявлять пемеменную
> как const а когда нет? вот например тип TRect?
Объявляй как const, в нек. случаях приведет к более оптимизированному коду. Хотя именно на счет TRect не уверен, что приведет, но и не помешает точно, хотя бы для ясности.
← →
Uriy (2006-04-22 01:09) [9]Спасибо
← →
Мефисто (2006-04-22 15:17) [10]Uriy (22.04.06 01:09) [9]
Можно было бы обойтись без PictureChanged и реализовать все это в SetPicture?
constructor TImage.Create(AOwner: TComponent);
begin
...
FPicture.OnChange := PictureChanged;
...
end;
Моно, но не нужно т.к. кроме метода SetPicture бывают и другие. Например LoadFromFile. И на вызов подобного метода компонент должен адекватно отреагировать.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c