Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
2-1140189073
The Sound
2006-02-17 18:11
2006.03.05
Складование побайтно 2х чисел.


2-1140072156
Wolferio
2006-02-16 09:42
2006.03.05
Ошыбка открытия базы


15-1139767550
Fl@sh
2006-02-12 21:05
2006.03.05
Океан Ельзи


2-1140325625
delphi-oracle
2006-02-19 08:07
2006.03.05
Как изменить файл Read-Only?


15-1139664410
Udaff
2006-02-11 16:26
2006.03.05
странное поведение стандартных диалогов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский