powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TcxTabControl удаление
23 сообщений из 23, страница 1 из 1
TcxTabControl удаление
    #39895421
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется форма, на ней TcxTabControl, далее на вкладке кнопка удаления этой вкладки.

Код удаление на кнопке pgControl.ActivePage.Free; вызывает исключение, как добиться удаление вкладки по кнопке на этой вкладке, что-то я торможу.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895468
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

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

Код: pascal
1.
  pgControl.Properties.Tabs.Delete( pgControl.Properties.TabIndex ); 



С уважением, Polesov.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895553
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

Cannot access protected symbol TcxCustomTabControlProperties.Tabs
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895582
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Polesov,

Cannot access protected symbol TcxCustomTabControlProperties.Tabs


Странно. А какая версия DevEx? Я проверял на 16.2.6.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895586
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Имеется форма, на ней TcxTabControl ...
Код удаление на кнопке pgControl.ActivePage .Free;

А компонент точно TcxTabControl ? У него нет public/published свойства ActivePage .
Может быть, TcxPageControl ?
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895592
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
wsnet
Имеется форма, на ней TcxTabControl ...
Код удаление на кнопке pgControl.ActivePage .Free;

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


Сори, конечно TcxPageControl
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895627
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Сори, конечно TcxPageControl

У меня отработало корректно
Код: pascal
1.
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 находится?
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895707
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
wsnet
Сори, конечно TcxPageControl

У меня отработало корректно
Код: pascal
1.
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, который и удаляем!
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895758
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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?
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895766
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

PostMessage - не достаточно надёжно ?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  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;

...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895769
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Находится TFrame, на TFrame кнопка удаления лежит, ну и TFrame на TabSheet, который и удаляем!
Писец архитектура! Используй постпонед мессагу. На коленке:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
uses
  dxThreading;
.....
procedure TForm1.ButtonClick
begin
  procedure TdxUIThreadSyncService.EnqueueInvokeInUIThread(Self,
     procedure ()
     begin
       cxTabSheet2.Free;
     end);
end;
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895852
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
type
  TfrmItem = class(TFrame)
    UniQuery1: TUniQuery;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutGroup1: TdxLayoutGroup;
    edtName: TcxTextEdit;
    dxLayoutItem1: TdxLayoutItem;
    edtBirthDate: TcxDateEdit;
    dxLayoutItem2: TdxLayoutItem;
    edtSex: TcxComboBox;
    dxLayoutItem3: TdxLayoutItem;
    edtPhone: TcxTextEdit;
    dxLayoutItem4: TdxLayoutItem;
    edtWorkPlace: TcxTextEdit;
    dxLayoutItem5: TdxLayoutItem;
    dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList;
    dxLayoutCxLookAndFeel1: TdxLayoutCxLookAndFeel;
    cxButton1: TcxButton;
    dxLayoutItem6: TdxLayoutItem;
    btnSave: TcxButton;

class procedure TfrmItem.Modify(ATabSheet: TcxTabSheet; APerson: TPerson);
begin
  with TfrmItem.Create(ATabSheet) do
  begin
    Parent := ATabSheet;
    EditItem := APerson;
    Fill;
    Align := alClient;
  end;
end;
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895854
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
На обработчик получаю AV. Что не так?
procedure TfrmItem.btnSaveClick(Sender: TObject);
var
  c: TComponent;
begin
  with GetParentForm(Self) do
  begin
    c := FindComponent('pgControl');
    if Assigned(c) then
      if c is TcxPageControl then
      //  ShowMessage(IntToStr(TcxPageControl(c).ActivePageIndex));
     TcxPageControl(c).ActivePage.Free;
  end;
end;



Сам вызов:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
procedure TfrmMain.CreatePage(APerson: TPerson);
var
  I: Integer;
  ATag: Integer;
  AFlag: Boolean;
  ATabSheet: TcxTabSheet;
  AFrame: TFrame;
begin
  AFlag := True;
  for I := 0 to pgControl.PageCount - 1 do
  begin
    if pgControl.Pages[I].Tag = APerson.Id then
    begin
      AFlag := False;
      Break;
    end;
  end;
  if AFlag then
  begin
    ATabSheet := TcxTabSheet.Create(Self);
    ATabSheet.Parent := pgControl;
    ATabSheet.Tag := APerson.Id;
    ATabSheet.Caption := APerson.Name;
    ATabSheet.PageControl := pgControl;
    pgControl.ActivePage := ATabSheet;
    TfrmItem.Modify(ATabSheet, APerson);
  end;
end;
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895859
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
На обработчик получаю AV. Что не так?
procedure TfrmItem.btnSaveClick(Sender: TObject);
var
  c: TComponent;
begin
  with GetParentForm(Self) do
  begin
    c := FindComponent('pgControl');
    if Assigned(c) then
      if c is TcxPageControl then
      //  ShowMessage(IntToStr(TcxPageControl(c).ActivePageIndex));
     TcxPageControl(c).ActivePage.Free;
  end;
