Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
15-1245048199
Индеец
2009-06-15 10:43
2009.08.16
Delphi 2009 Configuration Manager и директивы компилятора


15-1244722907
ms1
2009-06-11 16:21
2009.08.16
Нагрузка на сервер Web


15-1245433518
Урсулапов_
2009-06-19 21:45
2009.08.16
Cranberries - Animal Instinct


15-1244878087
Unknown user
2009-06-13 11:28
2009.08.16
Декомпозиция полигона на треугольники


15-1245406780
Styx_
2009-06-19 14:19
2009.08.16
3D collision detection





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский