Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TPageControl [Win95/98, WinME, Win2k, WinXP]


Страницы:   1 2

kblc ©   (2005-09-12 23:08:00) 

Уважаемые мастера, подскажите пожалуйста, как правильно в 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
Подскажите пожалуйста как это сделать?


Vardoulacha   (2005-09-14 12:08:00) [1]

Если я правильно тебя понял то у меня была такая же проблему я ее решил вот так:

Решил проблему созданием 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.


и все работает отлично как я и хотел сделать (а на фрейм можно накидать чего угодно и даже на кнопки навешать какие-либо реакции)


kblc   (2005-09-13 14:49:00) [2]

Ну хоть кто-нибудь, подкиньте идею.... ?!


kblc   (2005-09-13 14:29:00) [3]

Ком сервер - главная форма. На ней лежит TPageControl . Другая программа пытается разместить на этом TPageControl свой фрейм при помощи функции Интерфейс.DockTop() .

 Интерфейс.DockTop() ссылается на ГлавнаяФорма.DockTop().

 Вот. И у меня это не получвется :(


msguns   (2005-09-13 14:19:00) [4]

Все же так и не понял я ;(
У тебя одно приложение хочет показать в своем окне кусок (одно из окон или фрагмент окна-фрэйм) другого приложения ?
Поясни четче, что у тебя подразумевается под термином "ком-сервер", а что под "Клиент".


kblc   (2005-09-13 13:53:00) [5]

неужели нет того, кто смог бы мне помочь?


kblc   (2005-09-13 12:52:00) [6]

Люди, может всё-таки подскажете ?


kblc   (2005-09-13 12:40:00) [7]

Конечно можно к интерфейсу добавить ещё один метод, скажем PageControl: TWinControl; и уже от него создавать форму, но это уж точно не спортивно :(
Может я что-то не так делаю?


kblc   (2005-09-13 12:20:00) [8]

Вот весь код:
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;


Игорь Шевченко   (2005-09-13 12:17:00) [9]

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 лет без нареканий :)


msguns   (2005-09-13 12:12:00) [10]

Что такое Control ?
Ты можешь привести полный код DockTop


kblc   (2005-09-13 12:11:00) [11]

Я не могу создавать форму(фрейм) от какого-либо контрола, ведь эти контролы находятся в другом приложении(!!!) (сервере).
 Как теперь быть?


msguns   (2005-09-13 12:08:00) [12]

Игорь, ты не совсем прав. Я именно это фрагмент использовал как пособие, когда пытался создать класс, который в ране мог создавать себя как мдичилдовую или как нормальную форму в зависимости от заданного условия. Получилось вроде бы ничего, но форма упорно не признавала клиентской мди-области, позволяя таскать себя по всему экрану. Кроме того, были и еще глюки, например, при получении фокуса, форма отказывалась красить свой кэпшн в активный цвет и пр.
В общем, Тексейра с Пачеком подсказали тропинку, но оставили простор для творчества смелым и умелым. Я, к сожалению, к таковым не относился ;(


kblc   (2005-09-13 12:02:00) [13]

Опишу ситуацию:

 Есть ком сервер. К нему подключается клиент.

 У клиента есть фрейм(форма) которая должна быть размещена в 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;

 Результата никакого(!)


Игорь Шевченко   (2005-09-13 11:57:00) [14]

Для того, чтобы форма могда размещаться на 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'е, другой форме и т.п.


msguns   (2005-09-13 11:55:00) [15]

>kblc ©   (13.09.05 11:39) [21]
>Мой код отличается тем, что возможно только TfraMoveDetail.Create(nil);
И всё равно ничего не получается :(

Сам фрйэм как создан ? В дизайне ?
Приведи код, где создаешь новый экземляр сконструированного в дизайнефрэйма и кладешь его на винконтрол.


kblc   (2005-09-13 11:47:00) [16]

Может это сделать как-нибудь при помощи Dock?


kblc   (2005-09-13 11:39:00) [17]

Мой код отличается тем, что возможно только TfraMoveDetail.Create( nil);
И всё равно ничего не получается :(


msguns   (2005-09-13 11:35:00) [18]

TFraMoveDetail - это класс, описывающий мой фрэйм, созданный и добавленный юнитом в дизайне.


msguns   (2005-09-13 11:33:00) [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;


kblc   (2005-09-13 11:31:00) [20]

Почему этот код не помог мне, ведь сейчас уже используется TFrame


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо