![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Привязка позиции формы к компоненту на другой форме. [D7, WinXP]
galexis © (2006-01-18 18:11:00)Здравствуйте, Мастера!
Имеется TEdit. Требуется чтобы по нажатию кнопки (расположенной рядом с ним) под TEdit открывался TTreeView и его можно было растаскивать в стороны. Т.е. визуально чтобы это выглядело как ComboBox с деревом.
В голову не пришло ничего лучше, как создать еще одну форму и расположить на ней TTreeView. Приложение у меня MDI, потому и форма у меня MDIChild. Отсюда вопрос, как сделать так, чтобы форма создалась точно под компонентом TEdit?
Извиняюсь за коряво изложенный вопрос.
galexis (2006-01-19 16:02:00) [1]Ой извиняюсь. Ясно же написано
> begin //resize
Спасибо огромное!
galexis (2006-01-19 15:59:00) [2]
> Igor_thief
По моему этот код только двигает Button1. А как растягивать?
Igor_thief (2006-01-19 15:13:00) [3]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 14:34:00) [4]
> msguns ©
Ага, если я BorderStyle:=bsNone - то тогда форму растягивать нельзя.
> Igor_thief
Так бы конечно лучше. Готов научиться растягивать TTreeView, подскажите пожалуйста.
Igor_thief (2006-01-19 13:51:00) [5]А зачем именно делать это все в дополнительной ворме? Почему бы не создавать нужный тебе компонент под едитом и растягивать его мышкой как тебе надо? Если трудность в растягивании мышкой как в дизайн тайм, то не вопрос, я покажу как это сделать.
msguns (2006-01-19 13:38:00) [6]>galexis (19.01.06 13:29) [14]
>А можно еще титул убрать из нее? Не нужно этого синего.
BorderStyle
Случай-то, оказывается, запущенный ;)
galexis (2006-01-19 13:29:00) [7]
> msguns ©
Она у меня убрана оттуда, т.к. еще к БД подключение нужно для заполнения дерева. А про Action := caFree я и забыл :)
А можно еще титул убрать из нее? Не нужно этого синего.
galexis (2006-01-19 13:24:00) [8]А закрыть ее как? Форму эту созданную и модальную?
msguns (2006-01-19 13:23:00) [9]Надо было убрать эту формочку из списка автосоздаваемых, делфа в таких случаях сама выставляет ее в Hide
Кстати, по закрытию формочка должна себя грохать (Action := caFree)
galexis (2006-01-19 13:17:00) [10]сделал так
Hide;
ShowModal;
Так работает.
galexis (2006-01-19 13:10:00) [11]И еще, если щелкнуть по форме с которой создана эта форма, то она пропадет (созданная). В принципе так и надо, но вот куда она девается?
galexis (2006-01-19 13:07:00) [12]Так и есть. Это я с FormStyle налажал, теперь растягивается.
Но как ShowModal все равно не запускается. Пишет Cannot make a visible window modal.
Блин, да еще и само дерево строится долго. ОКВЭД, чтоб его!
msguns (2006-01-19 12:50:00) [13]>galexis (19.01.06 12:32) [7]
Создаваемая форма должна быть fsNormal
galexis (2006-01-19 12:32:00) [14]
> msguns ©
Попробовал, как вы посоветовали. Форма вылезает где надо. Но...
ShowModal не работает. И нельзя размер формы поменять мышкой
Игорь Шевченко (2006-01-19 10:54:00) [15]
> Как передать в конструктор компонент TEdit из формы, если
> она MDIChild?
Как написано в посте [1]
msguns (2006-01-19 10:50:00) [16]Создаваемая форма должна быть явно не 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;
galexis (2006-01-19 10:07:00) [17]
> Игорь Шевченко ©
По моему мне проще нужно. Есть у меня основная форма, в ней создана еще одна форма (дочка) на которой расположен TEdit и рядом с ним кнопка (для пользователя это смотрится как комбобокс). По нажатию этой кнопки точно под TEdit должна появляться еще одна форма с TTreView во всю форму. Чтобы создавалось впечатление, что это комбобокс с деревом. Собственно предложенный вами метод видимо тоже подходит. Параметры Top и Left компонента TEdit мне все равно нужны. Но тогда вопрос все равно остается. Как передать в конструктор компонент TEdit из формы, если она MDIChild?
galexis (2006-01-19 09:50:00) [18]
> Norm Iridium ©
Тоже не плохо. Меня просят в титле сделать ссылку на сайт.
Norm Iridium (2006-01-18 21:49:00) [19]Помню один тоже експериментатор таким мокаром Едит в Титлу формы загнал.
Игорь Шевченко (2006-01-18 18:20:00) [20]
> Отсюда вопрос, как сделать так, чтобы форма создалась точно
> под компонентом 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;
Очень упрощенно, но суть постарался передать