Текущий архив: 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.46 MB
Время: 0.011 c