Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.015 c
15-1157740546
homm
2006-09-08 22:35
2006.10.01
Photoshop


2-1157741398
lobach
2006-09-08 22:49
2006.10.01
Компонент


2-1157802908
qoop
2006-09-09 15:55
2006.10.01
сортировка


1-1155712822
Dell3r
2006-08-16 11:20
2006.10.01
Доступ к закладкам в .rtf


6-1147016467
Windows
2006-05-07 19:41
2006.10.01
ICQ клиент на Win API





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