Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите, почему не работает ? [D7, 2000]


Newbee ©   (2006-02-17 16:27:00) 

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

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

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

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

end;


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


> Newbee  


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


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


Newbee   (2006-02-17 17:03:00) [2]

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

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


begin...end   (2006-02-17 16:54:00) [3]

> Newbee   (17.02.06 16:27)

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

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


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

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

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

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

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


DesWind   (2006-02-17 16:50:00) [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;


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

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

Вставить Invalidate

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


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

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


Desdechado   (2006-02-17 16:29:00) [8]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо