![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Относительный резайз
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;