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

Вниз

Закрепление и привязка компонентов на форме   Найти похожие ветки 

 
allrussia   (2006-12-02 04:03) [0]

Не знаю как поточнее назвать вопрос и перейду сразу к делу.
Есть форма с 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 остается маленькой

В общем вопрос как правильно реализовать это


 
Джо ©   (2006-12-02 04:11) [1]

Может, какой-то скриншотик выложишь? А то сложновато понять. Я, например, плохо представляю, что такое "находится в центре слева".


 
allrussia   (2006-12-02 05:29) [2]

панели - это как будто Timage
внизу - Headercontrol

1 - http://slil.ru/23502966
2 - http://slil.ru/23502969

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

вот панели должны растягиваться и оставаться на своих местах как это делает headercontrol


 
allrussia   (2006-12-02 05:34) [3]

я думаю мне нужно вот это, но в d7 этого нет

http://bdn1.borland.com/article/0,1410,33421,00.html


 
Джо ©   (2006-12-02 14:08) [4]

Мне кажется, совсем не сложно реализовать эту логику поведения "руками", прописав ее в обработчике формы OnResize.


 
allrussia   (2006-12-02 14:22) [5]

Джо - уже пробовал, глючит после нескольких рисайзов, в особенности после 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 увеличивается


 
allrussia   (2006-12-02 14:37) [6]

да кстати по поводу привязок компонентов...

столкнулся еще с 1 проблемой

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

так вот,
при запуске приложения форма изменяет размеры (увеличивается),
2 страница по умолчанию, ставим в лейбл любой текст
переключаемся на первую страницу
и видим что лейбл не переместился направо

а если autosize false, то все нормально работает
вот такой глюк

причем, если послезапуска выбрать 1 страницу, затем вторую, присвоить текст метке, вернуться на первую то все OK!


 
allrussia   (2006-12-02 15:00) [7]

если непонятно вот скрин
http://slil.ru/23503778


 
Джо ©   (2006-12-03 22:42) [8]

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

Вы меня, конечно, извините, но что это за финты ушами?


 
Джо ©   (2006-12-04 01:14) [9]

В общем, вот пример (черновой) кода, который реализует (если я правильно понял задачу) требуемое. Он, с одной стороны — несколько избыточен, с другой — неполон, однакоже достаточно универсален, чтобы доработать его в нужном направлении.

type

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

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

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

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

implementation

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

end;

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

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

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


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


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

implementation

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

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



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


;)


 
Германн ©   (2006-12-04 01:42) [10]


> Джо ©   (04.12.06 01:14) [9]

