Шаг 41 - Область прокрутки TScrollBox. Свойства Parent и Owner.

Отображает на форме область прокрутки. Типичный контейнерный компонент. Его клиентская область динамически расширяется при добавлении объектов в нее.

Давно хотел расскзать о праве владения и родительском праве. Это не одно и то же. Первое определяется свойством Owner, а второе - свойством Parent. Первое свойство унаследовано от базового класса TComponent, а второе - от TControl.

Право владения управляет распределнием памяти. Когда какой-то компонент уничтожается (free), его деструктор автоматически уничтожает все объекты, которыми владеет. Как пример - форма владеет всеми размещенными на ней компонентами. При закрытии формы деструктор память из-под этих объектов высвобождает. В общем очень удобно - программисту не нужно программировать операторы уничтожения этих объектов. Хотя в принципе любой объект at run-time удалить можно, легко и с удовольствием :).

Владельцем может являться любой компонент (произведенный от класса TComponent). В отличие от владельца родителем может только оконный (windowed) объект, то есть произведенный от класса TWinControl.

Когда говорят - какой-то оконный компонент является родителем другого, то это значит, что второй содержится в первом. Частный пример - для компонента, помещенного на форму, родителем является форма. Для того же компонента, помещенного в область прокрутки, родителем является область прокрутки.

Необходимо отметить также и тот любопытный факт, что абсолютные координаты компонентов (экранные координаты), рассчитывается, исходя из координат родителей. Я поясню. Допустим, вы поместили компонент на форму в левые верхний угол. Его координаты 0,0 независимо от позиции формы на экране. То же самое будет, если вы поместите объект в область прокрутки, панель и т.п аналогичным образом. Теперь уже координаты не зависят ни от положения панели (области прокрутки, etc.), ни от позиции формы. То есть они относительны. Эта простая вещь, но она достаточно полезна.

Теперь про TScrollBox. В справке написано, что он используется для того, чтобы защитить от прокрутки меню формы, статусные панели и прочее. Еще написано, что можно создавать разные виды. Что ж, соглашусь. Второе Вы как-нибудь сами придумавыйте ;), а первое можно показать.

Сделайте приложение, типа такого:

gif/41_1.gif (2788 b)

Ну подробно объяснять каждый компонент не буду, уже много раз их видели ;). Я использовал компоненты TMainMenu, TImage, TScrollBox gif/41_2.gif (186 b), TStatusBar gif/41_3.gif (122 b), TOpenPictureDialog gif/41_4.gif (216 b). Последние два мы еще не использовали. Коротко скажу, что первый - статусная панель, а второй - то же самое, что и простой TOpenDialog, только для открытия картинок. А вот код:

void __fastcall TForm1::ExitClick(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DisplayHint(TObject* Sender)
{
	StatusBar1->SimpleText=Application->Hint;
	//это для того, чтобы подсказки на статусной панели отображались
}
void __fastcall TForm1::OpenClick(TObject *Sender)
{
	if(Dialog1->Execute())
	{
		Image1->Picture->LoadFromFile(Dialog1->FileName);
		ScrollBox1Resize(NULL);
	};
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	Application->OnHint=DisplayHint;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ScrollBox1Resize(TObject *Sender)
{
	if(Image1->Width < ScrollBox1->ClientRect.Width())
		Image1->Left=(ScrollBox1->ClientRect.Width()-Image1->Width)/2;
	else Image1->Left=0;
	if(Image1->Height < ScrollBox1->ClientRect.Height())
		Image1->Top=(ScrollBox1->ClientRect.Height()-Image1->Height)/2;
	else Image1->Top=0;
}

Вкратце - загружается картинка. Если она помещается в область прокрутки, то центрируется. Иначе занимает всю возможную область. Смотрите, разбирайтесь, я проект в архиве оставил.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 10.12.2001