Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как можно в PageControl прятать закладки 
:(
    Опции темы
User
Дата 29.4.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



Я попробывал так. Вроде вышло.
Код

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  if PageControl1.TabIndex = 0 then
    TabSheet3.TabVisible := False;
  if PageControl1.TabIndex = 1 then
    TabSheet3.TabVisible := True;
end;

Хотелосьбы узнать. А можно сделать так что бы эти закладки можно было бы вытаскивать в отдельное окно (потащили мышью закладку, она оказаласьбы в виде отдельного окна), при этом сама закладка пропадала. А потом возвращать при закрытии формы закладка опять появлялась на том месте откуда была выдвинута.

Если можно то приведите подробные примеры. Думаю этот вопрос может заинтерисовать многих!

С уважением, Александр.
PM MAIL WWW   Вверх
Poseidon
Дата 29.4.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Ну насчат того, что бы закладка пропала, думаю понятно, в анвизибл её. А вот что бы выскакивало в отдельное окно, то я бы создавал это окно динамически и на нем же (также динамически) распологал все компоненты, каторые расположены на TabSheet.
Подробного примера нет, нужно писать. smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
<Spawn>
Дата 29.4.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Пока мне тут думается 3 варианта:

1) Создать фрейм, который размещать на вкладке TPageControl - а и в случае "отделения" закладки от компонента этот фрейм создавать в новом окне. Данный подход плох отсутствием универсальности smile

2) Создавать копии компонентов в новом окне, но тут прийдется подумать, какие свойства и события компонентов есть у всех возможных для применения данного метода, что бы не потерять функциональности. Вот простой пример, копирующий лишь Caption и позицию компонентов страницы TPageControl - а в компоненты новой формы(реализации скрытия страницы TPageControl - а не делал, т.к. это не столь большая проблема):

Код

type

  TShowControlCaption = class(TControl)
  end;

implementation

procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
  Control: TControl;
begin
  PageForm := TForm.Create(Self);

  for i := 0 to PageControl1.Pages[0].ControlCount - 1 do
  begin
    Control := TControl(PageControl1.Pages[0].Controls[i].ClassType.NewInstance);

    with TShowControlCaption(Control.Create(PageForm)) do
    begin
      Parent := PageForm;
      Left := PageControl1.Pages[0].Controls[i].Left;
      Top := PageControl1.Pages[0].Controls[i].Top;
      Width := PageControl1.Pages[0].Controls[i].Width;
      Height := PageControl1.Pages[0].Controls[i].Height;
      Caption := TShowControlCaption(PageControl1.Pages[0].Controls[i]).Caption;
    end;
  end;

  with PageForm do
  begin
    Width := PageControl1.Pages[0].Width;
    Height := PageControl1.Pages[0].Height;
  end;

  PageForm.Show;
end;


3) Скрыть страницу TPageControl - а и перенести компоненты на форму(ну и соответственно обратную операцию проделать в случае надобности). Вот пример(прошу обратить внимание на то, что менять владельца компонента нельзя из его же обработчика, т.к. это приведет к ошибке доступа к памяти(потому что RemoveComponent разоврет связь компонента с полем формы)):

Код

procedure ChangeOwner(Component, NewOwner: TComponent);
begin
  Component.Owner.RemoveComponent(Component);
  NewOwner.InsertComponent(Component);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  i: integer;
  Control: TControl;
begin
  PageForm := TForm.Create(Self);

  for i := PageControl1.Pages[0].ControlCount - 1 downto 0 do
  begin
    Control := PageControl1.Pages[0].Controls[i];
    Control.Parent := PageForm;
    ChangeOwner(Control, PageForm);
  end;

  with PageForm do
  begin
    Width := PageControl1.Pages[0].Width;
    Height := PageControl1.Pages[0].Height;
  end;

  PageForm.Show;
end;


Остается только выбрать один из этих трех методов и написать код скрытия перетаскиваемой страницы TPageControl - а


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Guest
Дата 3.5.2005, 13:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот благодаря вашим усилиям что вышло. Токо немного глючит при перетаскивании не сразу срабатывает может ктото предложет как это дароботать? smile

Для Unit1
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Label1: TLabel;
    CheckBox1: TCheckBox;
    RadioButton1: TRadioButton;
    Label2: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure PageControl1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure TabSheet1EndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  PageForm: array of TPageForm;

implementation

{$R *.dfm}

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source.ClassName='TTabSheet' then
    Accept := true;
end;

procedure TForm1.PageControl1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  if Source.ClassName='TPanel' then
    Accept := true;
end;

procedure TForm1.TabSheet1EndDrag(Sender, Target: TObject; X, Y: Integer);
var
  i: integer;
  Control: TControl;
begin
  SetLength(PageForm,Length(PageForm)+1);
  PageForm[High(PageForm)] := TPageForm.Create(Self);

  for i := (Sender as TWinControl).ControlCount - 1 downto 0 do
  begin
    Control := (Sender as TWinControl).Controls[i];
    Control.Parent := PageForm[High(PageForm)].Panel1;
  end;

  with PageForm[High(PageForm)] do
  begin
    Width := (Sender as TWinControl).Width;
    Height := (Sender as TWinControl).Height;
    Left := X;
    Top := Y;
    ts := Sender as TTabSheet;
    ts.TabVisible := false;
  end;
  PageForm[High(PageForm)].Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(PageForm,0);
end;

end.



Для Project1
Код

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {PageForm};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
//  Application.CreateForm(TPageForm, PageForm);
  Application.Run;
end.

Для Unit2
Код

unit Unit2;

interface

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

type
  TPageForm = class(TForm)
    Panel1: TPanel;
    procedure Panel1EndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    ts: TTabSheet;
    { Public declarations }
    b: boolean;
  end;

implementation

uses Unit1;

{$R *.dfm}

procedure TPageForm.Panel1EndDrag(Sender, Target: TObject; X, Y: Integer);
var
  i,j: integer;
  Control: TControl;
begin
  for i := (Sender as TWinControl).ControlCount - 1 downto 0 do
  begin
    Control := (Sender as TWinControl).Controls[i];
    Control.Parent := ts;
  end;
  ts.TabVisible := true;
  for i:= 0 to high(PageForm) do
    if PageForm[i]=self then
    begin
      for j:= i+1 to High(PageForm) do
        PageForm[j] := PageForm[j-1];
      SetLength(PageForm,Length(PageForm)-1);
      break;
    end;
  b := true;
  self.Release;
end;

procedure TPageForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i,j: integer;
  Control: TControl;
begin
  if b then
    exit;
  for i := (Sender as TWinControl).ControlCount - 1 downto 0 do
  begin
    Control := (Sender as TWinControl).Controls[i];
    Control.Parent := ts;
  end;
  ts.TabVisible := true;
  for i:= 0 to high(PageForm) do
    if PageForm[i]=self then
    begin
      for j:= i+1 to High(PageForm) do
        PageForm[j] := PageForm[j-1];
      SetLength(PageForm,Length(PageForm)-1);
      break;
    end;
  b := true;

end;

procedure TPageForm.FormCreate(Sender: TObject);
begin
  b:= false;
end;

end.

  Вверх
User
Дата 3.5.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



Полный текст программы могу выслать по почте, кто захочет помочь мне её доработать!
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.