разработать собственный контрольный список, унаследованный от cxCheckList, который содержит функциональные возможности контрольного списка Orpheus - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь создать пользовательский компонент контрольного списка с некоторыми дополнительными функциями из компонента Orpheus (TOvcCheckList) и некоторыми улучшениями пользовательского интерфейса.Мне нужна помощь в создании CheckList, который выглядит так, как на изображении,

Для достижения этого дизайна на данный момент мы не проектировали никаких пользовательских компонентов, но мы попытались поместить cxGroupBox и поверх группового блока.мы добавили cxCheckList и реализовали функциональность.Но теперь нас просят создать компонент, так что потребность в написании функциональности везде будет уменьшена.

Ниже приведен пример для получения проекта.enter image description here

unit DxSelectallGroupBox;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, cxContainer, cxEdit, cxCustomListBox,
  cxCheckListBox, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxPC, dxDockPanel, dxDockControl,
  Vcl.StdCtrls, cxGroupBox, cxCheckBox, dxBevel, System.ImageList, Vcl.ImgList,
  Vcl.CheckLst,Imagelistmodule;

type
  TDxSelectallGroupBox = class(TcxCustomGroupBox)
  private
    { Private declarations }
    fGBSelectAll: TcxGroupBox;
    fGBCheckList: TcxGroupBox;
    fCxCheckList: TcxCheckListBox;
    fDxBevel: TdxBevel;
    fCxCheckSelectAll: TcxCheckListBox;
  protected
    { Protected declarations }
  public
    { Public declarations }
     constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test Components', [TDxSelectallGroupBox]);
end;

{ TDxChecklistGroupBox }

constructor TDxSelectallGroupBox.Create(AOwner: TComponent);
begin
   inherited;
  SetBounds(Left, Top, 140, 120);
  fGBSelectAll := TcxGroupBox.Create(self);
  fGBSelectAll.Parent := Twincontrol(AOwner);
  fGBSelectAll.SetBounds(10, 10, width, 185);
  fGBSelectAll.Align := alNone;
  fGBSelectAll.Alignment := alTopLeft;

  fCxCheckSelectAll := TcxCheckListBox.Create(Self);
  fCxCheckSelectAll.Parent := fGBSelectAll;

  FdxBevel := Tdxbevel.Create(Self);
  FdxBevel.Parent := fGBSelectAll;

  FgbCheckList := TcxGroupBox.Create(Self);
  FgbCheckList.Parent := fGBSelectAll;

  fCxCheckList := TcxCheckListBox.Create(Self);
  fCxCheckList.Parent := FgbCheckList;

  with fGBSelectAll do begin
    PanelStyle.Active := True;
    ParentBackground := False;
    ParentColor := False;
    Style.BorderColor := 15065047;
    Style.BorderStyle := ebsSingle;
    Style.Color := clWhite;
    Style.LookAndFeel.NativeStyle := False;
    TabOrder := 0;
  end;
    with FdxBevel do begin
      Left := 2;
      Top := 38;
      Width := 181;
      Height := 1;
      Align := alTop;
      AutoSize := True;
      LookAndFeel.NativeStyle := False;
    end ;
    with FgbCheckList do begin
      Left := 2 ;
      Top := 39;
      Align := alClient;
      PanelStyle.Active := True;
      ParentBackground := False;
      Style.BorderStyle := ebsNone;
      Style.LookAndFeel.NativeStyle := False;
      StyleDisabled.LookAndFeel.NativeStyle := False;
      TabOrder := 0;
      Height := 121;
      Width := 181;
    end;
      with fCxCheckList do begin
        Left := 2;
        Top := 2;
        Width := 177;
        Height := 117;
        Margins.Left := 5;
        Margins.Top := 0;
        Margins.Right := 0;
        Margins.Bottom := 0;
        Align := alClient;
        ParentFont := False;
        Style.BorderStyle := cbsNone;
        Style.Color := clWhite;
        Style.Font.Charset := ANSI_CHARSET;
        Style.Font.Color := 7697781;
        Style.Font.Height := -16;
        Style.Font.Name := 'Noto Sans';
        Style.Font.Style := [];
        Style.HotTrack := True;
        Style.LookAndFeel.NativeStyle := False;
        TabOrder := 0;
        additem('One');
        additem('Two');
        additem('Three');
        showchecks:=true;
    end;
    with fCxCheckSelectAll do
    begin
      AlignWithMargins := True;
      Left := 5;
      Top := 5 ;
      Width := 175 ;
      Height := 30 ;
      Align := alTop;
      ParentFont := False ;
      Style.BorderStyle := cbsNone;
      Style.Font.Charset := ANSI_CHARSET;
      Style.Font.Color := 7697781;
      Style.Font.Height := -16 ;
      Style.Font.Name := 'Noto Sans';
      Style.Font.Style := [] ;
      Style.LookAndFeel.NativeStyle := False;
      StyleDisabled.BorderStyle := cbsNone;
      TabOrder := 1 ;
      additem('Select All');
      Showchecks :=True;
    end;


end;

end.

После установки компонента я получаю что-то вроде следующего: enter image description here

Может кто-нибудь помочь в исправлениимой источник и направить меня в правильном направлении?Спасибо.

ОБНОВЛЕНИЕ

Я нашел основную причину ошибки и исправил Control '' has no parent window.Когда я устанавливаю и пытаюсь удалить компонент в форме, он выдает ошибку типа Access violation at address 1D405F2E in module 'cxLibraryRS25.bpl'. Write of 'адрес 00000090`

