Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Изменение размеров формы на определенную величину   Найти похожие ветки 

 
kutuzov47 ©   (2006-12-12 16:23) [0]

Т.е. размер формы может меняться только, допустим, на 30 по высоте и на 20 по ширине. Как это реализовать? Заранее спасибо


 
Elen ©   (2006-12-12 16:40) [1]

Form1.constraints.Maxwidth:=20;Form1.constraints.Maxheight:=30; Кажись


 
kernel ©   (2006-12-12 16:43) [2]

У формы в свойствах в Constraints есть MaxHeight, MinHeight, MaxWidht, MinWidht.


 
kutuzov47 ©   (2006-12-12 16:54) [3]

Имеется в виду, что размер может быть любой. При изменении размера формы ее высота, например, должна меняться на строго определенную величину. Т.е. dHeight равно 30, например, а сама высота может быть любой. При этом ширина и высота должны меняться одновременно: изменили высоту на dHeight, ширина должна поменяться на dWidth.


 
novill ©   (2006-12-12 17:00) [4]

а банальное onresize не катит?

if Form1.Width mod 30 <> 0 then Form1.Width := (Form1.Width div 30)*30;


 
kutuzov47 ©   (2006-12-12 17:06) [5]

Ну я так и делал, но меня очень смущает то, что край формы все время мигает при этом


 
novill ©   (2006-12-12 17:11) [6]

> [5] kutuzov47 ©   (12.12.06 17:06)

какой стеснительный :)

Если не нравится, то можно через орбработку сообщений окну, смотри в сторону WM_MOVING, WM_MOVE


 
kutuzov47 ©   (2006-12-12 17:14) [7]

procedure TfrmMain.FormCanResize(Sender: TObject; var NewWidth,
 NewHeight: Integer; var Resize: Boolean);
begin
 if NewWidth mod 30 <> 0 then NewWidth := (NewWidth div 30)*30;
end;

Сделал так, мигать перестало и все вроде бы шоколадно, но как теперь сделать так чтобы и высота и ширина менялись одновременно, за какой бы край формы я не тянул


 
novill ©   (2006-12-12 17:18) [8]

> [7] kutuzov47 ©   (12.12.06 17:14)

математикой воспользоваться ;)


 
kutuzov47 ©   (2006-12-12 17:37) [9]

Блин, ничего придумать путевого не могу. Помогите плз


 
novill ©   (2006-12-12 17:44) [10]

ты словами поведение формы опиши.


 
kutuzov47 ©   (2006-12-12 17:52) [11]

В общем, я написал так
if Width mod 30 <> 0 then begin
   Width:=(Width div 30)*30;
   Height:=(Width div 30)*20;
 end;
if Height mod 20<>0 then begin
   Height:=(Height div 20)*20;
   Width:=(Height div 20)*30;
end;

Но форма ведет себя как-то неадекватно при ресайзе. Дергается вся


 
kutuzov47 ©   (2006-12-12 17:53) [12]

Сорри, выложил не тот код


 
kutuzov47 ©   (2006-12-12 17:54) [13]

procedure TfrmMain.FormCanResize(Sender: TObject; var NewWidth,
 NewHeight: Integer; var Resize: Boolean);
begin
 if NewWidth mod 30 <> 0 then begin
   NewWidth:=(NewWidth div 30)*30;
   NewHeight:=(NewWidth div 30)*20;
 end;
 if NewHeight mod 20<>0 then begin
   NewHeight:=(NewHeight div 20)*20;
   NewWidth:=(NewHeight div 20)*30;
 end;
end;


 
novill ©   (2006-12-12 18:04) [14]

я вот не пойму этих строчек

NewHeight:=(NewWidth div 30)*20;

NewWidth:=(NewHeight div 20)*30;


 
kutuzov47 ©   (2006-12-12 18:07) [15]

ну это изменение высоты пропорционально нирине


 
kutuzov47 ©   (2006-12-12 18:12) [16]

Ладно, сформулирую задачу по-другому.
У меня есть форма размерами 777 на 594. Мне нужно, чтобы размер этой формы мог быть только таким:777+37;594+27....777+n*37;594+n*27.


 
kutuzov47 ©   (2006-12-12 18:20) [17]

Ладно, сформулирую задачу по-другому.
У меня есть форма размерами 777 на 594. Мне нужно, чтобы размер этой формы мог быть только таким:777+37;594+27....777+n*37;594+n*27.


 
$Pl@Sh ©   (2006-12-12 20:07) [18]


> kutuzov47 ©   (12.12.06 18:20) [17]
>
> Ладно, сформулирую задачу по-другому.
> У меня есть форма размерами 777 на 594. Мне нужно, чтобы
> размер этой формы мог быть только таким:777+37;594+27...
> .777+n*37;594+n*27.


Та формулировка была лучше...


 
Наиль ©   (2006-12-12 21:33) [19]

> Но форма ведет себя как-то неадекватно при ресайзе. Дергается
> вся

к [13] добавь проверку того, какая величина изменилась ширна или высота (сравнение с текущими величинами).
Если изменились оба, то считать изменением наибольшее из них.
Если изменилась ширина, то выполняешь первое из двух указанных в [13] условий, если нет, то второе.


 
novill ©   (2006-12-13 09:52) [20]

> 777+n*37;594+n*27.

тогда, считаешь (height-777) div 37 и (width-594) div 27
из этих двух значение выбираешь одно (например максимальное) и уже в соответствии с ним устанавливаешь размеры


 
DVM ©   (2006-12-13 10:22) [21]


