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

Вниз

Вопрос об удивительном глюке пропертей компонентов VCL   Найти похожие ветки 

 
Starkom ©   (2003-09-17 15:01) [0]

Есть такая странная ситуация:

type PInteger = ^Integer;
...
var pi:PInteger;
but:TBitBtn;
bev:TBevel;
begin
pi:=@bev.Left;
pi^:=StrToInt("1");
bev.Parent.Refresh;

pi:=@but.Left;
pi^:=StrToInt("1");
ShowMessage(IntToStr(but.Left));
but.Parent.Refresh;
end;

Глюк заключается в том, что для Бевела все нормально работает. Для БитБаттона же ШоуМесседж выдает 1! Но визуально это никак не отображается! При том, что, если добавим строчку but.Top:=1; вместо шоумесседжа, то все нормально отображается - то есть и топ становится 1, и лефт=1!!!
Помогите разобраться!!! Копался в исходниках VCL - так и не нашел отгадки.


 
Palladin ©   (2003-09-17 15:05) [1]

заяц это не только ценный мех но и...
адрес property может указывать не только на отвечающую за него переменную, но (что в этом случае и имеет место) на процедуру write для него...
так что ты записываешь 1 в первый байт начала тела процедуры...


 
Starkom ©   (2003-09-17 15:12) [2]

Хмм.
property Left: Integer read FLeft write SetLeft; - это у TControl
Ни для TBevel-TGraphicControl, ни для TBitBtn-TButton-TButtonControl-TWinControl SetLeft не переопределен, то есть метод вызывается и для Бевела, и для БитБаттона один и тот же. Вся загвоздка в том, почему же для Бевела тогда это работает, если все так и есть, как Вы сказали?


 
Verg ©   (2003-09-17 15:15) [3]


> Помогите разобраться!!! Копался в исходниках VCL - так и
> не нашел отгадки.


Как не нашел?
а
property Left: Integer read FLeft write SetLeft;

где

procedure SetLeft(Value: Integer);

Ну допустим, в данном случае @Left вернет адрес поля FLeft
экземпляра класса. Ну а когда ты пишешь в этот адрес значение, с какой такой радости будет вызван SetLeft?


 
Palladin ©   (2003-09-17 15:17) [4]

хем... надо поковырять исходники... по идее и при вызове берется read а в данном случае это поле...

а зачем столь извращенная вещь понадобилась?


 
Starkom ©   (2003-09-17 15:42) [5]

В-общем, вся проблема в том, что Бевел - это Контрол, а БитБаттон - это ВинКонтрол. У них разные СетБаундсы, которые вызываются из СетЛефтов. И bev.Parent.Refresh; работает, потому что у ТКонтрола Инвалидейт, вызываемый из Рефреша делает почти то же самое, что и СетБаундс. У ВинКонтрола же все иначе :((


 
Starkom ©   (2003-09-17 15:54) [6]

Придется юзать SetPropValue, а так не хочется :((


 
me   (2003-09-17 16:02) [7]

А причём здесь вообще SetLeft?

конструкция
pi:=@bev.Left
даст тебе адрес FLeft, а если чтение происходит через метод -
то вообще ошибку компиляции.

Я вообще сколнен считать возможность взять адрес св-ва
недосмотром разработчиков.
Дело скорее всего в том, что компилятор в такой конструкции
сразу заменяет св-во на FXXX или SetXXX.

Пользоваться этой дырой ИМХО - весьма и весьма дурной тон.


 
Starkom ©   (2003-09-17 16:06) [8]

2 me: EXACTLY!!! При попытке подсунуть оператору @ св-во, получаемое через Get-метод, компилятор выдает ошибку. А насчет недосмотра - разработчики дают инструмент, кто-то его использует с умом, кто-то без (например, я :) ). Никто же не ругает разработчиков огнестрельного оружия, за то, что кто-то его использует не так, как это задумывали сами разработчики.



Страницы: 1 вся ветка

Текущий архив: 2003.09.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
1-96228
Mild
2003-09-17 19:16
2003.09.29
Родительские и дочерние классы


14-96443
Gorlum
2003-09-09 16:57
2003.09.29
Парадокс


14-96448
otvet
2003-09-10 10:26
2003.09.29
Как у PageControl у табшитов поменять цвет?


1-96166
Patrick
2003-09-16 11:20
2003.09.29
Чтение из регистров Windows.


1-96263
den777
2003-09-17 10:39
2003.09.29
Использование классов в разных BPL