Главная страница
    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.007 c
15-1245325093
Дмитрий С
2009-06-18 15:38
2009.08.16
iphone в качестве модема


15-1244816619
dnepr
2009-06-12 18:23
2009.08.16
Вопрос про потоки


15-1245045762
Knight
2009-06-15 10:02
2009.08.16
Помогите теорией. Полигон по направляющей полилинии.


15-1245181636
man from earth
2009-06-16 23:47
2009.08.16
а я например верю в лунатиков и в теории заговоров


2-1245319637
lewka
2009-06-18 14:07
2009.08.16
Word.application





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский