Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.026 c
15-1145099223
Чародей
2006-04-15 15:07
2006.05.14
TIFF


2-1145991776
valdemot
2006-04-25 23:02
2006.05.14
IniFile


4-1140421018
DrNemo
2006-02-20 10:36
2006.05.14
Загрузка с интернета с проверкой размера файла после загр


2-1145967140
my_sweet
2006-04-25 16:12
2006.05.14
переход на первую строку StringGrid


11-1126114007
KirillT
2005-09-07 21:26
2006.05.14
Открытие програмным путем общего доступа к папке на своей машине




   Наверх