Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TcxTabControl удаление / 23 сообщений из 23, страница 1 из 1
28.11.2019, 10:43
    #39895421
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
Имеется форма, на ней TcxTabControl, далее на вкладке кнопка удаления этой вкладки.

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

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

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



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

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

Cannot access protected symbol TcxCustomTabControlProperties.Tabs


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

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

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


Сори, конечно TcxPageControl
...
Рейтинг: 0 / 0
28.11.2019, 14:17
    #39895627
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 15:18
    #39895707
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 16:00
    #39895758
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 16:04
    #39895766
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 16:05
    #39895769
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 18:08
    #39895852
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 18:10
    #39895854
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
Код: 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
28.11.2019, 18:16
    #39895859
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 18:24
    #39895861
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
Polesov, вот и мне интересно, я Tframe и TTabSheet создаю динамически.
...
Рейтинг: 0 / 0
28.11.2019, 18:29
    #39895865
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
Polesov, исходники вашего тестового примера не можете закачать на файлообменник, я скачаю и протестирую.
...
Рейтинг: 0 / 0
28.11.2019, 18:52
    #39895876
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
wsnet
Polesov, исходники вашего тестового примера не можете закачать на файлообменник, я скачаю и протестирую.

У меня нет исходников проекта, я не сохранял.
В принципе, под спойлером все тексты есть.
Файлы проекта разделены "//////////////////////////////////////"
Первая часть - Project6.dpr
Вторая часть - Unit11.pas
Третья часть - Unit11.dfm
Четвертая часть - Unit12.pas
Пятая часть - Unit12.dfm
Думаю, не сложно.
...
Рейтинг: 0 / 0
28.11.2019, 19:59
    #39895918
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
28.11.2019, 20:03
    #39895919
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
Polesov
wsnet
Polesov, исходники вашего тестового примера не можете закачать на файлообменник, я скачаю и протестирую.

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


В том то и дело, что и здесь ловлю AV
...
Рейтинг: 0 / 0
28.11.2019, 20:27
    #39895932
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
Тему закрываем! Разобрался!
...
Рейтинг: 0 / 0
28.11.2019, 20:41
    #39895939
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
В случаи если на TFrame я ложу cxbutton возникает AV, если это TButton, то AV нет. В чем разница не понимаю!
...
Рейтинг: 0 / 0
29.11.2019, 10:49
    #39896146
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
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
29.11.2019, 11:06
    #39896172
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TcxTabControl удаление
Polesov,

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


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