Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.04;
Скачать: CL | DM;

Вниз

Выравнивание   Найти похожие ветки 

 
TRSteep ©   (2008-04-06 16:43) [0]

Существуте выравнивание компонента alRight, alLeft и тд
А как можно выравнить 2 компонента (например TMemo) по центру?
Возможно ли это сделать стандартными способами или самому нужно обрабатывать изменение размера формы?
(и как его реализовать?)


 
{RASkov} ©   (2008-04-06 17:00) [1]

> [0] TRSteep ©   (06.04.08 16:43)

Ни якорями, ни выравниванием этого не добиться - только "в ручки" пересчитывать положение и размеры компонентов...


 
Palladin ©   (2008-04-06 17:01) [2]


> Возможно ли это сделать стандартными способами

смотря что означает "выравнить по центру"


> самому нужно обрабатывать изменение размера формы?
> (и как его реализовать?)

путем нехитрых математических вычислений


 
TRSteep ©   (2008-04-06 17:02) [3]

а как отлавливать изменение формы?


 
Palladin ©   (2008-04-06 17:03) [4]

посмотреть на названия событий формы и выбрать наиболее подходящее по смыслу


 
TRSteep ©   (2008-04-06 22:35) [5]

хм изменять то оказалось достаточно просто

 
procedure TFrm_Main.FormResize(Sender: TObject);
var
 FrmSplitLine: integer;
begin

 FrmSplitLine := Round( Frm_main.ClientWidth/3 );

 Memo.Top := 0;
 Memo.Left := 0;
 Memo.Height := Frm_main.ClientHeight;
 Memo.Width := FrmSplitLine;

 PanelTable.Top := 0;
 PanelTable.Left := FrmSplitLine;
 PanelTable.Height := Frm_main.ClientHeight;
 PanelTable.Width  := FrmSplitLine*2;

end;


А можно сюда прикрутить split как нибудь?


 
sniknik ©   (2008-04-06 23:16) [6]

> хм изменять то оказалось достаточно просто
и что тут такого нестандартного? мемо выровнен по left, панель по client...
а в [0] описано не пойми что.

> А можно сюда прикрутить split как нибудь?
а зачем? не проще ли делать стандартно, чем прикручивать к "череззадницусделанному"?


 
TRSteep ©   (2008-04-07 15:33) [7]

sniknik ©
стандартно это как?


 
sniknik ©   (2008-04-07 15:57) [8]

> стандартно это как?
стандартно, это стандартными средствами...
> Существуте выравнивание компонента alRight, alLeft и тд
вот это стандартно

[5] это через одно место, но по результату то же самое, что... см. [6]  

ну, если необходим перерасчет ширины мемо при ресайзе (точно как в коде в [5]), нужно еще добавить  
procedure TFrm_Main.FormResize(Sender: TObject);
begin
 Memo.Width := ClientWidth div 3;
end;
будет вообще полный аналог. хотя, имхо, это лишнее.

и при стандартном подходе, если нужен split, то его нужно просто положить на форму.


 
Kolan ©   (2008-04-07 15:59) [9]

Вот тебе супер-мега функция:

procedure PutControlInCenter(AParentControl,
 ControlThatMustBeInCenter: TControl; AnOffset: TPoint;
 ACenterType: TCenterTypes = ctBoth);
var
 ParentMiddlePoint: TPoint;
 ChildMiddlePoint: TPoint;
begin
 if Assigned(AParentControl) and Assigned(ControlThatMustBeInCenter) then
 begin
   ParentMiddlePoint.X := Round(AParentControl.Width / 2);
   ParentMiddlePoint.Y := Round(AParentControl.Height / 2);

   ChildMiddlePoint.X := Round(ControlThatMustBeInCenter.Width / 2);
   ChildMiddlePoint.Y := Round(ControlThatMustBeInCenter.Height / 2);

   if (ACenterType in [ctHorizontal, ctBoth]) then
     ControlThatMustBeInCenter.Left := ParentMiddlePoint.X — ChildMiddlePoint.X + AnOffset.X;
   if (ACenterType in [ctVertical, ctBoth]) then
     ControlThatMustBeInCenter.Top := ParentMiddlePoint.Y — ChildMiddlePoint.Y + AnOffset.Y;
 end;