Ответы [ 2 ]

1 голос
/ 02 мая 2019
fGBSelectAll.Parent := Twincontrol(AOwner);

Там вы ставите fGBSelectAll на владельца вашего сложного контроля. Этот владелец, как правило, форма. Таким образом, вместо того, чтобы помещать подгруппу в основной блок группы, вы помещаете ее вне ее, прямо в форму.

Решение: используйте Self, который ссылается на экземпляр самого экземпляра TDxSelectallGroupBox.

fGBSelectAll.Parent := Self;
0 голосов
/ 03 мая 2019

Приведенный ниже код создает компонент по мере необходимости

unit DxSelectallGroupBox;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, cxContainer, cxEdit, cxCustomListBox,
  cxCheckListBox, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxPC, dxDockPanel, dxDockControl,
  Vcl.StdCtrls, cxGroupBox, cxCheckBox, dxBevel, System.ImageList, Vcl.ImgList,
  Vcl.CheckLst, cxListView;

type
  TDxSelectallGroupBox = class(TcxCustomGroupBox)
  private
    { Private declarations }
    fGBSelectAll: TcxGroupBox;
    fGBCheckList: TcxGroupBox;
    fCxCheckList: TcxCheckListBox;
    fDxBevel: TShape;
    fCxCheckSelectAll: TcxCheckBox;
  protected
    { Protected declarations }
  public
    { Public declarations }
     constructor Create(AOwner: TComponent); override;         
  published
    { Published declarations }

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test Components', [TDxSelectallGroupBox]);
end;

{ TDxChecklistGroupBox }

constructor TDxSelectallGroupBox.Create(AOwner: TComponent);
begin
  inherited;
  Parent := TWinControl(AOwner);
  SetBounds(Left, Top, 140, 120);
  Height := 200;
  Width := 200;
  fGBSelectAll := TcxGroupBox.Create(self);
  fGBSelectAll.Parent := self;
  fGBSelectAll.SetBounds(1, 1, width, 199);
  fGBSelectAll.Align := alNone;
  fGBSelectAll.Alignment := alTopLeft;

  fCxCheckSelectAll := TcxCheckBox.Create(Self);
  fCxCheckSelectAll.Parent := fGBSelectAll;

  FdxBevel := TShape.Create(Self);
  FdxBevel.Parent := fGBSelectAll;

  FgbCheckList := TcxGroupBox.Create(Self);
  FgbCheckList.Parent := fGBSelectAll;

  fCxCheckList := TcxCheckListBox.Create(Self);
  fCxCheckList.Parent := FgbCheckList;

  Style.BorderColor := 15065047;
  Style.BorderStyle := ebsSingle;
  Style.Color := clWhite;
  Style.LookAndFeel.NativeStyle := False;

  with fGBSelectAll do begin
    PanelStyle.Active := True;
    ParentBackground := False;
    ParentColor := False;
    Style.BorderColor := 15065047;
    Style.BorderStyle := ebsSingle;
    Style.Color := clWhite;
    Style.LookAndFeel.NativeStyle := False;
    TabOrder := 0;
    Width := 199;
  end;
    with FdxBevel do begin
      Left := 0;
      Top := 38;
      Width :=300;
      Height := 1;
      Align := alTop;
      Pen.Color := 15065047;
    end ;
    with FgbCheckList do begin
      Left := 2 ;
      Top := 39;
      Align := alClient;
      PanelStyle.Active := True;
      ParentBackground := False;
      Style.BorderStyle := ebsNone;
      Style.LookAndFeel.NativeStyle := False;
      StyleDisabled.LookAndFeel.NativeStyle := False;
      TabOrder := 0;
      Height := 200;
      Width := 200;
    end;
      with fCxCheckList do begin
        Left := 2;
        Top := 2;
        Width := 200;
        Height := 117;
        Margins.Left := 5;
        Margins.Top := 0;
        Margins.Right := 0;
        Margins.Bottom := 0;
        Align := alClient;
        ParentFont := False;
        Style.BorderStyle := cbsNone;
        Style.Color := clWhite;
        Style.Font.Charset := ANSI_CHARSET;
        Style.Font.Color := 7697781;
        Style.Font.Height := -16;
        Style.Font.Name := 'Noto Sans';
        Style.Font.Style := [];
        Style.HotTrack := True;
        Style.LookAndFeel.NativeStyle := False;
        StyleFocused.BorderStyle := cbsNone;
        StyleHot.BorderStyle := cbsNone;
        TabOrder := 0;
        additem('One');
        additem('Two');
        additem('Three');
        showchecks:=true;
    end;
    with fCxCheckSelectAll do
    begin
      AlignWithMargins := True;
      Left := 5;
      Top := 5 ;
      Width := 200 ;
      Height := 30 ;
      Align := alTop;
      ParentFont := False ;
      Style.BorderStyle := ebsSingle;
      Style.BorderColor := 15065047;
      Style.Font.Charset := ANSI_CHARSET;
      Style.Font.Color := 7697781;
      Style.Font.Height := -16 ;
      Style.Font.Name := 'Noto Sans';
      Style.Font.Style := [] ;
      Style.LookAndFeel.NativeStyle := False;
      StyleDisabled.BorderStyle := ebsSingle;
      StyleHot.BorderStyle := ebsSingle;
      TabOrder := 1 ;
      Caption := 'Select All';
    end;
end;
...