-
Здравствуйте, Есть форма и на ней, для примера, 10 кнопок в два ряда. Кнопки 75 на 25, между ними расстояние 8 (размеры указаны в пикселях). Задача: При ресайзе формы кнопки должны резайзиться соответственно, причем расстояния между ними должны тоже увеличится соответственно. Задачу надо решить используя Delphi. Решение должно работать для любых форм и контролов. Кроме того, желательно обойтис без написания кода вообще, а уж если писать, то один раз и навсегда.
Вопрос: Как это реализовать? Куда копать?
-
OnCanResize
type TCanResizeEvent = procedure(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean) of object;
-
Остается определить есть слева,справа,сверху, снизу от контрола другой контрол
-
Попробуй такой вариант: DFMobject 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 PASunit 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;
public
end;
var Form1: TForm1;
implementation
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. С вложенными контролами нужно будет доработать, но там не сложно)
-
Как былоб удобно прекреплять файлы архивов к посту.... Вот если об этом еще не известно и вдруг сюда заглянет Максим, то... как вариант для рассмотрения к новому форуму..... если он вообще конечно стартанет(форум новый) :)
-
> [0] Kolan © (28.05.08 18:51)
Здача легко бы решалась с пом. стандартного компонента TGridPanel, если бы не
> причем расстояния между ними должны тоже увеличится соответственно.
но и это можно решить, меняя динамически padding'и при ресайзе TGridPanel.
-
Код понял, благодарю, а может есть какие-то более штатные решения? Кстати, подобный эффект можно получить используя TGridPanel. Вежливые вопросы и предложения по клиентскому протоколу и форуму можно писать на http: © Максим
-
Да, хорошобы, чтобы это все работало и в дизайнере.
> [5] Eraser © (28.05.08 21:44)
Так и не разобрался, как сделать, чтобы кнопки в ней увеличивались? При уменьшении она их поджимает, а при увеличении она возвращаются к начальным значениям, а бальше нет.
-
>Решение должно работать для любых форм и контролов. Кроме того, >желательно обойтис без написания кода вообще, а уж если писать, то один раз и навсегда.
Это фантастика. Как "скоординировать" между собою такие разные контролы, как эдит и грид ? Как учитывать и учитывать ли вообще внутренний ресайзинг (для контролов-контейнеров) ? Как поступать с минимальными размерами, которые при достижении определенных величин изменяют вид контрола до неузнаваемости ? Как быть с вертикальным переносом контролов и их ресайзингом ? Что делать с контролами, чей Height не может изменяться ?
Вопросов можно задать еще много. И ни на один из них нет ответа.
-
HTML дает ответы на многие.
-
А где речь щла о хатмеле ?
-
> А где речь щла о хатмеле ?
В том-то и дело, что нет, о Dlephi.
-
> [3] {RASkov} © (28.05.08 20:46)
Как добиться, чтобы твой вариант срабатывал и во время дизайна?
-
> [12] Kolan © (29.05.08 15:18)
Может быть эксперта какого-нибуть написать.... или невизуальный компонент... что даже лучше, так как он будет и в рантайме тоже самое делать :)
-
> [7] Kolan © (28.05.08 22:13)
> Так и не разобрался, как сделать, чтобы кнопки в ней увеличивались?
мм.. у кнопок Aling = alClient, вроде увеличиваются )
|