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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.045 c
15-1165502145
SkySpeed
2006-12-07 17:35
2006.12.31
HELP! ПК тупо зависает без причины, приходится перезагружать.....


15-1165484004
Strate
2006-12-07 12:33
2006.12.31
Нда... Прослушка компов всего мира..


15-1165604393
Гоблин
2006-12-08 21:59
2006.12.31
McAffee


1-1163591638
flaxe
2006-11-15 14:53
2006.12.31
Работа с окном Internet Explorer


15-1165520112
GanibalLector
2006-12-07 22:35
2006.12.31
Подмена сер.номера винта





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