Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.09.2010, 14:11
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию Окна как в IDE Delphi

Как сделать окна, как в IDE Delphi? Что бы в верху было основное окно, а остальные (Object Inspector и т.д.) можно было перетаскивать по своему усмотрению, либо совсем закрывать?
Киньте ссылку где почитать?
Ответить с цитированием
  #2  
Старый 06.09.2010, 15:17
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию

Просто создай три формы, одну расположи сверху, остальные - где хочется, при этом основной (первой) формой сделай верхнее окно. Тогда ты их все таскать и закрывать сможешь, но если закроешь верхнее окно, закроются все. Я так понимаю. тебе это нужно?
Ответить с цитированием
  #3  
Старый 06.09.2010, 15:22
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Это понятно.
А как сделать что бы окна можно было объединять?
Ответить с цитированием
  #4  
Старый 06.09.2010, 15:29
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию

объединять? это ты что имеешь в виду?
Ответить с цитированием
  #5  
Старый 07.09.2010, 09:32
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Вот так, окно может быть отдельно:


Вот так можно объединять:


И вот так:
Ответить с цитированием
  #6  
Старый 07.09.2010, 15:56
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию

суть в чем - сделай две (или более) форм, и обработай событие перемещения окна (при перемещении сначала вызывается OnCanResize, затем - OnConstrainedResize) и если окно оказывается у заголовка другого окна (например перетаскиваешь Form2 на Form1) то (если ты кидаешь на формы PageControl) создаешь новую вкладку, копируешь туда данные с перетаскиевамой формы и у формы делаешь Form2.Visible:=false;
учти, чтобы юзать одну форму из другой надо после {$R *.dfm}
добвить:

uses Unit1; //или любой другой
Ответить с цитированием
  #7  
Старый 07.09.2010, 17:33
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Вообщем делаем например 2 формы
1-я как говорилось выше основная, 2-я открывается по show;

далее обрабатываем события события перемещения окна ну а остальное то что тебе надо например делаем так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  form2.Parent:=panel1;
  form2.Top:=1;
  form2.Left:=1;
end;

думаю код вполне понятен
после его выполнения форма2 будет внутри панели.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #8  
Старый 07.09.2010, 22:28
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

НАрод что вы изобритаете велосипед? Борланд уже давно его изобрела)) Читаем про MDI приложения здесь
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #9  
Старый 08.09.2010, 07:02
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Я не уверен что это MDI. В Delphi 2010 может и MDI, а вот в 7-ке точно по другому сделано.
Ответить с цитированием
  #10  
Старый 08.09.2010, 07:50
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Цитата:
Сообщение от Rat
Я не уверен что это MDI. В Delphi 2010 может и MDI, а вот в 7-ке точно по другому сделано.
Я вчера вечером сразу в делфи зашел и проверил даную статью. В семерке все работает так же, как и описано в статье.
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #11  
Старый 08.09.2010, 09:02
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

2 Bars1992

причем тут MDI? вопрос в построении форм как в IDE DElphi вроде.
тут MDI и не пахнет.

2 Rat с объединением окон получилось?
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #12  
Старый 08.09.2010, 15:25
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Пока нет. Сегодня вечером попробую.
Ответить с цитированием
  #13  
Старый 08.09.2010, 18:24
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Нашел ответ в книге "Delphi 6 и Kylix. Библиотека программиста", Автор: Сергей Бобровский. Глава: Панели и декоративные элементы. Механизмы перетаскивания и стыковки.

Есть три параметра у форм и панелей: DockSite, DragMode, DragKid. Если всё выставить в автомат, то будет как в этом примере для D2010.

