Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизВозможно ли создать два фрейма? Найти похожие ветки
← →
Ханунад (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.085 c