TcxTabControl удаление

wsnet
Дата: 28.11.2019 10:43:25
Имеется форма, на ней TcxTabControl, далее на вкладке кнопка удаления этой вкладки.

Код удаление на кнопке pgControl.ActivePage.Free; вызывает исключение, как добиться удаление вкладки по кнопке на этой вкладке, что-то я торможу.
Polesov
Дата: 28.11.2019 11:42:51
Привет.

wsnet
Код удаление на кнопке pgControl.ActivePage.Free; вызывает исключение

  pgControl.Properties.Tabs.Delete( pgControl.Properties.TabIndex ); 


С уважением, Polesov.
wsnet
Дата: 28.11.2019 13:18:25
Polesov,

Cannot access protected symbol TcxCustomTabControlProperties.Tabs
Polesov
Дата: 28.11.2019 13:38:56
wsnet
Polesov,

Cannot access protected symbol TcxCustomTabControlProperties.Tabs


Странно. А какая версия DevEx? Я проверял на 16.2.6.
Polesov
Дата: 28.11.2019 13:41:54
wsnet
Имеется форма, на ней TcxTabControl ...
Код удаление на кнопке pgControl.ActivePage.Free;

А компонент точно TcxTabControl? У него нет public/published свойства ActivePage.
Может быть, TcxPageControl?
wsnet
Дата: 28.11.2019 13:47:35
Polesov
wsnet
Имеется форма, на ней TcxTabControl ...
Код удаление на кнопке pgControl.ActivePage.Free;

А компонент точно TcxTabControl? У него нет public/published свойства ActivePage.
Может быть, TcxPageControl?


Сори, конечно TcxPageControl
Polesov
Дата: 28.11.2019 14:17:33
wsnet
Сори, конечно TcxPageControl

У меня отработало корректно
pgControl.ActivePage.Free;

Под спойлером тестовая DFM (Delphi XE7)
+
object Form11: TForm11
Left = 0
Top = 0
Caption = 'Form11'
ClientHeight = 198
ClientWidth = 383
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object pgControl: TcxPageControl
Left = 0
Top = 0
Width = 383
Height = 198
Align = alClient
TabOrder = 0
Properties.ActivePage = cxTabSheet2
Properties.CustomButtons.Buttons = <>
ClientRectBottom = 198
ClientRectRight = 383
ClientRectTop = 24
object cxTabSheet1: TcxTabSheet
Caption = 'cxTabSheet1'
ImageIndex = 0
end
object cxTabSheet2: TcxTabSheet
Caption = 'cxTabSheet2'
ImageIndex = 1
object Button1: TButton
Left = 128
Top = 48
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
object cxTabSheet3: TcxTabSheet
Caption = 'cxTabSheet3'
ImageIndex = 2
end
end
end

А что еще, кроме кнопки, на удаляемом TcxTabSheet находится?
wsnet
Дата: 28.11.2019 15:18:49
Polesov
wsnet
Сори, конечно TcxPageControl

У меня отработало корректно
pgControl.ActivePage.Free;

Под спойлером тестовая DFM (Delphi XE7)
+
object Form11: TForm11
Left = 0
Top = 0
Caption = 'Form11'
ClientHeight = 198
ClientWidth = 383
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object pgControl: TcxPageControl
Left = 0
Top = 0
Width = 383
Height = 198
Align = alClient
TabOrder = 0
Properties.ActivePage = cxTabSheet2
Properties.CustomButtons.Buttons = <>
ClientRectBottom = 198
ClientRectRight = 383
ClientRectTop = 24
object cxTabSheet1: TcxTabSheet
Caption = 'cxTabSheet1'
ImageIndex = 0
end
object cxTabSheet2: TcxTabSheet
Caption = 'cxTabSheet2'
ImageIndex = 1
object Button1: TButton
Left = 128
Top = 48
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
object cxTabSheet3: TcxTabSheet
Caption = 'cxTabSheet3'
ImageIndex = 2
end
end
end

А что еще, кроме кнопки, на удаляемом TcxTabSheet находится?



Находится TFrame, на TFrame кнопка удаления лежит, ну и TFrame на TabSheet, который и удаляем!
Polesov
Дата: 28.11.2019 16:00:01
wsnet
Находится TFrame, на TFrame кнопка удаления лежит, ну и TFrame на TabSheet, который и удаляем!

У меня отработало корректно. Под спойлером исходники теста:
+

program Project6;

uses
Vcl.Forms,
Unit11 in 'Unit11.pas' {Form11},
Unit12 in 'Unit12.pas' {Frame12: TFrame};

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm11, Form11);
Application.Run;
end.
//////////////////////////////////////
unit Unit11;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, dxSkinsCore, dxSkinOffice2010Blue,
dxSkinscxPCPainter, dxBarBuiltInMenu, cxPC,
Unit12;

type
TForm11 = class(TForm)
pgControl: TcxPageControl;
cxTabSheet1: TcxTabSheet;
cxTabSheet2: TcxTabSheet;
cxTabSheet3: TcxTabSheet;
Frame121: TFrame12;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form11: TForm11;

implementation

{$R *.dfm}

end.
//////////////////////////////////////
object Form11: TForm11
Left = 0
Top = 0
Caption = 'Form11'
ClientHeight = 299
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object pgControl: TcxPageControl
Left = 0
Top = 0
Width = 635
Height = 299
Align = alClient
TabOrder = 0
Properties.ActivePage = cxTabSheet2
Properties.CustomButtons.Buttons = <>
ClientRectBottom = 299
ClientRectRight = 635
ClientRectTop = 24
object cxTabSheet1: TcxTabSheet
Caption = 'cxTabSheet1'
ImageIndex = 0
end
object cxTabSheet2: TcxTabSheet
Caption = 'cxTabSheet2'
ImageIndex = 1
inline Frame121: TFrame12
Left = 0
Top = 0
Width = 635
Height = 275
Align = alClient
TabOrder = 0
inherited Button1: TButton
Left = 32
Top = 48
end
end
end
object cxTabSheet3: TcxTabSheet
Caption = 'cxTabSheet3'
ImageIndex = 2
end
end
end
//////////////////////////////////////
unit Unit12;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, dxSkinsCore, dxSkinOffice2010Blue,
dxSkinscxPCPainter, dxBarBuiltInMenu, cxPC;

type
TFrame12 = class(TFrame)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

implementation

{$R *.dfm}

procedure TFrame12.Button1Click(Sender: TObject);
var
c : TComponent;
begin
with GetParentForm( Self ) do
begin
c := FindComponent( 'pgControl' );
if Assigned( c ) then
if c is TcxPageControl then
TcxPageControl( c ).ActivePage.Free;
end;
end;

end.
//////////////////////////////////////
object Frame12: TFrame12
Left = 0
Top = 0
Width = 320
Height = 240
TabOrder = 0
object Button1: TButton
Left = 112
Top = 104
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end

Кнопка лежит на фрейме, фрейм в отдельном модуле.
А как в обработчике нажатия кнопки определяется компонент pgControl?
ma1tus
Дата: 28.11.2019 16:04:28
wsnet,

+ PostMessage - не достаточно надёжно ?
  protected
    procedure WMClosePage(var AMsg: TMessage); message WM_CLOSETAB; // WM_USER + 1;

implementation

procedure TForm1.WMClosePage(var AMsg: TMessage);
begin
  cxPageControl1.CloseTab(Integer(AMsg.WParam));
end;

procedure TForm1.cxButton1Click(Sender: TObject);
begin
  PostMessage(Handle, WM_CLOSETAB, WParam(cxPageControl1.ActivePage.TabIndex), 0);
end;