Форум: "Начинающим";
Текущий архив: 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]> Хотя нет… «пустой» Anchors по центру не выровняет, но
> при смене размеров родителя будет пропорционально на одном
> месте…
В том то и дело. А иногда бывает нужно чтобы это место было чентром, но как это сделать штатными средствами я незнаю.
Кстати можно написать helper…
← →
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