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

Вниз

Относительный резайз   Найти похожие ветки 

 
Kolan ©   (2008-05-28 18:51) [0]

Здравствуйте,
 Есть форма и на ней, для примера, 10 кнопок в два ряда. Кнопки 75 на 25, между ними расстояние 8 (размеры указаны в пикселях).
Задача: При ресайзе формы кнопки должны резайзиться соответственно, причем расстояния между ними должны тоже увеличится соответственно.
Задачу надо решить используя Delphi. Решение должно работать для любых форм и контролов. Кроме того, желательно обойтис без написания кода вообще, а уж если писать, то один раз и навсегда.


Вопрос: Как это реализовать? Куда копать?


 
Reindeer Moss Eater ©   (2008-05-28 19:00) [1]

OnCanResize

type TCanResizeEvent = procedure(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean) of object;


 
Reindeer Moss Eater ©   (2008-05-28 19:02) [2]

Остается определить есть слева,справа,сверху, снизу от контрола другой контрол


 
{RASkov} ©   (2008-05-28 20:46) [3]

Попробуй такой вариант:
DFM
object Form1: TForm1
 Left = 192
 Top = 114
 Width = 412
 Height = 106
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 OnResize = FormResize
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 4
   Top = 4
   Width = 75
   Height = 25
   Caption = "Button1"
   TabOrder = 0
 end
 object Button2: TButton
   Left = 84
   Top = 4
   Width = 75
   Height = 25
   Caption = "Button2"
   TabOrder = 1
 end
 object Button3: TButton
   Left = 164
   Top = 4
   Width = 75
   Height = 25
   Caption = "Button3"
   TabOrder = 2
 end
 object Button4: TButton
   Left = 244
   Top = 4
   Width = 75
   Height = 25
   Caption = "Button4"
   TabOrder = 3
 end
 object Button5: TButton
   Left = 324
   Top = 4
   Width = 75
   Height = 25
   Caption = "Button5"
   TabOrder = 4
 end
 object Button6: TButton
   Left = 4
   Top = 32
   Width = 75
   Height = 25
   Caption = "Button6"
   TabOrder = 5
 end
 object Button7: TButton
   Left = 84
   Top = 32
   Width = 75
   Height = 25
   Caption = "Button7"
   TabOrder = 6
 end
 object Button8: TButton
   Left = 164
   Top = 32
   Width = 75
   Height = 25
   Caption = "Button8"
   TabOrder = 7
 end
 object Button9: TButton
   Left = 244
   Top = 32
   Width = 75
   Height = 25
   Caption = "Button9"
   TabOrder = 8
 end
 object Button10: TButton
   Left = 324
   Top = 32
   Width = 75
   Height = 25
   Caption = "Button10"
   TabOrder = 9
 end
end

PAS
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
 ExtCtrls;

type
 TCtrlStartParam = record
  Left, Top, Width, Height: Integer;
 end;
 TCtrlStartParams = array of TCtrlStartParam;

 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   Button5: TButton;
   Button6: TButton;
   Button7: TButton;
   Button8: TButton;
   Button9: TButton;
   Button10: TButton;
   procedure FormCreate(Sender: TObject);
   procedure FormResize(Sender: TObject);
 private
   W, H: Integer;
   CSP: TCtrlStartParams;
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var N: Integer;
begin
 W:=ClientWidth;
 H:=ClientHeight;
 SetLength(CSP, ControlCount);
 for N:= 0 to ControlCount-1 do begin
  CSP[N].Left:=Controls[N].Left;
  CSP[N].Top:=Controls[N].Top;
  CSP[N].Width:=Controls[N].Width;
  CSP[N].Height:=Controls[N].Height;
 end;
end;

procedure TForm1.FormResize(Sender: TObject);
var KofW, KofH: Extended; N: Integer;
begin
 KofW:=ClientWidth/W;
 KofH:=ClientHeight/H;
 for N:=0 to ControlCount-1 do begin
  Controls[N].Left:=Round(CSP[N].Left*KofW);
  Controls[N].Top:=Round(CSP[N].Top*KofH);
  Controls[N].Width:=Round(CSP[N].Width*KofW);
  Controls[N].Height:=Round(CSP[N].Height*KofH);
 end;
