Форум: "Основная";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизПривязка позиции формы к компоненту на другой форме. Найти похожие ветки
← →
galexis (2006-01-18 18:11) [0]Здравствуйте, Мастера!
Имеется TEdit. Требуется чтобы по нажатию кнопки (расположенной рядом с ним) под TEdit открывался TTreeView и его можно было растаскивать в стороны. Т.е. визуально чтобы это выглядело как ComboBox с деревом.
В голову не пришло ничего лучше, как создать еще одну форму и расположить на ней TTreeView. Приложение у меня MDI, потому и форма у меня MDIChild. Отсюда вопрос, как сделать так, чтобы форма создалась точно под компонентом TEdit?
Извиняюсь за коряво изложенный вопрос.
← →
Игорь Шевченко © (2006-01-18 18:20) [1]
> Отсюда вопрос, как сделать так, чтобы форма создалась точно
> под компонентом TEdit?
Перекрыть конструктор формы, передавая туда TEdit в качестве дополнительного параметра. Зная координаты, определять, в какую половину экрана лучше влезет форма.
type
TFooForm = class(TForm)
..
public
constructor Create (AOwner: TComponent; AControl: TWinControl); reintroduce;
end;
....
constructor TFooForm.Create (....);
begin
inherited Create (AOwner);
Left := AControl.Left;
if AControl.Top < Screen.Width div 2 then
Top := AControl.Top + AControl.Height
else
Top := AControl.Top - Height;
end;
Очень упрощенно, но суть постарался передать
← →
Norm Iridium © (2006-01-18 21:49) [2]Помню один тоже експериментатор таким мокаром Едит в Титлу формы загнал.
← →
galexis (2006-01-19 09:50) [3]
> Norm Iridium ©
Тоже не плохо. Меня просят в титле сделать ссылку на сайт.
← →
galexis (2006-01-19 10:07) [4]
> Игорь Шевченко ©
По моему мне проще нужно. Есть у меня основная форма, в ней создана еще одна форма (дочка) на которой расположен TEdit и рядом с ним кнопка (для пользователя это смотрится как комбобокс). По нажатию этой кнопки точно под TEdit должна появляться еще одна форма с TTreView во всю форму. Чтобы создавалось впечатление, что это комбобокс с деревом. Собственно предложенный вами метод видимо тоже подходит. Параметры Top и Left компонента TEdit мне все равно нужны. Но тогда вопрос все равно остается. Как передать в конструктор компонент TEdit из формы, если она MDIChild?
← →
msguns © (2006-01-19 10:50) [5]Создаваемая форма должна быть явно не MDI-Child и, скорее всего открываться модально.
Пример. "Дочка" создает и модально открывает форму относительно активной ячейки грида (MainForm - это главная форма MDI, GridCell - TRect астивной ячейки грида):
procedure TfrmPers.Call_GetListEntries(var Msg: TMessage);
begin
with TfrmPrEntries.Create(Self) do
begin
if (MainForm.Height-(Self.grPersGrid.ClientOrigin.Y + Self.GridCell.Bottom))>Height then
Top := Self.grPersGrid.ClientOrigin.Y+Self.GridCell.Bottom
else
Top := Self.grPersGrid.ClientOrigin.Y+Self.GridCell.Top-Height;
if (MainForm.Width-(Self.grPersGrid.ClientOrigin.X+GridCell.Left)>Width) then
Left := Self.grPersGrid.ClientOrigin.X+GridCell.Left
else
Left := Self.grPersGrid.ClientOrigin.X+GridCell.Right-Width;
ShowModal;
end;
end;
← →
Игорь Шевченко © (2006-01-19 10:54) [6]
> Как передать в конструктор компонент TEdit из формы, если
> она MDIChild?
Как написано в посте [1]
← →
galexis (2006-01-19 12:32) [7]
> msguns ©
Попробовал, как вы посоветовали. Форма вылезает где надо. Но...
ShowModal не работает. И нельзя размер формы поменять мышкой
← →
msguns © (2006-01-19 12:50) [8]>galexis (19.01.06 12:32) [7]
Создаваемая форма должна быть fsNormal
← →
galexis (2006-01-19 13:07) [9]Так и есть. Это я с FormStyle налажал, теперь растягивается.
Но как ShowModal все равно не запускается. Пишет Cannot make a visible window modal.
Блин, да еще и само дерево строится долго. ОКВЭД, чтоб его!
← →
galexis (2006-01-19 13:10) [10]И еще, если щелкнуть по форме с которой создана эта форма, то она пропадет (созданная). В принципе так и надо, но вот куда она девается?
← →
galexis (2006-01-19 13:17) [11]сделал так
Hide;
ShowModal;
Так работает.
← →
msguns © (2006-01-19 13:23) [12]Надо было убрать эту формочку из списка автосоздаваемых, делфа в таких случаях сама выставляет ее в Hide
Кстати, по закрытию формочка должна себя грохать (Action := caFree)
← →
galexis (2006-01-19 13:24) [13]А закрыть ее как? Форму эту созданную и модальную?
← →
galexis (2006-01-19 13:29) [14]
> msguns ©
Она у меня убрана оттуда, т.к. еще к БД подключение нужно для заполнения дерева. А про Action := caFree я и забыл :)
А можно еще титул убрать из нее? Не нужно этого синего.
← →
msguns © (2006-01-19 13:38) [15]>galexis (19.01.06 13:29) [14]
>А можно еще титул убрать из нее? Не нужно этого синего.
BorderStyle
Случай-то, оказывается, запущенный ;)
← →
Igor_thief (2006-01-19 13:51) [16]А зачем именно делать это все в дополнительной ворме? Почему бы не создавать нужный тебе компонент под едитом и растягивать его мышкой как тебе надо? Если трудность в растягивании мышкой как в дизайн тайм, то не вопрос, я покажу как это сделать.
← →
galexis (2006-01-19 14:34) [17]
> msguns ©
Ага, если я BorderStyle:=bsNone - то тогда форму растягивать нельзя.
> Igor_thief
Так бы конечно лучше. Готов научиться растягивать TTreeView, подскажите пожалуйста.
← →
Igor_thief (2006-01-19 15:13) [18]galexis (19.01.06 14:34) [17]
На ворме присутсвует кнопка и чекбокс.
type
TForm2 = class(TForm)
Button1: TButton;
chbPosition: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
procedure ControlMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
private
PosChange: boolean;
OldPos: TPoint;
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.ControlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (chbPosition.Checked) AND
(Sender is TWinControl) then
begin
PosChange := True;
SetCapture(TWinControl(Sender).Handle);
GetCursorPos(OldPos);
end;
end;
procedure TForm2.ControlMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
minWidth = 20;
minHeight = 20;
var
NewPos: TPoint;
FPoint : TPoint;
begin
if PosChange then
begin
with TWinControl(Sender) do
begin
GetCursorPos(NewPos);
if ssShift in Shift then
begin //resize
Screen.Cursor := crSizeNWSE;
FPoint := ScreenToClient(Mouse.CursorPos);
if FPoint.X > minWidth then
Width := FPoint.X;
if FPoint.Y > minHeight then
Height := FPoint.Y;
end
else //move
begin
Screen.Cursor := crSize;
Left := Left - OldPos.X + NewPos.X;
Top := Top - OldPos.Y + NewPos.Y;
OldPos := newPos;
end;
end;
end;
end;
procedure TForm2.ControlMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if PosChange then
begin
Screen.Cursor := crDefault;
ReleaseCapture;
PosChange := False;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Button1.OnMouseDown := ControlMouseDown;
Button1.OnMouseUp := ControlMouseUp;
Button1.OnMouseMove := ControlMouseMove;
end;
end.
За код спасибо Zarko Gajic.
← →
galexis (2006-01-19 15:59) [19]
> Igor_thief
По моему этот код только двигает Button1. А как растягивать?
← →
galexis (2006-01-19 16:02) [20]Ой извиняюсь. Ясно же написано
> begin //resize
Спасибо огромное!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c