Можно все эти вещи контролировать. В общем ниже глава из книги:
Цитата:
Механизм стыковки
В ряде современных настольных приложений реализован новый подход к перемещению отдельных объектов и их групп. Элементы управления объединяются в стыкуемые палитры (Dock), которые способны свободно "плавать" внутри заданной области. Палитры могут пристыковываться друг к другу, подстраивая размеры, а расположенные на них элементы управления можно перетаскивать между палитрами. Так, в частности, реализованы некоторые окна в самой системе Delphi 6. Например, Менеджер проектов и Инспектор объектов можно объединить вместе. Для этого в их контекстных меню имеется пункт Dockable (Стыкуемый). Если этот пункт включен (помечен галочкой), то он позволяет данному окну пристыковываться к другим окнам среды.
Для рассмотрения механизма стыковки (drag-and-dock) создадим новый проект.
В проектировщике форм появиться новая форма Form1, являющаяся главной формой нового проекта. На ней необходимо разместить две панели: Panel1 и Panel2. На первую панель следует поместить две кнопки: Button1 и Button 2.
Обеспечить работу механизма стыковки можно и без программирования. Для этого сначала надо указать объекты, которые выступают в роли стыкуемых палитр: Panel1 и Panel2. Их свойство DockSite определяют, могут ли объекты выполнять функции палитры. Значения свойств надо установить равными true. Чтобы автоматически поддерживать режимы стыковки, не обращаясь программно к методам палитр, необходимо для свойства DragMode (Режим перетаскивания) задать значение dmAutomatic. Кроме того, значения свойств DragKid (Вид перетаскивания) необходимо изменить с dkDrag (Свободное перетаскивание) на dkDock (Стыковка).
Кнопки не могут служить полноценными палитрами (свойства DockSite у них нет), поэтому для кнопок настраиваются только свойства DragMode (значение dmAutomatic) и DragKid (значение dkDock). Созданную программу можно откомпилировать и запустить. Теперь любую панель можно таскать по форме, помещать внутрь другой панели и перетаскивать кнопки, стыкуя друг с другом самым причудливым образом.
В ходе перемещения кнопок и панелей для них автоматически создается небольшое охватывающее окно, позволяющее перетаскивать эти объекты как в пределах формы, так и за ее границами. При этом стыковать объекты можно только друг с другом. Вернуть их на форму не удается, что естественно: ведь она сама что не является стыкуемой палитрой.
Чтобы позволить и кнопкам и панелям «приземляться» на форме, надо закрыть программу-пример и в Инспекторе объектов изменить для формы Form1 значение DockSite на true, а значение свойства DragKind установить равным dkDock. Теперь и кнопки и панели в процессе их перемещения можно устанавливать в любом месте формы.
Программная поддержка процесса стыковки похожа на обработку процесса перетаскивания. Однако стыкуемой палитре необходимо предварительно обработать новое событие OnGetSiteInfo. С его помощью передается информация об объекте, который хочет пристыковаться к данной палитре и его размер (прямоугольник, хранящийся в параметре InfluenceRect). Аргумент CanDock, передаваемый по ссылке, должен получить значение true, если разрешение на стыковку дается. При этом можно изменить область, отводимую для стыковки (прямоугольник InfluenceRect, который тоже передается по ссылке), например запретить панели Panel2 принимать кнопки:
Код:
Procedure TForm1.Panel2GetSiteInfo(Sender: TObject; DockClient: TControl;
	Var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
Begin
	CanDock := not (DockClient is TButton)
End;
Через параметр DockClient передается элемент управления (класс TControl), который собирается пристыковаться к панели. Перемещая кнопки по форме, их всё же можно расположить на панели Panel2. Но процесс автоподстройки их положения и размера под панель выполняться не будет. Объект Panel по прежнему сможет пристыковаться к палитре Panel2.
Два события: OnDockOver (При попытке стыковки), генерируемое при перемещении объекта над палитрой. И OnDockDrop (При завершении стыковки) – аналогичны событиям OnDragOver и OnDragDrop. Еще одно новое событие OnUnDock посылается палитре при попытке вытаскивания объекта с неё. Обрабатывая это событие, можно, например, запретить перемещать с палитры (панели Panel1) определенные элементы управления (кнопки):
Код:
Procedure TForm1.Panel1UnDock(Sender: TObject; Client: TControl;
	NewTarget: TWinControl; var Allow: Boolean);
Begin
	Allow := not (Client is TButton);
End;
Параметр Client описывает элемент управления, который пользователь пытается забрать с палитры. Параметр Allow должен получить значение True, если разрешается забрать этот элемент, и false в противном случае.

Устал набирать.

P.S. Так то Bars1992 в чем то был прав:
Цитата:
НАрод что вы изобритаете велосипед? Борланд уже давно его изобрела))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:45.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025