end;

end.

С вложенными контролами нужно будет доработать, но там не сложно)


 
{RASkov} ©   (2008-05-28 21:09) [4]

Как былоб удобно прекреплять файлы архивов к посту....
Вот если об этом еще не известно и вдруг сюда заглянет Максим, то... как вариант для рассмотрения к новому форуму..... если он вообще конечно стартанет(форум новый) :)


 
Eraser ©   (2008-05-28 21:44) [5]

> [0] Kolan ©   (28.05.08 18:51)

Здача легко бы решалась с пом. стандартного компонента TGridPanel, если бы не

> причем расстояния между ними должны тоже увеличится соответственно.

но и это можно решить, меняя динамически padding"и при ресайзе TGridPanel.


 
Kolan ©   (2008-05-28 22:03) [6]

Код понял, благодарю, а может есть какие-то более штатные решения?

Кстати, подобный эффект можно получить используя TGridPanel.

Вежливые вопросы и предложения по клиентскому протоколу и форуму можно писать на http://dev2.delphimaster.ru/forum/other/
© Максим


 
Kolan ©   (2008-05-28 22:13) [7]

Да, хорошобы, чтобы это все работало и в дизайнере.


> [5] Eraser ©   (28.05.08 21:44)

Так и не разобрался, как сделать, чтобы кнопки в ней увеличивались? При уменьшении она их поджимает, а при увеличении она возвращаются к начальным значениям, а бальше нет.


 
MsGuns ©   (2008-05-28 22:54) [8]

>Решение должно работать для любых форм и контролов. Кроме того, >желательно обойтис без написания кода вообще, а уж если писать, то один раз и навсегда.

Это фантастика.
Как "скоординировать" между собою такие разные контролы, как эдит и грид ?
Как учитывать и учитывать ли вообще внутренний ресайзинг (для контролов-контейнеров) ?
Как поступать с минимальными размерами, которые при достижении определенных величин изменяют вид контрола до неузнаваемости ?
Как быть с вертикальным переносом контролов и их ресайзингом ? Что делать с контролами, чей Height не может изменяться ?

Вопросов можно задать еще много. И ни на один из них нет ответа.


 
Kolan ©   (2008-05-28 23:25) [9]

HTML дает ответы на многие.


 
MsGuns ©   (2008-05-29 11:02) [10]

А где речь щла о хатмеле ?


 
Kolan ©   (2008-05-29 14:56) [11]

> А где речь щла о хатмеле ?

В том-то и дело, что нет, о Dlephi.


 
Kolan ©   (2008-05-29 15:18) [12]

> [3] {RASkov} ©   (28.05.08 20:46)

Как добиться, чтобы твой вариант срабатывал и во время дизайна?


 
{RASkov} ©   (2008-05-29 15:38) [13]

> [12] Kolan ©   (29.05.08 15:18)

Может быть эксперта какого-нибуть написать.... или невизуальный компонент... что даже лучше, так как он будет и в рантайме тоже самое делать :)


 
Eraser ©   (2008-05-30 00:46) [14]

> [7] Kolan ©   (28.05.08 22:13)


> Так и не разобрался, как сделать, чтобы кнопки в ней увеличивались?

мм.. у кнопок Aling = alClient, вроде увеличиваются )



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

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

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1245452036
Иксик
2009-06-20 02:53
2009.08.16
I will derive


15-1245011406
Юрий
2009-06-15 00:30
2009.08.16
С днем рождения ! 15 июня 2009 понедельник


2-1245418903
Student85236
2009-06-19 17:41
2009.08.16
ClientSocket в Таймере


15-1244644377
Медвежонок Пятачок
2009-06-10 18:32
2009.08.16
сатанисты среди нас


2-1245355798
antonn
2009-06-19 00:09
2009.08.16
AV при доступе к объекту из потока