Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Относительный резайз


Kolan ©   (2008-05-28 18:51:00) 

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


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


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

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


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

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


{RASkov}   (2008-05-29 15:38:00) [2]

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

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


Kolan   (2008-05-29 15:18:00) [3]

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

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


Kolan   (2008-05-29 14:56:00) [4]

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

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


MsGuns   (2008-05-29 11:02:00) [5]

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


Kolan   (2008-05-28 23:25:00) [6]

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


MsGuns   (2008-05-28 22:54:00) [7]

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

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

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


Kolan   (2008-05-28 22:13:00) [8]

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


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

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


Kolan   (2008-05-28 22:03:00) [9]

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

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

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


Eraser   (2008-05-28 21:44:00) [10]

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

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

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

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


{RASkov}   (2008-05-28 21:09:00) [11]

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


{RASkov}   (2008-05-28 20:46:00) [12]

Попробуй такой вариант:
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.

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


Reindeer Moss Eater   (2008-05-28 19:02:00) [13]

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


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

OnCanResize

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо