Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.075 c
3-1282759487
newman
2010-08-25 22:04
2013.03.22
Выборка данных в зависимости от пользователя MS SQL


4-1262850914
Dy1
2010-01-07 10:55
2013.03.22
получение html-страницы post-запросом


15-1334662086
xayam
2012-04-17 15:28
2013.03.22
Преобразование RGB в оттенки серого (схема)


15-1331641742
Kerk
2012-03-13 16:29
2013.03.22
Про профессию


15-1344231937
картман
2012-08-06 09:45
2013.03.22
извините, пожалуйста, забыл





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский