![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TPageControl [Win95/98, WinME, Win2k, WinXP]
kblc © (2005-09-12 23:08:00)Уважаемые мастера, подскажите пожалуйста, как правильно в 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;
Подскажите пожалуйста как это сделать?
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При этом у формы в 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 лет без нареканий :)
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