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

Вниз

Возможно ли создать два фрейма?   Найти похожие ветки 

 
Ханунад   (2012-06-25 17:28) [0]

есть один фрейм Frame1: TFrame
Возможно ли каким либо способом (пусть даже хакерским) создать на разных пейджах (TTabSheet) этот фрейм?
XE Win7


 
Плохиш ©   (2012-06-25 17:36) [1]

Фрейм нельзя, экземпляры можно.


 
Омлет ©   (2012-06-25 17:36) [2]

Возможно. Стандартным способом.


 
Дмитрий С ©   (2012-06-25 18:06) [3]

Меняй парента у фрейма при смене активного таба


 
картман ©   (2012-06-25 18:14) [4]


> Дмитрий С ©   (25.06.12 18:06) [3]

 object tbc1: TTabControl
   Left = 72
   Top = 64
   Width = 289
   Height = 193
   TabOrder = 0
   Tabs.Strings = (
     "qwe"
     "asdf"
     "sadf")
   TabIndex = 0
   OnChange = tbc1Change
 end


 
Ханунад   (2012-06-26 01:29) [5]

Странные ответы. Всмысле разные.
Попробую подробнее.

Существующие ограничения:
Не удаляя первый фрейм, не меняя парента.
Я получаю (при создании второго экземпляра) ошибку, что фрейм с таким именем уже существует.

Тестовый проект:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, Unit2;

type
 TForm1 = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   procedure FormCreate(Sender: TObject);
   procedure PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
   Frame1: TMyFrame;
   Frame2: TMyFrame;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 PageControl1.ActivePageIndex := 0;
end;

procedure TForm1.PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
begin
 if PageControl1.ActivePageIndex = 0 then begin
   if not Assigned(Frame1) then begin
     Frame1 := TMyFrame.Create(TabSheet1);
     Frame1.Parent := TabSheet1;
   end;
   Frame1.setLabelCaption("Frame1");
 end;
 if PageControl1.ActivePageIndex = 1 then begin
   if not Assigned(Frame2) then begin
     Frame2 := TMyFrame.Create(TabSheet1);
     Frame2.Parent := TabSheet1;
   end;
   Frame2.setLabelCaption("Frame2");
 end;
end;

end.


=====================

unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TMyFrame = class(TFrame)
   Label1: TLabel;
 private
   { Private declarations }
 public
   procedure setLabelCaption(const Value: string);
   { Public declarations }
 end;

implementation

{$R *.dfm}

procedure TMyFrame.setLabelCaption(const Value: string);
begin
 Label1.Caption := Value;
end;


 
Ханунад   (2012-06-26 01:31) [6]

Сорри.
Нашел косяк, в тесте.
Исправил - работает.

Хм... Значит у меня там косяк...

Еще раз сории за беспокойство.


 
Дмитрий С ©   (2012-06-26 01:42) [7]

На самом деле такой "глюк" бывает. Присваивай полю Name пустую строку после создания фрейма.

Frame1 := TMyFrame.Create(TabSheet1);
Frame1.Name := "";


 
Ханунад   (2012-06-26 01:59) [8]

Нет, Дмитрий, косяк в другом. Я разобрался. И предложенный вами вариант, конечно же рассматривался.

Решение проще некуда. Owner при создании должен быть разный, т.е. разные компоненты владельцы. А вот в одном контейнере-владельце два фрейма уже сделать ай-йа-йа-йа-й.
Короче, нельзя создать два фрейма на форме указав им при создании
TMyFrame.Create(MyForm);
Но можно
Frame1 := TMyFrame.Create(MyForm);
затем создаем панель на форме (MyPanel) и
Frame2 := TMyFrame.Create(MyPanel);
А парента можно назначить любого, хоть обоим MyForm.


 
Дмитрий С ©   (2012-06-26 02:14) [9]

Ты так на всех овнеров не напасешься :)

Правильнее так:

Frame1 := TMyFrame.Create(Self);
Frame1.Name := "";

Frame2 := TMyFrame.Create(Self);
Frame2.Name := "";

Self, конечно, можешь заменить на что-нибудь другое.

Либо стереть свойство TMyFrame.Name в дизайнере (не помню позволяет ли он это делать).

К тому же приведенный твой пример тоже может не работать.


 
картман ©   (2012-06-26 02:42) [10]


> Ты так на всех овнеров не напасешься :)
>

nil
))


 
Ханунад   (2012-06-26 02:48) [11]


> Дмитрий С ©   (26.06.12 02:14) [9]
> Правильнее так:

В предложенных условиях правильнее так:
Frame1 := TMyFrame.Create(TabSheet1);
Frame1.Parent := TabSheet1;
Frame2 := TMyFrame.Create(TabSheet2);
Frame2.Parent := TabSheet2;


;)


 
Inovet ©   (2012-06-26 02:58) [12]

> [11] Ханунад   (26.06.12 02:48)
> Frame1 := TMyFrame.Create(TabSheet1);
> Frame1.Parent := TabSheet1;

Зачем Parent присваиваешь ещё раз.


 
Ханунад   (2012-06-26 03:03) [13]


> Inovet ©   (26.06.12 02:58) [12]
> Зачем Parent присваиваешь ещё раз.

А вы когда кнопку создаете, тоже считаете, что TButton.Create(Form) достаточно?


 
Inovet ©   (2012-06-26 03:13) [14]

> [13] Ханунад   (26.06.12 03:03)
> А вы когда кнопку создаете, тоже считаете, что TButton.Create(Form) достаточно?

А справку читать попробовать?

All objects have a Create method that constructs the object. TComponent redefines Create so that, for components, Create also:

Establishes the relationship of a component and its Owner, as indicated by the AOwner parameter.
Sets the ComponentStyle property to csInheritable, meaning that the component can be inherited by a descendent form type.


 
Ханунад   (2012-06-26 03:14) [15]

И о чем здесь?


 
Inovet ©   (2012-06-26 03:39) [16]

> [15] Ханунад   (26.06.12 03:14)

Всё верно, сплю.


 
Дмитрий С ©   (2012-06-26 03:59) [17]

Когда тебе захочется бросить два фрейма на один таб или перечислить все компоненты формы ты меня вспомнишь :)



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
15-1346925778
LDV
2012-09-06 14:02
2013.03.22
bat-файлы


2-1343048239
DevilDevil
2012-07-23 16:57
2013.03.22
Очередь потоков


2-1346669848
Phoenix_
2012-09-03 14:57
2013.03.22
что будет быстрее


15-1329643520
AV
2012-02-19 13:25
2013.03.22
Посоветуйте что-нибудь, компонент не хочет работать в службе..


15-1336738041
alexdn
2012-05-11 16:07
2013.03.22
Лицензии