Конференция "Основная" » Относительный резайз
 
  • Kolan © (28.05.08 18:51) [0]
    Здравствуйте,
     Есть форма и на ней, для примера, 10 кнопок в два ряда. Кнопки 75 на 25, между ними расстояние 8 (размеры указаны в пикселях).
    Задача: При ресайзе формы кнопки должны резайзиться соответственно, причем расстояния между ними должны тоже увеличится соответственно.
    Задачу надо решить используя Delphi. Решение должно работать для любых форм и контролов. Кроме того, желательно обойтис без написания кода вообще, а уж если писать, то один раз и навсегда.


    Вопрос: Как это реализовать? Куда копать?
  • Reindeer Moss Eater © (28.05.08 19:00) [1]
    OnCanResize

    type TCanResizeEvent = procedure(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean) of object;
  • Reindeer Moss Eater © (28.05.08 19:02) [2]
    Остается определить есть слева,справа,сверху, снизу от контрола другой контрол
  • {RASkov} © (28.05.08 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} © (28.05.08 21:09) [4]
    Как былоб удобно прекреплять файлы архивов к посту....
    Вот если об этом еще не известно и вдруг сюда заглянет Максим, то... как вариант для рассмотрения к новому форуму..... если он вообще конечно стартанет(форум новый) :)
  • Eraser © (28.05.08 21:44) [5]
    > [0] Kolan ©   (28.05.08 18:51)

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

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

    но и это можно решить, меняя динамически padding'и при ресайзе TGridPanel.
  • Kolan © (28.05.08 22:03) [6]
    Код понял, благодарю, а может есть какие-то более штатные решения?

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

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


    © Максим
  • Kolan © (28.05.08 22:13) [7]
    Да, хорошобы, чтобы это все работало и в дизайнере.


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

    Так и не разобрался, как сделать, чтобы кнопки в ней увеличивались? При уменьшении она их поджимает, а при увеличении она возвращаются к начальным значениям, а бальше нет.
  • MsGuns © (28.05.08 22:54) [8]
    >Решение должно работать для любых форм и контролов. Кроме того, >желательно обойтис без написания кода вообще, а уж если писать, то один раз и навсегда.

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

    Вопросов можно задать еще много. И ни на один из них нет ответа.
  • Kolan © (28.05.08 23:25) [9]
    HTML дает ответы на многие.
  • MsGuns © (29.05.08 11:02) [10]
    А где речь щла о хатмеле ?
  • Kolan © (29.05.08 14:56) [11]
    > А где речь щла о хатмеле ?

    В том-то и дело, что нет, о Dlephi.
  • Kolan © (29.05.08 15:18) [12]
    > [3] {RASkov} ©   (28.05.08 20:46)

    Как добиться, чтобы твой вариант срабатывал и во время дизайна?
  • {RASkov} © (29.05.08 15:38) [13]
    > [12] Kolan ©   (29.05.08 15:18)

    Может быть эксперта какого-нибуть написать.... или невизуальный компонент... что даже лучше, так как он будет и в рантайме тоже самое делать :)
  • Eraser © (30.05.08 00:46) [14]
    > [7] Kolan ©   (28.05.08 22:13)


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

    мм.. у кнопок Aling = alClient, вроде увеличиваются )
 
Конференция "Основная" » Относительный резайз
Есть новые Нет новых   [134491   +8][b:0][p:0.003]