Главная страница
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.04 c
2-1140073355
nap<>
2006-02-16 10:02
2006.03.05
Как получить поле


2-1139741086
ZeFiR
2006-02-12 13:44
2006.03.05
MDI приложение


10-1114448291
Vasily Alibabaevich
2005-04-25 20:58
2006.03.05
Доступ запрещен DCOM


6-1132797718
Bomm
2005-11-24 05:01
2006.03.05
Как узнать текущию рабочию группу?


4-1134571727
Хинт
2005-12-14 17:48
2006.03.05
Offset библиотеки в чужом процессе