Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.004 c
1-1126642341
The Only
2005-09-14 00:12
2005.10.02
обработка ctrl-s главной mdi формой


1-1125926628
Mishenka
2005-09-05 17:23
2005.10.02
Копирование текста в Clipboard


1-1126524266
lauren
2005-09-12 15:24
2005.10.02
forms


1-1126187600
Maverick
2005-09-08 17:53
2005.10.02
Вызов немодальной формы из DLL.


1-1126025257
ДимДимыч
2005-09-06 20:47
2005.10.02
Аналог TActionList с дополнениями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский