Закріплення і прив'язка компонентів на формі

Закріплення і прив'язка компонентів на формі

Не знаю як точніше назвати питання і перейду відразу до справи.
Є форма з 3 Timage. 1 знаходиться в центрі зліва, інший точно по центру форми, 3 - в центрі праворуч.
У них динамічно завантажуються картинки, у всіх стоїть властивість Proportional.
При зміні розмірів форми картинки з'їжджають зі своїх позицій

Потрібно домогтися такого ефекту, щоб при зміні розмірів форми (в тому числі maximize) компоненти TImage зберігали б свої
положення щодо форми в правильних пропорціях, + збільшували / зменшували б картинки під час зміни розмірів.

Я пробував властивість Anchors
у 1 я виставляв в true (left, bootom, up)
у 2 - у 1 я виставляв в true (left, bootom, up, right)
у 3 - виставляв в true (right, bootom, up)

але тільки центральна картинка тоді збільшується а інші ні, властивість Constraints не допомагає

якщо ж у 2 прибрати left і right тоді 1 і 3 збільшуються а 2 залишається маленькою

Загалом питання як правильно реалізувати це

Може, якийсь скріншотік викладеш? А то важкувато зрозуміти. Я, наприклад, погано уявляю, що таке "знаходиться в центрі зліва".

панелі - це ніби Timage
внизу - Headercontrol

1 скріншот форма в нормальному стані
2 форма в розтягнутому стані

ось панелі повинні розтягуватися і залишатися на своїх місцях як це робить headercontrol

я думаю мені потрібно ось це, але в d7 цього немає

Мені здається, зовсім не складно реалізувати цю логіку поведінки "руками", прописавши її в обробнику форми OnResize.

Джо - вже пробував, глючить після декількох рісайзов, особливо після maximize

ось код

i: = Round (StrToFloat (inttostr (GroupBox13.Width)) / (345/105));
j: = Round (StrToFloat (inttostr (GroupBox13.Width)) / 43.125);
Image2.Width: = i;
Image3.Width: = i;
Image4.Width: = i;
Image2.Left: = j;
Image3.Left: = j * 2 + i;
Image4.Left: = j * 3 + 2 * i;>

три image знаходяться в групбоксе довжина которго 345
довжина image 105
43.125 це відношення 345/8
8 - це image2.left
відповідно коли форма збільшується то left збільшується

та, до речі з приводу прив'язок компонентів.

зіткнувся ще з 1 проблемою

форма, pagecontrol, 2 сторінки,
на 1 сторінці label (RightJustify), Anchors (aRight)
тобто лейбл по правому краю вирівнюється, властивість autosize = true

так ось,
Під час запуску програми форма змінює розміри (збільшується),
2 сторінка за замовчуванням, ставимо в лейбл будь-який текст
перемикається на першу сторінку
і бачимо що лейбл НЕ перемістився направо

а якщо autosize false, то все нормально працює
ось такий глюк

причому, якщо послезапуска вибрати 1 сторінку, потім другу, привласнити текст мітці, повернутися на першу то все OK!

> I: = Round (StrToFloat (inttostr (GroupBox13.Width)) / (345
> / 105));
> J: = Round (StrToFloat (inttostr (GroupBox13.Width)) / 43.125)
>;

Ви мене, звичайно, вибачте, але що це за фінти вухами?

Загалом, ось приклад (чорновий) коду, який реалізує (якщо я правильно зрозумів завдання) потрібне. Він, з одного боку - кілька надлишковий, з іншого - неповний, одначе досить універсальний, щоб доопрацювати його в потрібному напрямку.

# XA0; TAnchorType = (atLeft, atRight, atBottom);
# XA0; TAnchorTypes = set of TAnchorType;

# XA0; TPlacementPoilitics = record
# XA0; # XA0; AnchorType: TAnchorTypes;
# XA0; # XA0; LeftCoeff,
# XA0; # XA0; TopCoeff,
# XA0; # XA0; RightCoeff,
# XA0; # XA0; BottomCoeff: Single
# XA0; end;