> novill ©   (12.12.06 17:11) [6]
> > [5] kutuzov47 ©   (12.12.06 17:06)
>
> какой стеснительный :)
>
> Если не нравится, то можно через орбработку сообщений окну,
>  смотри в сторону WM_MOVING, WM_MOVE

Почему WM_MOV***? WM_SIZING ему надо.


 
novill ©   (2006-12-13 10:43) [22]

> [21] DVM ©   (13.12.06 10:22)

верно. он правда в ту степь все равно не полезет.

Ты случайно не помнишь как перехватить отрисовку прямоугольника что при движении и изменении размеров?


 
DVM ©   (2006-12-13 10:50) [23]


> Ты случайно не помнишь как перехватить отрисовку прямоугольника
> что при движении и изменении размеров?

В смысле перехватить?


 
novill ©   (2006-12-13 11:01) [24]

> [23] DVM ©   (13.12.06 10:50)


Вот что я имею в виду: после того как пользователь "схватил" форму за угол, чтобы изменить размер или за заголовок, чтобы преместить, появляется тонкая прямоугольная рамка, которая двигается/изменяет размеры следуя движениям мыши. А форма изменяется только, когда левую кнопку мыши отпускают.

Некоторые программы могут уже в процессе "таскания" ограничивать положение/размеры только набором заданных значений.


 
DVM ©   (2006-12-13 11:14) [25]


> novill ©   (13.12.06 11:01) [24]

А, понятно. Вот погляди, код, когда то я делал панель задач, там почти то же что тебе надо.

function OnSizing(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
 prc: PRect;
 rcBorder: TRect;
 nWidthNew, nHeightNew: integer;
begin
 bStartSizingMoving:=true;
 prc := PRect(lParam);
 rcBorder := Rect(0, 0, TaskBarSettings.szMinDockSize.cx, TaskBarSettings.szMinDockSize.cy);

 if TaskBarSettings.szSizeInc.cx <> 0 then
   begin
     nWidthNew  := ((prc^.Right - prc^.Left) - (rcBorder.Right - rcBorder.Left)
       + TaskBarSettings.szSizeInc.cx div 2) div TaskBarSettings.szSizeInc.cx
         * TaskBarSettings.szSizeInc.cx;

     if (nWidthNew < 2*TaskBarSettings.szSizeInc.cx) and (nWidthNew > (rcBorder.Right - rcBorder.Left)) then
        nWidthNew:=34;

     if (nWidthNew < TaskBarSettings.szSizeInc.cx) then
        nWidthNew:=nWidthNew + (rcBorder.Right - rcBorder.Left);
   end
 else
   nWidthNew  := prc^.Right - prc^.Left;

 if TaskBarSettings.szSizeInc.cy <> 0 then
   begin
   
     nHeightNew := ((prc^.Bottom - prc^.Top) - (rcBorder.Bottom - rcBorder.Top)
       + TaskBarSettings.szSizeInc.cy div 2) div TaskBarSettings.szSizeInc.cy
         * TaskBarSettings.szSizeInc.cy + 4;

     if (nHeightNew < 2*TaskBarSettings.szSizeInc.cy) and (nHeightNew > (rcBorder.Bottom - rcBorder.Top))
     then nHeightNew:=34;

     if (nHeightNew < TaskBarSettings.szSizeInc.cy) then
        nHeightNew:=nHeightNew + (rcBorder.Bottom - rcBorder.Top) - 4;
   end
 else
   nHeightNew := prc^.Bottom - prc^.Top;
 case wParam of
   WMSZ_LEFT: prc^.Left := prc^.Right - nWidthNew;
   WMSZ_TOP: prc^.Top := prc^.Bottom - nHeightNew;
   WMSZ_RIGHT: prc^.Right := prc^.Left + nWidthNew;
   WMSZ_BOTTOM: prc^.Bottom := prc^.Top + nHeightNew;
 end;

 Result:=0;
end;

Т.е. Меняем значения в prc^. и получаем нужный эффект.

То же для WM_MOVING у меня было так:


function OnMoving(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
 prc            : PRect;
 pt             : TSmallPoint;
 tbEdgeProposed : TTaskBarEdge;
 w, h           : Integer;
begin
 bStartSizingMoving:=true;
 prc := PRect(lParam);
 pt := GetMessagePosition;
 tbEdgeProposed := CalcProposedState(pt);
 if ((EdgeProposedPrev <> tbeFloat) and (tbEdgeProposed = tbeFloat)) then
   begin
     prc^ := TaskBarSettings.rcFloat;
     w := prc^.Right - prc^.Left;
     h := prc^.Bottom - prc^.Top;
     with prc^ do
       begin
         Left   := pt.X - w div 2;
         Top    := pt.Y ;
         Right  := pt.X + w div 2;
         Bottom := pt.Y + h;
       end;
   end;
 EdgeProposedPrev := tbEdgeProposed;
 GetRect(tbEdgeProposed, prc^);
 OnTaskBarStateChange(true, tbEdgeProposed);

 Result := 0;
end;




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

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.051 c
2-1165825556
Алик
2006-12-11 11:25
2006.12.31
Перевод шестнадцатиричных чисел в десятичные


5-1145882537
Andrew_GUNski
2006-04-24 16:42
2006.12.31
Добавление своего класса Properties DevExpress Grid


15-1165390566
MsGuns
2006-12-06 10:36
2006.12.31
Господа офицеры !


3-1161369035
_Ламер_
2006-10-20 22:30
2006.12.31
Поставил 2.0 после 1.5. Пароль как ветром сдуло.


15-1165573156
Гарри Поттер
2006-12-08 13:19
2006.12.31
Кому знаком такой глюг, помогите?