![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите, почему не работает ? [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]потому что надо обращаться к свойствам объекта, чтоб он отработал реакцию на твои действия