Серёга опять "на утро глядя" пишет ответ на "Пойди туда, не знаю куда, принеси то, не знаю что" :-) И ведь получается, "блин" :)(


> И, пожалуйста, не издевайтесь над всем святым внутри меня,
>  не делайте больше так:
> i:= Round (StrToFloat (inttostr(GroupBox13.Width)) / (345
> / 105));
> j:= Round (StrToFloat (inttostr(GroupBox13.Width)) / 43.
> 125);

Это, имхо, осталось/сформировалось после экспериментов методом "слепого тыка".

P.S. А теперь дай решение для Windows вообще! (Смена разрешения экрана, смена шрифта "крупный/обычный" и т.д. и т.п. :-)


 
Elen ©   (2006-12-04 07:51) [11]


> Есть форма с 3 Timage. 1 находится в центре слева, другой
> точно по центру формы, 3 - в центре справа.

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


 
allrussia   (2006-12-04 17:12) [12]

Elen

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

А вы-то так делали? Попробуйте. Будет, совсем не то, что требуется:
только центральный Image увеличится.


 
Джо ©   (2006-12-04 17:16) [13]

> [12] allrussia   (04.12.06 17:12)
> Elen
>
> А что за проблема поместить все эти имаги на панель и задать
> левому Align по AlLeft правому по Alright и центральному
> по всему остальному?
>
> А вы-то так делали? Попробуйте. Будет, совсем не то, что
> требуется:
> только центральный Image увеличится.

Ты код в [9] пробовал?


 
allrussia   (2006-12-04 17:21) [14]

Джо

обязательно попробую отпишусь


 
Наиль ©   (2006-12-04 17:25) [15]

> [9] Джо ©   (04.12.06 01:14)
> procedure TForm27.FormResize(Sender: TObject);
> begin
> ApplyPlacementPolitics(Panel1,Panel1Politics);
> ApplyPlacementPolitics(Panel2,Panel2Politics);
> ApplyPlacementPolitics(Panel3,Panel3Politics);  
> end;

Управление третьей панелью (или Image) лучше доверить Align:=alClient.
Иначе рискуем получить/потерять пару лишних пикселов на округлении.
Правда, тогда придётся задать Align:=alLeft для первых двух панелей и отказаться от вычислений Left.


 
Eraser ©   (2006-12-04 20:41) [16]

> [0] allrussia   (02.12.06 04:03)

задачу понял только примерно, но в BDS2006 появился такой полезный компонент TGridPanel, думаю это то что надо.


 
allrussia   (2006-12-04 21:28) [17]

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

Джо - не могу понять как ваш код использовать


 
Джо ©   (2006-12-04 21:29) [18]

> [17] allrussia   (04.12.06 21:28)
> Джо - не могу понять как ваш код использовать

То есть?


 
allrussia   (2006-12-04 21:32) [19]

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


 
Джо ©   (2006-12-04 21:49) [20]

> [19] allrussia   (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
  AnchorType: TAnchorTypes;
  LeftCoeff,
  TopCoeff,
  RightCoeff,
  BottomCoeff: Single
end;

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

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


Таким образом, ты объявил 2 типа, 1 функцию и 1 процедуру.

Теперь в секцию implementation добавляешь реализацию этой функции и процедуры:

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

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

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

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


Функция CreatePlacementPolitics создает запись (record) с информацией о "привязке" переданного ей наследника TWinControl.
Процедура ApplyPlacementPolitics применяет сохраненную ранее политику привязки для указанного TWinControl"а.

Затем в главной форме в секцию uses секции interface добавляешь Unit1.
Помещаещь на форму три панели и размещаешь их, как ты нарисовал в посте [2].
Создаешь в классе формы три приватных переменных, т.е:
type
TForm27 = class(TForm)
  ...
private
  Panel1Politics,
  Panel2Politics,
  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);  
end;


 
Джо ©   (2006-12-04 21:50) [21]

Сорри, выравнивание сползло.


 
allrussia   (2006-12-14 20:53) [22]

Джо -

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

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

мой код над работал лучше...


 
Zeqfreed ©   (2006-12-15 05:13) [23]

У меня небольшое замечание по коду Джо. Politics лучше заменить на Policy, а то глаз режет :)


 
Джо ©   (2006-12-15 20:25) [24]

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

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


> [23] Zeqfreed ©   (15.12.06 05:13)
> У меня небольшое замечание по коду Джо. Politics лучше заменить
> на Policy, а то глаз режет :)

А, точно. У меня было чувство, что как-то не так звучит :)


 
MsGuns ©   (2006-12-16 02:21) [25]

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


 
allrussia ©   (2006-12-16 09:34) [26]

MsGuns р-р-рр :)

Джо

Короче, придумал я такой код. Работает на 100%. Погрешность - 1 деление размера контрола. Задача решена. Топик - в утиль :p

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.044 c
15-1169485507
Virgo_Style
2007-01-22 20:05
2007.02.11
День авиации ПВО


15-1169252464
lookin
2007-01-20 03:21
2007.02.11
Группа StereoTotal - кто слушал?


15-1169204495
NeyroSpace
2007-01-19 14:01
2007.02.11
И все-таки нужна ли кому-нибудь правда в нашей стране?


6-1157965971
dwar
2006-09-11 13:12
2007.02.11
INDY 9 проблемма стоп сервера


2-1169532094
M1sT
2007-01-23 09:01
2007.02.11
Сервер InterBase...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский