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

Вниз

TPageControl   Найти похожие ветки 

 
kblc ©   (2005-09-12 23:08) [0]

Уважаемые мастера, подскажите пожалуйста, как правильно в TTabSheet вставить "форму", так что бы не только TLabel отрисовывались, но и другие контролы?
Я делаю так: TabSheet.InsertControl(Form2);, но всё что отображается - это TLabel; А при помощи Dock() и ManualDock() вообще ничего не отображается.

И вот так не работает:

   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;
, где pc_Top = TPageControl, а Control = TWinControl
Подскажите пожалуйста как это сделать?


 
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
 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;
При этом у формы в design-time FormStyle должен быть fsNormal.

Такая конструкция используется нами уже 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.053 c
1-1126636918
TStas
2005-09-13 22:41
2005.10.02
Перехват сообщения


3-1124265195
IncRe
2005-08-17 11:53
2005.10.02
Создание таблицы через хранимую процедуру


4-1123500581
Reket
2005-08-08 15:29
2005.10.02
Программа которая не удаляется из списка задач


2-1124862090
Chaser
2005-08-24 09:41
2005.10.02
Не выполняются строки кода


14-1126120007
Карелин Артем
2005-09-07 23:06
2005.10.02
Интернет и компьютер делает нас неграмотными?