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

Вниз

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

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

Наверх





Память: 0.51 MB
Время: 0.006 c
6-1185889040
keal
2007-07-31 17:37
2008.05.04
алгоритм работы сетевого чата на основе UDP


2-1207761012
Dark
2008-04-09 21:10
2008.05.04
PageControl


2-1207594006
Nemeziz
2008-04-07 22:46
2008.05.04
Запрет на выбор IITEMS в ComboBox


2-1207419208
AndrewG
2008-04-05 22:13
2008.05.04
Копирование


8-1179905190
Rimd
2007-05-23 11:26
2008.05.04
Картинка рабочего стола





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