Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];
ВнизTPageControl Найти похожие ветки
← →
kblc © (2005-09-12 23:08) [0]Уважаемые мастера, подскажите пожалуйста, как правильно в TTabSheet вставить "форму", так что бы не только TLabel отрисовывались, но и другие контролы?
Я делаю так:TabSheet.InsertControl(Form2);
, но всё что отображается - это TLabel; А при помощи Dock() и ManualDock() вообще ничего не отображается.
И вот так не работает:, где pc_Top = TPageControl, а Control = TWinControl
Sheet:=TTabSheet.Create(pc_Top);
Sheet.Visible:=TRUE;
Sheet.Caption:=TForm(Control).Caption;
Sheet.PageControl:=pc_Top;
Control.Parent:=Sheet;
Control.Visible:=TRUE;
Control.Left:=0;
Control.Top:=0;
Подскажите пожалуйста как это сделать?
← →
kblc © (2005-09-12 23:24) [1]Удалено модератором
← →
kblc © (2005-09-13 08:48) [2]Удалено модератором
← →
Наиль © (2005-09-13 08:53) [3]Если тебе удастся проделать этот фокус, то на ТабЧит ты увидишь всю форму вместе с крестиком в углу. Лучше помести на форму панель, а всё остальное на панель. Потом можешь переместить панель на ТабЧит.
← →
kblc © (2005-09-13 08:56) [4]Я же говорю, у меня и это то не получается...
Почему? Что я делаю не так?
← →
Наиль © (2005-09-13 09:11) [5]Кроме
Sheet.Caption:=TForm(Control).Caption;
всё выглядит правильно (Control должен быть TForm, а не TWinControl).
Но подойдём к вопросу с другого конца.
Form2 известно в DisignTime. Что мешает поместить его содержимое в PageControl в процессе разработки?
← →
msguns © (2005-09-13 09:16) [6]>Наиль © (13.09.05 08:53) [3]
>Если тебе удастся проделать этот фокус
Не удастся
← →
begin...end © (2005-09-13 09:23) [7]> msguns © (13.09.05 09:16) [6]
Удастся.
← →
kblc © (2005-09-13 09:28) [8]Если удастся, то КАК???
← →
begin...end © (2005-09-13 09:33) [9]Form.Parent := PageControl.Pages[...]
← →
msguns © (2005-09-13 09:34) [10]>begin...end © (13.09.05 09:23) [7]
>Удастся.
Каким образом, поясни, если не в лом. Имеется в виду не отрисовка панели в виде формы, а именно форма, "засунутая" в табшит (у которой owner и parent является табшит и, кроме того, форма "таскается" со всем пайджконтролом при перетаскивании основной формы, пропадает при переключении на другой шит и т.д.)
← →
begin...end © (2005-09-13 09:37) [11]> msguns © (13.09.05 09:34) [10]
См. [9]. А Owner"а-то зачем трогать?
← →
kblc © (2005-09-13 09:40) [12]Form.Parent := PageControl.Pages[PageControl.PageCount-1]
не помогло. Форма всё так же не видна(!)
И ещё, меня не интересует впринципе вся форма, меня интересуют как вставить туда все контролы с формы!
← →
begin...end © (2005-09-13 09:41) [13]> kblc © (13.09.05 09:40) [12]
> Форма всё так же не видна(!)
А у неё Visible = True? Если нет, то Form.Show надо добавить.
← →
msguns © (2005-09-13 09:56) [14]>kblc © (13.09.05 09:40) [12]
>И ещё, меня не интересует впринципе вся форма, меня интересуют как вставить туда все контролы с формы!
Используй фрэйм, на который положи все контролы, а сам фрэйм клади то ли на форму, то ли на табшит
← →
kblc © (2005-09-13 11:07) [15]begin...end © (13.09.05 09:41) [13]
> А у неё Visible = True? Если нет, то Form.Show надо добавить.
В коде выше я делал так Control.Visible:=TRUE; Но и Form.Show не помогло.
msguns © (13.09.05 09:56) [14]
> Используй фрэйм, на который положи все контролы, а сам фрэйм клади то ли на форму, то ли на табшит
Это поможет? Переделывать всё с формы на Frame - не спортивно. Можно ли тогда в рантайме на фрейм накидать все контролы с формы (и теме же обработчиками) ???
← →
kblc © (2005-09-13 11:25) [16]Сейчас закинул все контролы на
TFrame
. Не помогло. Я бы сказал так: ничего не видно!
← →
msguns © (2005-09-13 11:30) [17]"Накидать" в рантайме можно что угодно и куда угодно. Но это весьма геморно, т.к. созданным динамически контролам надо будет определять кучу свойств и событий, чтобы смотрелось все красиво и ровно. Фрэймы и служат для того, чтобы все красивости делать визуально в дизайне, а в ране просто создавать новый экземляр контейнера-фрэйма (блока красиво смонтированных контролов) и совать его куда следует (на фоорму, шит, панель или куда еще надо), используя св-во Parent.
Подобным образом прикольно штамповать однотипные блоки контролов в случаях, когда число этих ьлоков произвольно (как, например, в случае с тем же пэйджконтролом, содержащим энное количество однотипных шитов).
← →
kblc © (2005-09-13 11:31) [18]Почему этот код не помог мне, ведь сейчас уже используется
TFrame
← →
msguns © (2005-09-13 11:33) [19]Пример динамического создания фрэйма с "забросом" его на указанный вх.параметром шит):
procedure TfrmFondMove.CreateMovePanel(var Prnt: TTabSheet; MR: PRecMoveInOut);
var
fr: TfraMoveDetail;
begin
fr := TfraMoveDetail.Create(Prnt);
fr.Parent := Prnt;
Prnt.Caption := DateToStr(MR.MVDate);
end;
← →
msguns © (2005-09-13 11:35) [20]TFraMoveDetail - это класс, описывающий мой фрэйм, созданный и добавленный юнитом в дизайне.
← →
kblc © (2005-09-13 11:39) [21]Мой код отличается тем, что возможно только
TfraMoveDetail.Create(nil);
И всё равно ничего не получается :(
← →
kblc © (2005-09-13 11:47) [22]Может это сделать как-нибудь при помощи Dock?
← →
msguns © (2005-09-13 11:55) [23]>kblc © (13.09.05 11:39) [21]
>Мой код отличается тем, что возможно только TfraMoveDetail.Create(nil);
И всё равно ничего не получается :(
Сам фрйэм как создан ? В дизайне ?
Приведи код, где создаешь новый экземляр сконструированного в дизайне фрэйма и кладешь его на винконтрол.
← →
Игорь Шевченко © (2005-09-13 11:57) [24]Для того, чтобы форма могда размещаться на TabSheet (да и любом другом контроле), она должна быть дочерним окном.
Довольно удобный вариант предложили Тейксейра и Пачеко, в следующем классе формы:{
Модуль: Child
Описание: Базовый класс для форм, которые могут отображаться как независимые
модальные или немодальные формы, а также быть дочерними окнами
в любом другом окне.
Авторы: Стив Тейксейра, Ксавье Пачеко (Delphi 5 Руководство разработчика,
том 1, стр. 170).
Дата создания: 16.12.2002
История изменений:
}
unit Child;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs;
type
TfAbstractChild = class(TForm)
private
FAsChild: Boolean;
FTempParent: TWinControl;
protected
procedure CreateParams (var Params: TCreateParams); override;
procedure Loaded; override;
public
constructor Create (AOwner: TComponent); overload; override;
constructor Create (AOwner: TComponent; AParent: TWinControl);
reintroduce; overload;
end;
implementation
{$R *.dfm}
constructor TfAbstractChild.Create (AOwner: TComponent);
begin
FAsChild := false;
inherited;
end;
constructor TfAbstractChild.Create (AOwner: TComponent; AParent: TWinControl);
begin
FAsChild := true;
FTempParent := AParent;
inherited Create (AOwner);
end;
procedure TfAbstractChild.CreateParams (var Params: TCreateParams);
begin
inherited;
if FAsChild then
Params.Style := Params.Style or WS_CHILD;
end;
procedure TfAbstractChild.Loaded;
begin
inherited;
if FAsChild then begin
Align := alClient;
BorderStyle := bsNone;
BorderIcons := [];
Parent := FTempParent;
Position := poDefault;
end;
end;
Наследуясь от этой формы и вызывая конструктор Create с двумя параметрами (Owner и Parent) форму можно располагать на любом приемлемом контроле - панели, TabSheet"е, другой форме и т.п.
← →
kblc © (2005-09-13 12:02) [25]Опишу ситуацию:
Есть ком сервер. К нему подключается клиент.
У клиента есть фрейм(форма) которая должна быть размещена в TPageControl"e окна сервера.
Я делаю так:
В клиенте:fr:=Tfr.Create(nil);
try
Server.DockTop(fr);
except
end;
В сервере:Sheet:=TTabSheet.Create(pc_Top);
Sheet.Visible:=TRUE;
Sheet.Caption:=Control.Hint;
Sheet.PageControl:=pc_Top;
Control.Parent:=Sheet;
Control.Visible:=TRUE;
Control.Left:=0;
Control.Top:=0;
Результата никакого(!)
← →
msguns © (2005-09-13 12:08) [26]Игорь, ты не совсем прав. Я именно это фрагмент использовал как пособие, когда пытался создать класс, который в ране мог создавать себя как мдичилдовую или как нормальную форму в зависимости от заданного условия. Получилось вроде бы ничего, но форма упорно не признавала клиентской мди-области, позволяя таскать себя по всему экрану. Кроме того, были и еще глюки, например, при получении фокуса, форма отказывалась красить свой кэпшн в активный цвет и пр.
В общем, Тексейра с Пачеком подсказали тропинку, но оставили простор для творчества смелым и умелым. Я, к сожалению, к таковым не относился ;(
← →
kblc © (2005-09-13 12:11) [27]Я не могу создавать форму(фрейм) от какого-либо контрола, ведь эти контролы находятся в другом приложении(!!!) (сервере).
Как теперь быть?
← →
msguns © (2005-09-13 12:12) [28]Что такое Control ?
Ты можешь привести полный код DockTop
← →
Игорь Шевченко © (2005-09-13 12:17) [29]msguns © (13.09.05 12:08) [26]
> Я именно это фрагмент использовал как пособие, когда пытался
> создать класс, который в ране мог создавать себя как мдичилдовую
> или как нормальную форму в зависимости от заданного условия
И зря ты его использовал, это совсем для другого случая.
В твоем случае помог бы следующий код:type
При этом у формы в design-time FormStyle должен быть fsNormal.
TMyForm = class(TForm)
.....
public
constructor Create(AOwner: TComponent);
constructor CreateModal(AOwner: TComponent);
end;
constructor TMyForm.Create(AOwner: TComponent);
begin
inherited;
FormStyle := fsMDIChild;
end;
constructor TMyForm.CreateModal(AOwner: TComponent);
begin
inherited Create (AOwner);
end;
Такая конструкция используется нами уже 6 лет без нареканий :)
← →
kblc © (2005-09-13 12:20) [30]Вот весь код:
type
TfmMainForm = class(TForm)
...
pc_Top: TPageControl;
...
end;
...
procedure TfmMainForm.DockDrop(const Control: TWinControl; Align: TAlign);
var
i: Integer;
Sheet: TTabSheet;
IsHere: BOOLEAN;
begin
IsHere:=FALSE;
if pc_Top.PageCount>0 then
for i:=0 to pc_Top.PageCount-1 do
if pc_Top.Pages[i].Caption = Control.Hint then
begin
pc_Top.ActivePage:=pc_Top.Pages[i];
IsHere:=TRUE;
break;
end;
if not IsHere then
begin
Sheet:=TTabSheet.Create(pc_Top);
try
Sheet.Visible:=TRUE;
Sheet.Caption:=Control.Hint;
Sheet.PageControl:=pc_Top;
Control.Parent:=Sheet;
Control.Visible:=TRUE;
Control.Left:=0;
Control.Top:=0;
except
Sheet.Free;
end;
end;
end;
← →
kblc © (2005-09-13 12:40) [31]Конечно можно к интерфейсу добавить ещё один метод, скажем PageControl: TWinControl; и уже от него создавать форму, но это уж точно не спортивно :(
Может я что-то не так делаю?
← →
kblc © (2005-09-13 12:52) [32]Люди, может всё-таки подскажете ?
← →
kblc © (2005-09-13 13:53) [33]неужели нет того, кто смог бы мне помочь?
← →
msguns © (2005-09-13 14:19) [34]Все же так и не понял я ;(
У тебя одно приложение хочет показать в своем окне кусок (одно из окон или фрагмент окна-фрэйм) другого приложения ?
Поясни четче, что у тебя подразумевается под термином "ком-сервер", а что под "Клиент".
← →
kblc © (2005-09-13 14:29) [35]Ком сервер - главная форма. На ней лежит TPageControl . Другая программа пытается разместить на этом TPageControl свой фрейм при помощи функции Интерфейс.DockTop() .
Интерфейс.DockTop() ссылается на ГлавнаяФорма.DockTop().
Вот. И у меня это не получвется :(
← →
kblc © (2005-09-13 14:49) [36]Ну хоть кто-нибудь, подкиньте идею.... ?!
← →
Vardoulacha (2005-09-14 12:08) [37]Если я правильно тебя понял то у меня была такая же проблему я ее решил вот так:
Решил проблему созданием Frame"а и внедрением его с помощью этой процедуры:
unit Unit1;
interface
uses
..., Unit2;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i: Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
TabSheet: TTabSheet;
Frame: TFrame2;
begin
TabSheet:=TTabSheet.Create(Self);
TabSheet.PageControl:=PageControl1;
Frame:=TFrame2.Create(Self);
Frame.Name:="Fr"+IntToStr(i);
TabSheet.InsertControl(Frame);
TabSheet.Caption:="Пустое окно - "+Frame.Name;
inc(i);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=1;
end;
end.
и все работает отлично как я и хотел сделать (а на фрейм можно накидать чего угодно и даже на кнопки навешать какие-либо реакции)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c