end;


Да вроде все так.
Я бы для начала удалил с фрейма все, кроме, собственно, кнопки удаления.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895861
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov, вот и мне интересно, я Tframe и TTabSheet создаю динамически.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895865
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov, исходники вашего тестового примера не можете закачать на файлообменник, я скачаю и протестирую.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895876
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Polesov, исходники вашего тестового примера не можете закачать на файлообменник, я скачаю и протестирую.

У меня нет исходников проекта, я не сохранял.
В принципе, под спойлером все тексты есть.
Файлы проекта разделены "//////////////////////////////////////"
Первая часть - Project6.dpr
Вторая часть - Unit11.pas
Третья часть - Unit11.dfm
Четвертая часть - Unit12.pas
Пятая часть - Unit12.dfm
Думаю, не сложно.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895918
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov, опять ловлю AV создаю фрейм с одной кнопкой только!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
unit Uframe;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxButtons, cxPC,
  cxGraphics, cxLookAndFeels, cxLookAndFeelPainters, Vcl.Menus, dxSkinsCore,
  dxSkinOffice2010Silver, Vcl.StdCtrls;

type
  TFrame1 = class(TFrame)
    cxButton1: TcxButton;
    procedure cxButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    class procedure Modify(ATabSheet: TcxTabSheet);
  end;

implementation

{$R *.dfm}

procedure TFrame1.cxButton1Click(Sender: TObject);
var
  c: TComponent;
begin
  with GetParentForm(Self) do
  begin
    c := FindComponent('pgControl');
    if Assigned(c) then
      if c is TcxPageControl then
        //  ShowMessage(IntToStr(TcxPageControl(c).ActivePageIndex));
        TcxPageControl(c).ActivePage.Free;
  end;
end;

class procedure TFrame1.Modify(ATabSheet: TcxTabSheet);
begin
  with TFrame1.Create(ATabSheet) do
  begin
    Parent := ATabSheet;
    Align := alClient;
  end;
end;

end.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895919
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
wsnet
Polesov, исходники вашего тестового примера не можете закачать на файлообменник, я скачаю и протестирую.

У меня нет исходников проекта, я не сохранял.
В принципе, под спойлером все тексты есть.
Файлы проекта разделены "//////////////////////////////////////"
Первая часть - Project6.dpr
Вторая часть - Unit11.pas
Третья часть - Unit11.dfm
Четвертая часть - Unit12.pas
Пятая часть - Unit12.dfm
Думаю, не сложно.


В том то и дело, что и здесь ловлю AV
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895932
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тему закрываем! Разобрался!
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39895939
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В случаи если на TFrame я ложу cxbutton возникает AV, если это TButton, то AV нет. В чем разница не понимаю!
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39896146
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
В случаи если на TFrame я ложу cxbutton возникает AV


Привет.

AV возникает в модуле cxButtons
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TcxCustomButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  AExecuteClick: Boolean;
begin
  FButtonPressTimer.Enabled := False;  // в этот момент FButtonPressTimer = nil
  :


Дело в том, что в результате выполнения метода нажатия кнопки происходит освобождение объектов:
pgControl.ActivePage, фрейма, ну и в том числе самой кнопки, которая лежит на удаляемом фрейме.

Конечно, можно подправить исходный код cxButtons (если он доступен)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TcxCustomButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  AExecuteClick: Boolean;
begin
  if csDestroying in ComponentState then
    exit;

  FButtonPressTimer.Enabled := False;
  :



Но мне больше нравится способ с использованием SendMessage, предложенный ma1tus.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
const 
  WM_DELETEACTIVEPAGE = WM_USER + 1

type
  TForm11 = class(TForm)
// объявление обработчика сообщения
    procedure WMDeleteActivePage( var Msg : TMessage ); message WM_DELETEACTIVEPAGE;

// реализация обработчика сообщения
procedure TForm11.WMDeleteActivePage( var Msg : TMessage );
begin
  pgControl.ActivePage.Free;
end;



Причем именно SendMessage:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TFrame12.cxButton1Click(Sender: TObject);
begin
// Вариант 1: все нормально, т.к. сначала отработает обработчик нажатия кнопки, 
// а потом уже выполняется удаление активной закладки
  PostMessage( GetparentForm( Self ).Handle, WM_DELETEACTIVEPAGE, 0, 0 );

// Вариант 2: возникает AV, т.к. удаление активной закладки фактически выполняется в рамках обработчика нажатия кнопки 
  SendMessage( GetparentForm( Self ).Handle, WM_DELETEACTIVEPAGE, 0, 0 );

// Вариант 3: аналогично варианту 2
  GetparentForm( Self ).Perform( WM_DELETEACTIVEPAGE, 0, 0 );
end;



С уважением, Polesov.
...
Рейтинг: 0 / 0
TcxTabControl удаление
    #39896172
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

Но мне больше нравится способ с использованием PostMessage , предложенный ma1tus.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TcxTabControl удаление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]