function CreatePlacementPolitics (AControl: TWinControl;
# XA0; AType: TAnchorTypes): TPlacementPoilitics;

procedure ApplyPlacementPolitics # XA0; (AControl: TWinControl; Politics: TPlacementPoilitics);

function CreatePlacementPolitics (AControl: TWinControl;
# XA0; AType: TAnchorTypes): TPlacementPoilitics;
begin
# XA0; with Result do
# XA0; begin
# XA0; # XA0; AnchorType: = AType;
# XA0; # XA0; if atLeft in AType then
# XA0; # XA0; # XA0; LeftCoeff: = AControl.Left / GetParentForm (AControl) .Width;
# XA0; # XA0; if atRight in AType then
# XA0; # XA0; # XA0; RightCoeff: = AControl.Width / GetParentForm (AControl) .Width;
# XA0; # XA0; if atBottom in AType then
# XA0; # XA0; # XA0; BottomCoeff: = AControl.Height / GetParentForm (AControl) .Height;
# XA0; end;

procedure ApplyPlacementPolitics # XA0; (AControl: TWinControl; Politics: TPlacementPoilitics);
begin
# XA0; with Politics do
# XA0; begin
# XA0; # XA0; if atLeft in Politics.AnchorType then
# XA0; # XA0; begin
# XA0; # XA0; # XA0; AControl.Left # XA0;: = Round (LeftCoeff * GetParentForm (AControl) .Width);
# XA0; # XA0; end;

# XA0; # XA0; if atRight in Politics.AnchorType then
# XA0; # XA0; # XA0; AControl.Width # XA0;: = Round (RightCoeff * GetParentForm (AControl) .Width);

# XA0; # XA0; if atBottom in Politics.AnchorType then
# XA0; # XA0; # XA0; AControl.Height # XA0;: = Round (BottomCoeff * GetParentForm (AControl) .Height);
# XA0; end;
end;

Приклад використання (взятий випадок з 3-ма панелями з [2]):


type
# XA0; TForm27 = class (TForm)
# XA0; # XA0; Panel2: TPanel;
# XA0; # XA0; Panel3: TPanel;
# XA0; # XA0; Panel1: TPanel;
# XA0; # XA0; procedure FormCreate (Sender: TObject);
# XA0; # XA0; procedure FormResize (Sender: TObject);
# XA0; private
# XA0; # XA0; Panel1Politics: TPlacementPoilitics;
# XA0; # XA0; Panel2Politics: TPlacementPoilitics;
# XA0; # XA0; Panel3Politics: TPlacementPoilitics;
# XA0; end;

procedure TForm27.FormCreate (Sender: TObject);
begin
# XA0; Panel1Politics: = CreatePlacementPolitics (Panel1, [atRight, atBottom]);
# XA0; Panel2Politics: = CreatePlacementPolitics (Panel2, [atLeft, atRight, atBottom]);
# XA0; Panel3Politics: = CreatePlacementPolitics (Panel3, [atLeft, atRight, atBottom]);
end;

procedure TForm27.FormResize (Sender: TObject);
begin
# XA0; ApplyPlacementPolitics (Panel1, Panel1Politics);
# XA0; ApplyPlacementPolitics (Panel2, Panel2Politics);
# XA0; ApplyPlacementPolitics (Panel3, Panel3Politics); # XA0;
end;

І, будь ласка, не знущайтеся над усім святим всередині мене, не робіть більше так:
i: = Round (StrToFloat (inttostr (GroupBox13.Width)) / (345/105));
j: = Round (StrToFloat (inttostr (GroupBox13.Width)) / 43.125);


> І, будь ласка, не знущайтеся над усім святим всередині мене,
> # XA0, не будете робити більше так:
> I: = Round (StrToFloat (inttostr (GroupBox13.Width)) / (345
> / 105));
> J: = Round (StrToFloat (inttostr (GroupBox13.Width)) / 43.
> 125);

Це, имхо, залишилося / сформувалося після експериментів методом "сліпого тику".

P.S. А тепер дай рішення для Windows взагалі! (Зміна дозволу екрану, зміна шрифту "великий / звичайний" і т.д. і т.п. -)


> Є форма з 3 Timage. 1 знаходиться в центрі зліва, інший
> Точно по центру форми, 3 - в центрі праворуч.

А що за проблема помістити всі ці імаго на панель і задати лівому Align по AlLeft правому по Alright і центральному по всьому іншому?

А що за проблема помістити всі ці імаго на панель і задати лівому Align по AlLeft правому по Alright і центральному по всьому іншому?

А ви-то так робили? Спробуйте. Буде, зовсім не те, що потрібно:
тільки центральний Image збільшиться.

> [12] allrussia # XA0; (04.12.06 17:12)
> Elen
>
> А що за проблема помістити всі ці імаго на панель і задати
> Лівому Align по AlLeft правому по Alright і центральному
> По всьому іншому?
>
> А ви-то так робили? Спробуйте. Буде, зовсім не те, що
> Потрібно:
> Тільки центральний Image збільшиться.

Ти код в [9] пробував?

обов'язково спробую відпишуся

Eraser - 3 пост не читали?

Джо - не можу зрозуміти як ваш код використовувати

> [17] allrussia # XA0; (04.12.06 21:28)
> Джо - не можу зрозуміти як ваш код використовувати

Тобто?

Джо - куди його в стандартний юніт1 вставляти
намагався промучився хвилин 10 перепробував всі варіанти

> [19] allrussia # XA0; (04.12.06 21:32)
> Джо - куди його в стандартний юніт1 вставляти
> Намагався промучився хвилин 10 перепробував всі варіанти

Уф. Це, вибач, питання набагато навіть нижче рівня гілки "Початківцям", не те що "Основна". Ну да ладно, раз вже взявся.

Створюєш окремий юніт в проекті. Скажімо Unit1.pas. У його секцію interface поміщати uses SysUtils, Controls, Forms; і код
type

TAnchorType = (atLeft, atRight, atBottom);
TAnchorTypes = set of TAnchorType;

TPlacementPoilitics = record
# XA0; AnchorType: TAnchorTypes;
# XA0; LeftCoeff,
# XA0; TopCoeff,
# XA0; RightCoeff,
# XA0; BottomCoeff: Single
end;

function CreatePlacementPolitics (AControl: TWinControl;
AType: TAnchorTypes): TPlacementPoilitics;

procedure ApplyPlacementPolitics # XA0; (AControl: TWinControl; Politics: TPlacementPoilitics);


Таким чином, ти оголосив 2 типу, 1 функцію і 1 процедуру.

Тепер в секцію implementation додаєш реалізацію цієї функції і процедури:

function CreatePlacementPolitics (AControl: TWinControl;
AType: TAnchorTypes): TPlacementPoilitics;
begin
with Result do
begin
# XA0; AnchorType: = AType;
# XA0; if atLeft in AType then
# XA0; # XA0; LeftCoeff: = AControl.Left / GetParentForm (AControl) .Width;
# XA0; if atRight in AType then
# XA0; # XA0; RightCoeff: = AControl.Width / GetParentForm (AControl) .Width;
# XA0; if atBottom in AType then
# XA0; # XA0; BottomCoeff: = AControl.Height / GetParentForm (AControl) .Height;
end;
end;

procedure ApplyPlacementPolitics # XA0; (AControl: TWinControl; Politics: TPlacementPoilitics);
begin
with Politics do
begin
# XA0; if atLeft in Politics.AnchorType then
# XA0; # XA0; AControl.Left # XA0;: = Round (LeftCoeff * GetParentForm (AControl) .Width);

# XA0; if atRight in Politics.AnchorType then
# XA0; # XA0; AControl.Width # XA0;: = Round (RightCoeff * GetParentForm (AControl) .Width);

# XA0; if atBottom in Politics.AnchorType then
# XA0; # XA0; AControl.Height # XA0;: = Round (BottomCoeff * GetParentForm (AControl) .Height);
end;
end;

Функція CreatePlacementPolitics створює запис (record) з інформацією про "прив'язці" переданого їй спадкоємця TWinControl.
Процедура ApplyPlacementPolitics застосовує збережену раніше політику прив'язки для зазначеного TWinControl "а.

Потім в головній формі в секцію uses секції interface додаєш Unit1.
Помещаещь на форму три панелі і розміщуєш їх, як ти намалював в пості [2].
Створюєш в класі форми три приватних змінних, тобто:
type
TForm27 = class (TForm)
# XA0 ;.
private
# XA0; Panel1Politics,
# XA0; Panel2Politics,
# XA0; Panel3Politics: TPlacementPoilitics;
end;

Далі, в подію OnCreate форми визначаєш політику розміщення свох панелей і зберігаєш її у відповідних приватних полях для подальшого використання:
procedure TForm27.FormCreate (Sender: TObject);
begin
Panel1Politics: = CreatePlacementPolitics (Panel1, [atRight, atBottom]);
Panel2Politics: = CreatePlacementPolitics (Panel2, [atLeft, atRight, atBottom]);
Panel3Politics: = CreatePlacementPolitics (Panel3, [atLeft, atRight, atBottom]);
end;
І, нарешті, в обробнику форми OnResize застосовуєш до панелей заздалегідь збережену політику розміщення (для кожної панелі - свою):
procedure TForm27.FormResize (Sender: TObject);
begin
ApplyPlacementPolitics (Panel1, Panel1Politics);
ApplyPlacementPolitics (Panel2, Panel2Politics);
ApplyPlacementPolitics (Panel3, Panel3Politics); # XA0;
end;

Соррі, вирівнювання сповзло.

перевірив ваш код
працює тільки на 50% - при збільшенні фопми все ок
при зменшенні:
1) третя панель неправильно зменшується
2) якщо на панелі знаходиться Timage то він перевертається на 180 градусів по горизонтальній осі і починає дзеркально відображатися

