Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Вопрос по 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
2-1145709298
Ку Ку
2006-04-22 16:34
2006.05.14
Дополнительная кнопка


2-1145808019
mctarik
2006-04-23 20:00
2006.05.14
Вызов процедуры в MessageBox


4-1140359306
Nick Denry
2006-02-19 17:28
2006.05.14
Как получить кусочек Background a?


3-1142850017
Некто_Аполло
2006-03-20 13:20
2006.05.14
Изменение структуры тыблицы


2-1145978159
AlexanderMS
2006-04-25 19:15
2006.05.14
Ссылка на e-mail