Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
3-1135069265
ANB
2005-12-20 12:01
2006.02.19
Как лучше сделать ссылку на 2 сущности ? (Oracle и MS SQL)


15-1138543085
kaZaNoVa
2006-01-29 16:58
2006.02.19
Разочарование в онлайн-играх ...


10-1113983044
Fishb1
2005-04-20 11:44
2006.02.19
Работа с файлами EXCEL


15-1138534223
Kerk
2006-01-29 14:30
2006.02.19
Я сейчас убью соседей


15-1138625615
ArtemESC
2006-01-30 15:53
2006.02.19
Получают ли что-то модераторы?





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