Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизМасштабирование Найти похожие ветки
← →
RASkov (2006-09-06 01:44) [0]Народ, здрасте. Чего то туплю я сегодня. Нужно при изменении размера формы менять размер панели или другими словами масштабировать ее. При ширине формы 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.
ЗЫ Математика это сила, а я в ней бессилен:)
← →
Palladin © (2006-09-06 01:48) [1]телепатор inside не в силах понять что же тебе конкретно не нравиться в коде...
← →
RASkov (2006-09-06 01:58) [2]> [1] Palladin © (06.09.06 01:48)
Почему приходиться отнимать 50?
Откуда это число? просто я для проверки так сделал 500 и 200, а если размеры будут типа 637 у формы и 153 у панели то как правильно сделать? Сколько отнимать надо?
Если оставить эту строчку (Panel1.Width:=Width div (500 div 200);) из примера выше то при создании формы ее ширина 500 а у панели 250 становиться вот я и отнял эти 50..а размеры перед стартом были 500 и 200, и должны были остаться такими, и только потом при изменении размера формы панель должна масштабироваться... вот... если не понятно опять то остаеться надеяться на Ваш телепатор:))
← →
RASkov (2006-09-06 02:15) [3]Наверное опять непонятно написал:(
← →
RASkov (2006-09-06 02:46) [4]Чето ну никак не соображу почему так... Ставлю ширину у формы 450 у панели 150 стартую прогу все нормально - стартует с размерами 450 ширина у формы и 150 у панели, а если делаю у формы 400 а у панели 150 то после старта панель становиться на 50 больше. Как сделать чебы всегда было правильно? т.е. как узнать что надо отнять 50 (я так понял что отнимать нужно только 50) при некоторых обстоятельствах?
← →
RASkov (2006-09-06 03:07) [5]Сделал так...
procedure TForm1.FormResize(Sender: TObject);
var PW, FW: Integer;
begin
FW:=580;
PW:=200;
if(FW mod PW)<>0 then Panel1.Width:=Width div (FW div PW)-50
else Panel1.Width:=Width div (FW div PW);
Caption:=Format("Panel=%d, Width=%d, PW=%d, FW=%d",[Panel1.Width, Width, PW, FW]);
end;
... и тоже не правильно, народ ну кто знает как правильно масштабировать панель на форме при изминении размеров формы?
← →
RASkov (2006-09-06 03:09) [6]Это... FW и PW это ширина формы и панели во время дизайна соответственно
← →
RASkov (2006-09-06 03:12) [7]Блин, походу все спят... ну тады спокой ной ночи:)
Вопрос в силе. Зарание спасибо.
← →
Rial © (2006-09-06 03:29) [8]Panel1.Width:=Width * 200 div 500;
Просто div - целочисленное деление, поэтому
Width div (500 div 200) = Width div 2
← →
unknown © (2006-09-06 03:47) [9]
> RASkov
Масштабирование? Извратное занятие, должен сказать.
У меня нормально реализовать масштабирование формы
и контролов на ней (динамически) не получилось.
Есть у Дмитрия компонент - http://ehlib.com/autopnl.zip
но тоже не очень красиво получается частенько.
p.s.
Если серьезно заняться этой проблемой, то можно и сделать, однако
пользователи эту фишку наврядли оценят по достоинству.
← →
Loginov Dmitry © (2006-09-06 08:21) [10]> Panel1.Width:=Width div (500 div 200);
Имхо, Panel1.Width:=Width div 2 короче выглядет
← →
Barloggg (2006-09-06 12:24) [11]а вот не надо пользоваться x div y.
надо пользоваться trunc( x / y);
и вообще есть такие вещи как onResize у формы.
там сразу все и пересчитывать. для каждой конкретной панели...
← →
Наиль © (2006-09-06 12:47) [12]
Const
StartPanelWidth=200;
StartFormWidth=500;
Ratio=StartPanelWidth/StartFormWidth;
procedure TForm1.FormResize(Sender: TObject);
Var
begin
Panel1.Width:=Round(Width*Ratio);
end;
← →
Loginov Dmitry © (2006-09-06 13:35) [13]> а вот не надо пользоваться x div y.
> надо пользоваться trunc( x / y);
Найди 2 отличия ;)
← →
Virgo_Style © (2006-09-06 13:45) [14]Loginov Dmitry © (06.09.06 13:35) [13]
Найди 2 отличия ;)var x,y : single; //
впрочем, в данном случае это оффтоп %-)
← →
Desdechado © (2006-09-06 13:46) [15]Anchors тебе в помощь
← →
MacroDenS © (2006-09-06 13:47) [16]to Наиль © (06.09.06 12:47) [12]
Только наверное нужно плясать не от размеров панелей, а от размеров формы - меняется формя - меняются размеры всего необходимого.
Можно сделать так:
uses Math;
Const
DefaultWidth = 500;
DefaultHeight = 200;
...OnResizeForm...
var
koefW, koefH: Integer;
begin
...
koefW:= Trunc(RoundTo(Form.windth / DefaultWidth, 0));
koefH:= Trunc(RoundTo(Form.Height / DefaultHeight, 0));
Panel1.width:=Trunc(RoundTo(Panel1.width*koefW));
Panel1.height:=Trunc(RoundTo(Panel1.Height*koefH));
...
end;
← →
MacroDenS © (2006-09-06 13:49) [17]koefW:= Trunc(RoundTo(Form.windth / DefaultWidth, 0)); <=> koefW:= Trunc(RoundTo(Form.width / DefaultWidth, 0));
← →
RASkov (2006-09-06 13:53) [18]> [11] Barloggg (06.09.06 12:24)
> а вот не надо пользоваться x div y.
> надо пользоваться trunc( x / y);
Да это похоже одно и тоже...
Спасибо всем, счас будем пробовать..... ночью башка не варит:)
← →
RASkov (2006-09-06 14:08) [19]> [15] Desdechado © (06.09.06 13:46)
Это не совсем то что надо. Если все выставляешь в True то ерунда получаеться, а вот если в False то получается вроде бы нормальное позиционирование, а размер остаеться тот же.
Нужно добиться токого эффекта
когда на форме есть Image в нем картинка, У Image Align:=alClient он на всю форму на картинке есть небольшой черный прямоугольник, пусть 50х150, вот надо на него положить панель, т.е. во время дизайна положить панель на форму так что бы она закрыла этот прямоугольник но оставив при этом 1..2 пикселя по краям черных ну а далее понятно при запуске эта панель должна все время закрывать этот прямоугольник даже при изменении размера формы.
Вот такая вот загагулина. Может это каким нибудь другим способом можно дабиться?
P/S
> [11] Barloggg (06.09.06 12:24)
и вообще есть такие вещи как onResize у формы.
А я как делаю? см [0],[5]
← →
RASkov (2006-09-06 14:11) [20]> [19] RASkov (06.09.06 14:08)
Блин забыл у Image Stretch установлен в True;
← →
RASkov (2006-09-06 14:25) [21]> [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:47) [22]И вот еще какая бяка - сделал так:
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:49) [23]С добрым утром:)) Ссори за оффтоп.
← →
MacroDenS © (2006-09-06 15:11) [24]
Panel1.width:=Trunc(RoundTo(Panel1.width*koefW));
блин в спешке забыл про параметры
делай так Panel1.width:=Trunc(RoundTo(Panel1.width*koefW, 0)); - то есть округление (реальное до десятых), а транк нужен - потомучто RoundTo не Integer (Double вроде)
← →
RASkov (2006-09-06 18:23) [25]> [24] MacroDenS © (06.09.06 15:11)
Неееееа, так воощщеее не то.
Добились с размерами более мение с [12] Наиль ©
см [19]
Нужно добиться токого эффекта
когда на форме есть Image в нем картинка, У Image Align:=alClient он на всю форму на картинке есть небольшой черный прямоугольник, пусть 150х50(WidthHeight) 10х50(LeftTop), вот надо на него положить панель, т.е. во время дизайна положить панель на форму так что бы она закрыла этот прямоугольник но оставив при этом 1..2 пикселя по краям черных(не обязательно на картинке есть обвод прямоугольника) ну а далее понятно при запуске эта панель должна все время закрывать этот прямоугольник даже при изменении размера формы.
Вот такая вот загагулина. Может это каким нибудь другим способом можно дабиться?
И так же см [22]
Кто нибудь такое делал? Как такое сделать? Спасибо.
← →
RASkov (2006-09-06 18:24) [26]2 Блин забыл у Image Stretch установлен в True; :)
← →
RASkov (2006-09-06 18:44) [27]> [25] RASkov (06.09.06 18:23)
бИлИн, Еще Anchors у панели в False весь, ну это для... "псевдопозиционирования" по высоте.
Как сделать более точно. Изменяться размеры формы будут не часто (скорее всего один раз при старте) и нужно чтобы все эти панельки [22] перекрыли каждая свой прямоугольник...
Что-то после более конкретизации вопроса активность ответов упала, по всей видимости задача перешла из легких в трудно решаемые:) чесно, вот, я никак не соображу...:(
← →
RASkov (2006-09-06 21:15) [28]Вот так почти как надо (имею ввиду 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 22:58) [29]Режим дизайна формы
ФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФ
ФИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИФ ^
ФИ Ф=Форма; BorderStyle:=bsNone; ИФ |
ФИ И=Image.Align:=alClient ИФ |
ФИ 31 .Stretch:=True ИФ |
ФИ 94ППППППППППП ^ ИФ |
ФИ П П 17 ИФ 4
ФИ ППППППППППП V П=черные ИФ 0
ФИ <---143---> прямоугольники ИФ 0
ФИ ППППППППППП на картинке ИФ |
ФИ П П ИФ |
ФИ ППППППППППП ИФ |
ФИ ИФ |
ФИ Т.Д........................................Ф |
<--------------600--------------------------> V
Нужно в режиме дизайна на форму положить на места черных прямоугольников - Панели и в RunTime менять размеры и положения панелей так, что бы они всегда находились на местах черных прямоугольников. При изминении размера формы и при Stretch у Image - меняются размеры и положения черных прямоугольников... вот нужно как то расчитать эти величины и накрывать их панелями
← →
RASkov (2006-09-06 23:01) [30]Да уж... так старался.. рисовал.. все расплылось.
Может новую тему запарить? Или не реально это сделать?
Шо усе молчат:(
← →
RASkov (2006-09-07 01:15) [31]Куда все делись?:(( Подозрительная тишина....
← →
RASkov (2006-09-07 01:47) [32]Кто пользуется DMClient"ом можете скопировать мою художественную работу из [29] и вставить в поле для ответа (там шрифт моноширный) и посмотреть как это должно было выглядеть......
Ну что, никто незнает ответа по теме? И шо усе молчат?
Сидю...ПилакаЮ...билин.
← →
SerJaNT © (2006-09-08 06:34) [33]
> Да уж... так старался.. рисовал.. все расплылось.
Да уж, а в Paint"е нарисовать не пробовал и выложить ссылку??
← →
Наиль © (2006-09-08 11:21) [34]
> [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);
← →
MsGuns © (2006-09-08 11:30) [35]Похожие проблемы улетучатся, если поручить все ресайзы непосредственно VCL, используя "многоэтажные" конструкции из панелей с правильно выставленным св-вом Align и сплиттеры.
Единственно где все же надо делать пересчет при ресайзинге - это ширины гридовых колонок и в некоторых приложениях "подгонка" винконтрольных объектов, у которых нет св-ва Align (TEdit, TComboBox etc)
← →
Наиль © (2006-09-08 11:34) [36]Использование 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) на пустую форму
← →
Наиль © (2006-09-08 11:56) [37]
> Похожие проблемы улетучатся, если поручить все ресайзы непосредственно
> VCL, используя "многоэтажные" конструкции из панелей с правильно
> выставленным св-вом Align и сплиттеры.
Очень сильно сомниваюсь, что это поможет даже для такой несложной задачи, как масштабирование 3 панелей пропорционально форме.
Т.к.
1. Align не управляет шириной
2. Splitter не изменяет положение при изменении размеров формы, а значит придётся писать код аналогичный уже предложеным.
3. Число вспогательных панелей может достигать большой величины, а это значит, что для изменения положения (добавления, удаления) основных панелей в дизайне потребуется определёный (возможно немалый) труд.
4. Не зависимо от способа решения задачи пересчёт координат будет пропорционален числу панелей. Значит многократно возрастёт нагрузка на систему.
5. В любом случае, такое решение - головоломка.
Если решение существует, то хотелось бы увидеть решение задачи для двух панелей на форме, в виде dfm. Жалетельно, чтобы VCL справлялась сама.
← →
RASkov (2006-09-08 18:26) [38]Спасибо всем, отдельное Наиль
> [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;
Блин, и как сразу не догадался. Может и не совсем точно расчитывает но для моих целей нормально.
← →
RASkov (2006-09-08 18:31) [39]> [36] Наиль © (08.09.06 11:34)
Спасибо но это не то что мне надо.
У меня "рамочки" на картинке и не только для панелей...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.014 c