я пробував як радив Наіль, трохи краще але глюки не зникають
звичайно може я чогось не зрозумів?
які align ви виставляли у панелей?

мій код над працював краще.

У мене невелике зауваження по коду Джо. Politics краще замінити на Policy, а то око ріже :)

> [22] allrussia # XA0; (14.12.06 20:53)
> Які align ви виставляли у панелей?

Ніяких.
При зменшенні, зрозуміло, помилки округлення будуть помітні. Я просто підхід показав, конкретну реалізацію потрібно ще доводити до розуму напилком :)

Спробуйте для кожної картинки використовувати TPanel, панелі, в свою чергу розмістити на "платформі". Панелям можна задати вирівнювання,

Коротше, придумав я такий код. Працює на 100%. Похибка - 1 розподіл розміру контрола. Завдання вирішена. Топік - в утиль: p

# XA0;
begin
# XA0; i: = (GroupBox13.Width - 4) div 3;
# XA0; j: = (GroupBox13.Width - 4) mod 3;
# XA0; case j of
# XA0; 0: begin
# XA0; # XA0; # XA0; Panel1.Width: = i;
# XA0; # XA0; # XA0; Panel2.Width: = i;
# XA0; # XA0; # XA0; Panel3.Width: = i;
# XA0; # XA0; end;
# XA0; 1: begin
# XA0; # XA0; # XA0; Panel1.Width: = i;
# XA0; # XA0; # XA0; Panel2.Width: = i + 1;
# XA0; # XA0; # XA0; Panel3.Width: = i;
# XA0; # XA0; end;
# XA0; 2: begin
# XA0; # XA0; # XA0; Panel1.Width: = i + 1;
# XA0; # XA0; # XA0; Panel2.Width: = i;
# XA0; # XA0; # XA0; Panel3.Width: = i + 1;
# XA0; # XA0; end;
end;

Пам'ять: 0.81 MB
Час: 0.094 c