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

Вниз

Привязка позиции формы к компоненту на другой форме.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.076 c
1-1136730423
Glex
2006-01-08 17:27
2006.02.19
Перенос формы за Client Area (Не глючный способ с WMNCHITTEST)


15-1138237006
vidiv
2006-01-26 03:56
2006.02.19
Спам...


2-1138979999
User2
2006-02-03 18:19
2006.02.19
коннект с SQL SERVER по сети


6-1131213238
Volf_555
2005-11-05 20:53
2006.02.19
Как до закачки файла из сети, определить его размер


15-1138270203
Тульский
2006-01-26 13:10
2006.02.19
новый сервис Delphimaster?