end;


 
Kolan ©   (2008-04-07 15:59) [10]

Упс:
unit KPositionRoutines;

interface
uses
 Controls, Types;

type
 TCenterTypes =
 (
   ctVertical,
   ctHorizontal,
   ctBoth
 );

 {Поместить контрол по центру другого.}
 procedure PutControlInCenter(AParentControl, ControlThatMustBeInCenter: TControl;
   AnOffset: TPoint; ACenterType: TCenterTypes = ctBoth);

implementation

procedure PutControlInCenter(AParentControl,
 ControlThatMustBeInCenter: TControl; AnOffset: TPoint;
 ACenterType: TCenterTypes = ctBoth);
var
 ParentMiddlePoint: TPoint;
 ChildMiddlePoint: TPoint;
begin
 if Assigned(AParentControl) and Assigned(ControlThatMustBeInCenter) then
 begin
   ParentMiddlePoint.X := Round(AParentControl.Width / 2);
   ParentMiddlePoint.Y := Round(AParentControl.Height / 2);

   ChildMiddlePoint.X := Round(ControlThatMustBeInCenter.Width / 2);
   ChildMiddlePoint.Y := Round(ControlThatMustBeInCenter.Height / 2);

   if (ACenterType in [ctHorizontal, ctBoth]) then
     ControlThatMustBeInCenter.Left := ParentMiddlePoint.X — ChildMiddlePoint.X + AnOffset.X;
   if (ACenterType in [ctVertical, ctBoth]) then
     ControlThatMustBeInCenter.Top := ParentMiddlePoint.Y — ChildMiddlePoint.Y + AnOffset.Y;
 end;
end;

end.


 
Palladin ©   (2008-04-07 16:05) [11]


>    ParentMiddlePoint.X := Round(AParentControl.Width / 2);
>
>    ParentMiddlePoint.Y := Round(AParentControl.Height /
> 2);
>
>    ChildMiddlePoint.X := Round(ControlThatMustBeInCenter.
> Width / 2);
>    ChildMiddlePoint.Y := Round(ControlThatMustBeInCenter.
> Height / 2);

а div кошерней использовать :)


 
sniknik ©   (2008-04-07 16:05) [12]

Kolan ©   (07.04.08 15:59) [10]
код не проверял, но судя по
> {Поместить контрол по центру другого.}
это аналог стандартного
Anchors:= [akLeft,akTop,akRight,akBottom];
сделанного в дизайне.
?


 
Kolan ©   (2008-04-07 16:07) [13]

> Anchors:= [akLeft,akTop,akRight,akBottom];
> сделанного в дизайне.

Нее, установка таких свойств будет растягивать контрол, а эта функция просто середину вычисляет.


> а div кошерней использовать :)

Согласен.


 
Kolan ©   (2008-04-07 16:10) [14]

Подправил:

procedure PutControlInCenter(AParentControl,
 ControlThatMustBeInCenter: TControl; AnOffset: TPoint;
 ACenterType: TCenterTypes = ctBoth);
var
 ParentMiddlePoint: TPoint;
 ChildMiddlePoint: TPoint;
begin
 if Assigned(AParentControl) and Assigned(ControlThatMustBeInCenter) then
 begin
   ParentMiddlePoint := Point(AParentControl.Width div 2, AParentControl.Height div 2);
   ChildMiddlePoint := Point(ControlThatMustBeInCenter.Width div 2, ControlThatMustBeInCenter.Height div 2);

   if (ACenterType in [ctHorizontal, ctBoth]) then
     ControlThatMustBeInCenter.Left := ParentMiddlePoint.X — ChildMiddlePoint.X + AnOffset.X;
   if (ACenterType in [ctVertical, ctBoth]) then
     ControlThatMustBeInCenter.Top := ParentMiddlePoint.Y — ChildMiddlePoint.Y + AnOffset.Y;
 end;
