Главная страница
    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.067 c
2-1334647596
ChainikDenis
2012-04-17 11:26
2013.03.22
TreeView и база данных


2-1342612652
AV
2012-07-18 15:57
2013.03.22
Как бы мне попасть линией от начала до текущей позиции TrackBar


2-1332225008
ixen
2012-03-20 10:30
2013.03.22
Обращение из потока


3-1287589173
Grom
2010-10-20 19:39
2013.03.22
БД+КЛиент-сервер(сокеты) DELPHI


2-1333615730
Yl2011
2012-04-05 12:48
2013.03.22
Использование TCanvas для определения размера шрифта





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