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

Вниз

Подскажите, почему не работает ?   Найти похожие ветки 

 
Newbee   (2006-02-17 16:27) [0]

Начал тут изучать Pointer... :)

procedure TForm1.Button1Click(Sender: TObject);
var PDim : ^integer;
   //Указатель на адрес значения типа intrger. Так ?
begin

 PDim := @Panel1.Height;
 // Теперь это указатель на адрес, по которому хранится высота панели. Так ?

 PDim^ := Panel1.Height - 20;
 // А вот если изменить значение по этому адресу, то высота панели не меняется...
 // А почему ???

end;


 
Desdechado ©   (2006-02-17 16:29) [1]

потому что надо обращаться к свойствам объекта, чтоб он отработал реакцию на твои действия


 
Mikhail   (2006-02-17 16:33) [2]

Бросаем изучать Pointer, идем изучать property :))


 
Newbee   (2006-02-17 16:35) [3]

Если после
PDim^ := Panel1.Height - 20;

Вставить Invalidate

то при перерисовке компонент (панель) должен будет определить свою высоту. По адресу этого свойства хранится уже измененное значение. Но - высота остается прежней... Как так ?


 
Newbee   (2006-02-17 16:50) [4]

Что самое интересное... :)

Panel1.Height действительно изменяется

Если я вместо Invalidate пишу Panel1.Height := Panel1.Height + 2, то высота панели меняется на -20 + 2 = 18 точек...

Однако Invalidate, Refresh, Repaint не оказывают на панель никакого действия. Откуда тогда берется значение высоты контрола для его перерисовки, если не из его Height ?


 
DesWind ©   (2006-02-17 16:50) [5]

При установке Height вызывается этот метод

procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
 if CheckNewSize(AWidth, AHeight) and
   ((ALeft <> FLeft) or (ATop <> FTop) or
   (AWidth <> FWidth) or (AHeight <> FHeight)) then
 begin
   InvalidateControl(Visible, False);
   FLeft := ALeft;
   FTop := ATop;
   FWidth := AWidth;
   FHeight := AHeight;
   UpdateAnchorRules;
   Invalidate;
   Perform(WM_WINDOWPOSCHANGED, 0, 0);
   RequestAlign;
   if not (csLoading in ComponentState) then Resize;
 end;
end;


 
begin...end ©   (2006-02-17 16:54) [6]

> Newbee   (17.02.06 16:27)

> // А вот если изменить значение по этому адресу, то высота
> панели не меняется...
> // А почему ???

Потому что изменение высоты панели не сводится только к записи в поле TControl.FHeight. См. код TControl.SetHeight.


 
Newbee   (2006-02-17 17:03) [7]

С полями разобрался... Сенькс.

И еще - если вместо Invalidate вызвать Realign - все срабатывает. :)


 
Гаврила ©   (2006-02-17 17:49) [8]


> Newbee  


>PDim := @Panel1.Height;
>  // Теперь это указатель на адрес, по которому
> хранится высота панели. Так ?


В общем случае, так делать вообще нельзя
потому что Panel1.Height - это свойство, и оно совершенно необязательно должно соответствовать соответствующему полю объекта
оно вообще может быть рассчетным, полученным с помошью метода Get<...>
вот если бы это было поле объекта - тогда нормально
это во первых
во вторых это концептуально неправильно
для того и существует сокрытие информации, чтобы не допустить ошибок



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

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

Наверх




Память: 0.48 MB
Время: 0.036 c
3-1136795790
VadimSpb
2006-01-09 11:36
2006.03.05
Ошибка преобразования!?


2-1140011652
VanDet
2006-02-15 16:54
2006.03.05
Здравствуйте помогите пожалуйста


15-1139461748
nbv
2006-02-09 08:09
2006.03.05
Loockup поля


15-1139161550
Джо
2006-02-05 20:45
2006.03.05
Ищу: Графоманский сайт


2-1140266752
Azeem
2006-02-18 15:45
2006.03.05
эмуляция щелчка мыши