end;


 
{RASkov} ©   (2008-04-07 17:56) [15]

> это аналог стандартного
> Anchors:= [akLeft,akTop,akRight,akBottom];
> сделанного в дизайне.

Нет, это аналог
Anchors:= [];
но сделанного в дизайнере
:)

> Kolan ©

это с одним мемо, а автору нужно нечто такое, только с двумя.... я так понял сабж)


 
{RASkov} ©   (2008-04-07 17:58) [16]

> Нет, это аналог
> Anchors:= [];

Хотя нет... "пустой" Anchors по центру не выровняет, но при смене размеров родителя будет пропорционально на одном месте...


 
Kolan ©   (2008-04-07 18:01) [17]

> Хотя нет&#133 «пустой» Anchors по центру не выровняет, но
> при смене размеров родителя будет пропорционально на одном
> месте&#133

В том то и дело. А иногда бывает нужно чтобы это место было чентром, но как это сделать штатными средствами я незнаю.

Кстати можно написать helper&#133


 
Kolan ©   (2008-04-07 18:11) [18]

Прошу:
TCenterControlHelper = class helper for TControl
 public
   procedure PutInParentCenter(AnOffset: TPoint; ACenterType: TCenterTypes = ctBoth); overload;
   procedure PutInParentCenter; overload;
 end;

{ TCenterControlHelper }

procedure TCenterControlHelper.PutInParentCenter(AnOffset: TPoint;
 ACenterType: TCenterTypes = ctBoth);
begin
 if Parent <> nil then
   PutControlInCenter(Parent, Self, AnOffset, ACenterType);
end;

procedure TCenterControlHelper.PutInParentCenter;
begin
 PutInParentCenter(Point(0, 0));
end;


Использование:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 TreeView1.PutInParentCenter;
end;


:)


 
{RASkov} ©   (2008-04-07 19:05) [19]

> TCenterControlHelper = class helper for TControl

Прикольная штука - эти хэлперы :) жаль их нет в D7)

> [18] Kolan ©   (07.04.08 18:11)


> А как можно выравнить 2 компонента (например TMemo) по центру?

:)


 
tesseract ©   (2008-04-07 20:42) [20]


>  жаль их нет в D7)


в D2006 есть замечательная вещь, TControlGrid. В D7 приходиться колдовать с панелями. Но можно, но много панелек :-)


 
TRSteep ©   (2008-04-08 16:12) [21]

sniknik ©

насколько я понимаю
одному задаем
alLeft и ему же меняем размер при изменении
Второму alClient - и бросаем split?

Kolan ©
хм... код буду разбирать

{RASkov} ©

это с одним мемо,
>  а автору нужно нечто такое, только с двумя.... я так понял
> сабж)


Там один Memo одна панель (в 2 раза больше чем мемо) - в панели 4 компонента со строками (название забыл - их еще выбирать можно) одинаковых по ширине
Между memo и панелью хочу slit сделать - чтобы удобно было и текст в мемо смотреть (если широкии будет) и значение в 4-х столбцах текста

Хочу нормально лабу оформить все равно парсер пока написать не могу...
А так хоть формы красивые =)

PS А что такое хелперы вобще??? У меня Delphi 7....



Страницы: 1 вся ветка

Текущий архив: 2008.05.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
11-1188746752
andreil
2007-09-02 19:25
2008.05.04
Глюк Дельфи или КОЛ?


15-1206414584
Slider007
2008-03-25 06:09
2008.05.04
С днем рождения ! 24 марта 2008 понедельник


2-1207744045
Снежинка
2008-04-09 16:27
2008.05.04
Пароль


15-1205872320
NewZ
2008-03-18 23:32
2008.05.04
Сканварды!!!


15-1206456184
Andy BitOff
2008-03-25 17:43
2008.05.04
Бумеранг в космосе