Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Масштабирование


Страницы:   1 2

RASkov ©   (2006-09-06 01:44:00) 

Народ, здрасте. Чего то туплю я сегодня. Нужно при изменении размера формы менять размер панели или другими словами масштабировать ее. При ширине формы 500 панель должна быть 200 т.е. это такие размеры при старте. Делаю так, но чето весь в сомнениях если расскоментировать строчку и закоментить следующую, то вроде нормально но че то не нравиться мне это. Вот код:

procedure TForm1.FormResize(Sender: TObject);
begin
 //Panel1.Width:=Width div (500 div 200)-50;
 Panel1.Width:=Width div (500 div 200);
end;

Сомнения в этих самых -50.
ЗЫ Математика это сила, а я в ней бессилен:)


RASkov   (2006-09-08 18:31:00) [1]

> [36] Наиль ©   (08.09.06 11:34)

Спасибо но это не то что мне надо.
У меня "рамочки" на картинке и не только для панелей...


RASkov   (2006-09-08 18:26:00) [2]

Спасибо всем, отдельное Наиль

> [34] Наиль ©   (08.09.06 11:21)

Перепиши так:
Pn.SetBounds(Round(StartPnLeft*WRat),       //Left
            Round(StartPnTop*HRat),  //Top
            Round(StartPnWidth*WRat),                //Width
            Round(StartPnHeight*HRat));              //Height

Должно работать для Image.(Left,Top)=(0,0);

Незнай попробую, но помоему уже пробовал и если пробовал то скорее всего не правильно будет работать, а я сделал так:
Изменения, добавления выделил жирным а так код из [28], может кому и пригодиться

const
StartPnW=143;
StartPnH=17;
StartPnLeft=31;
StartPnTop=94;
StartFrmW=600;
StartFrmH=400;
WRat=StartPnW/StartFrmW;
HRat=StartPnH/StartFrmH;
LRat=(StartPnLeft)/StartFrmW;
TRat=(StartPnTop)/StartFrmH;


implementation

{$R *.dfm}

procedure TForm1.FormResize(Sender: TObject);
begin
 Pn.SetBounds(Round( Img.Width*LRat),        //Left
              Round( Img.Height*TRat),       //Top
              Round(Img.Width*WRat),        //Width
              Round(Img.Height*HRat));      //Height
end;

Блин, и как сразу не догадался. Может и не совсем точно расчитывает но для моих целей нормально.


Наиль   (2006-09-08 11:56:00) [3]


> Похожие проблемы улетучатся, если поручить все ресайзы непосредственно
> VCL, используя "многоэтажные" конструкции из панелей с правильно
> выставленным св-вом Align и сплиттеры.

Очень сильно сомниваюсь, что это поможет даже для такой несложной задачи, как масштабирование 3 панелей пропорционально форме.
Т.к.
1. Align не управляет шириной
2. Splitter не изменяет положение при изменении размеров формы, а значит придётся писать код аналогичный уже предложеным.
3. Число вспогательных панелей может достигать большой величины, а это значит, что для изменения положения (добавления, удаления) основных панелей в дизайне потребуется определёный (возможно немалый) труд.
4. Не зависимо от способа решения задачи пересчёт координат будет пропорционален числу панелей. Значит многократно возрастёт нагрузка на систему.
5. В любом случае, такое решение - головоломка.
Если решение существует, то хотелось бы увидеть решение задачи для двух панелей на форме, в виде dfm. Жалетельно, чтобы VCL справлялась сама.


Наиль   (2006-09-08 11:34:00) [4]

Использование Image c прямоугольниками не совсем оптимально.
Посмотри на мои варианты Panel в рамочке. Может Image и не понадобится.

object Panel100: TPanel
 Left = 200
 Top = 208
 Width = 185
 Height = 113
 BevelOuter = bvNone
 BorderWidth = 2
 Color = clBlack
 TabOrder = 3
 object Panel2: TPanel
   Left = 2
   Top = 2
   Width = 181
   Height = 109
   Align = alClient
   TabOrder = 0
   OnClick = Panel2Click
 end
end
object Panel3: TPanel
 Left = 200
 Top = 160
 Width = 185
 Height = 41
 BorderStyle = bsSingle
 Ctl3D = False
 ParentCtl3D = False
 TabOrder = 4
end

Копируешь (Ctrl+C) отсюда и вставляешь (Ctrl+V) на пустую форму


MsGuns   (2006-09-08 11:30:00) [5]

Похожие проблемы улетучатся, если поручить все ресайзы непосредственно VCL, используя "многоэтажные" конструкции из панелей с правильно выставленным св-вом Align и сплиттеры.
Единственно где все же надо делать пересчет при ресайзинге - это ширины гридовых колонок и в некоторых приложениях "подгонка" винконтрольных объектов, у которых нет св-ва Align (TEdit, TComboBox etc)


Наиль   (2006-09-08 11:21:00) [6]


>  [32] RASkov   (07.09.06 01:47)

ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ
ФИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИФ ^
ФИ     Ф=Форма; BorderStyle:=bsNone;         ИФ |
ФИ     И=Image.Align:=alClient               ИФ |
ФИ    31      .Stretch:=True                 ИФ |
ФИ  94ППППППППППП  ^                         ИФ |
ФИ    П         П  17                        ИФ 4
ФИ    ППППППППППП  V  П=черные               ИФ 0
ФИ    <---143--->       прямоугольники       ИФ 0
ФИ    ППППППППППП       на картинке          ИФ |
ФИ    П         П                            ИФ |
ФИ    ППППППППППП                            ИФ |
ФИ                                           ИФ |
ФИ Т.Д........................................Ф |
<--------------600-------------------------->  V

Для того, что бы такое художество смотрелось правильно нужно брать в теги CODE

>  Pn.SetBounds(Round((StartPnLeft+Pn.Width)*WRat),   //Left
>               Round(StartPnTop+(Img.Height*HRat)),  //Top
>               Round(Img.Width*WRat),                //Width
>               Round(Img.Height*HRat));              //Height

Перепиши так:
Pn.SetBounds(Round(StartPnLeft*WRat),   //Left
             Round(StartPnTop*HRat),  //Top
             Round(StartPnWidth*WRat),                //Width
             Round(StartPnHeight*HRat));              //Height


Должно работать для Image.(Left,Top)=(0,0);


SerJaNT   (2006-09-08 06:34:00) [7]


> Да уж... так старался.. рисовал.. все расплылось.


Да уж, а в Paint'е нарисовать не пробовал и выложить ссылку??


RASkov   (2006-09-07 01:47:00) [8]

Кто пользуется DMClient'ом можете скопировать мою художественную работу из [29] и вставить в поле для ответа (там шрифт моноширный) и посмотреть как это должно было выглядеть......
Ну что, никто незнает ответа по теме? И шо усе молчат?
Сидю...ПилакаЮ...билин.


RASkov   (2006-09-07 01:15:00) [9]

Куда все делись?:(( Подозрительная тишина....


RASkov   (2006-09-06 23:01:00) [10]

Да уж... так старался.. рисовал.. все расплылось.
Может новую тему запарить? Или не реально это сделать?
Шо усе молчат:(


RASkov   (2006-09-06 22:58:00) [11]

Режим дизайна формы
ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ
ФИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИФ ^
ФИ     Ф=Форма; BorderStyle:=bsNone;         ИФ |
ФИ     И=Image.Align:=alClient               ИФ |
ФИ    31      .Stretch:=True                 ИФ |
ФИ  94ППППППППППП  ^                         ИФ |
ФИ    П         П  17                        ИФ 4
ФИ    ППППППППППП  V  П=черные               ИФ 0
ФИ    <---143--->       прямоугольники       ИФ 0
ФИ    ППППППППППП       на картинке          ИФ |
ФИ    П         П                            ИФ |
ФИ    ППППППППППП                            ИФ |
ФИ                                           ИФ |
ФИ Т.Д........................................Ф |
<--------------600-------------------------->  V

Нужно в режиме дизайна на форму положить на места черных прямоугольников - Панели и в RunTime менять размеры и положения панелей так, что бы они всегда находились на местах черных прямоугольников. При изминении размера формы и при Stretch у Image - меняются размеры и положения черных прямоугольников... вот нужно как то расчитать эти величины и накрывать их панелями


RASkov   (2006-09-06 21:15:00) [12]

Вот так почти как надо (имею ввиду Left, Width и Height, а Top глючит)
Поправьте где я не так делаю или может я вообще все не так делаю?

const
StartPnW=143;
StartPnH=17;
StartPnLeft=31;
StartPnTop=94;
StartImgW=600;  //У формы ClientWidth
StartImgH=400;  //..ClientHeight
WRat=StartPnW/StartImgW;
HRat=StartPnH/StartImgH;

implementation

{$R *.dfm}
//Pn - Panel1
//Img - Image1
procedure TForm1.FormResize(Sender: TObject);
begin                                                //Установка..
 Pn.SetBounds(Round((StartPnLeft+Pn.Width)*WRat),   //Left
              Round(StartPnTop+(Img.Height*HRat)),  //Top
              Round(Img.Width*WRat),                //Width
              Round(Img.Height*HRat));              //Height
end;

У Img - Align:=alClient; Stretch:=True;
У Pn размеры и позиция в const, Anchors по умолчанию [akLeft, akTop]
Ух... ну и задача. Смотрел в VCL UpdateAnchorRules и иже с ним; нихрена нипонял:(


RASkov   (2006-09-06 18:44:00) [13]

> [25] RASkov   (06.09.06 18:23)

бИлИн, Еще Anchors у панели в False весь, ну это для... "псевдопозиционирования" по высоте.
Как сделать более точно. Изменяться размеры формы будут не часто (скорее всего один раз при старте) и нужно чтобы все эти панельки [22] перекрыли каждая свой прямоугольник...
Что-то после более конкретизации вопроса активность ответов упала, по всей видимости задача перешла из легких в трудно решаемые:) чесно, вот, я никак не соображу...:(


RASkov   (2006-09-06 18:24:00) [14]

2 Блин забыл у Image Stretch установлен в True; :)


RASkov   (2006-09-06 18:23:00) [15]

> [24] MacroDenS ©   (06.09.06 15:11)

Неееееа, так воощщеее не то.
Добились с размерами более мение с [12] Наиль ©

см [19]

Нужно добиться токого эффекта
когда на форме есть Image в нем картинка, У Image Align:=alClient он на всю форму на картинке есть небольшой черный прямоугольник, пусть 150х50(WidthHeight)   10х50(LeftTop), вот надо на него положить панель, т.е. во время дизайна положить панель на форму так что бы она закрыла этот прямоугольник но оставив при этом 1..2 пикселя по краям черных(не обязательно на картинке есть обвод прямоугольника) ну а далее понятно при запуске эта панель должна все время закрывать этот прямоугольник даже при изменении размера формы.
Вот такая вот загагулина. Может это каким нибудь другим способом можно дабиться?

И так же см [22]
Кто нибудь такое делал? Как такое сделать? Спасибо.


MacroDenS   (2006-09-06 15:11:00) [16]


Panel1.width:=Trunc(RoundTo(Panel1.width*koefW));

блин в спешке забыл про параметры

делай так Panel1.width:=Trunc(RoundTo(Panel1.width*koefW , 0)); - то есть округление (реальное до десятых), а транк нужен - потомучто RoundTo не Integer (Double вроде)


RASkov   (2006-09-06 14:49:00) [17]

С добрым утром:)) Ссори за оффтоп.


RASkov   (2006-09-06 14:47:00) [18]

И вот еще какая бяка - сделал так:

procedure TForm1.FormResize(Sender: TObject);
const
StartPW=111;
StartFW=456;
WRat=StartPW/StartFW;
StartPH=20;
StartFH=353;
HRat=StartPH/StartFH;
begin
 Panel1.Width:=Round(Image1.Width*WRat);
 Panel1.Height:=Round(Image1.Height*HRat);
end;


то усе вроде ок с размерами панели, позиционирования пока нет хотя по высоте позиционируется и вот если взять форму за нижний край и потаскать вверх вниз раз так... ну много то у панели Top съезжает на верх:( ну т.е. сначала закрывала прямоугольник а после кучи изменений высоты формы становиться выше прямоугольника а Height Панели ровно такой же как и прямоугольник. тут дело в том что этих прямоугольников, на Image под панелями, 10 штук каждый ниже предыдущего на 10 пикселов и вот нужно умудрится 10 панелями при изменении размера формы закрыть 10 прямоугольников. И еще вот Left панелей пока плавает(не реализовано).... а ширина ок.


RASkov   (2006-09-06 14:25:00) [19]

> [16] MacroDenS ©   (06.09.06 13:47)
 koefW:= Trunc(RoundTo(Form1.width / DefaultWidth, 0));
 koefH:= Trunc(RoundTo(Form1.Height / DefaultHeight, 0));

 Panel1.width:=Trunc(RoundTo(Panel1.width*koefW));
 Panel1.height:=Trunc(RoundTo(Panel1.Height*koefH));

Это в таком виде не компилится
Panel1.width:=Trunc( RoundTo(Panel1.width*koefW)); - здесь говорит что мало параметров, а если сделать так Panel1.width:=Panel1.width*koefW;
то тоже непонятно что получается.

> [12] Наиль ©   (06.09.06 12:47)

Вот ширину вроде бы добили. Спасибо. Осталось высота и позиционирование. Ну высота аналогично ширине... это нормально. Т.е. осталось позиционирование.


RASkov   (2006-09-06 14:11:00) [20]

> [19] RASkov   (06.09.06 14:08)

Блин забыл у Image Stretch установлен в True;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо