Конференция "Компоненты" » Коллекция колонок в компоненте [D1, WinXP]
 
  • Evgenn_ (13.06.11 02:30) [0]
    Суть в том что мне необходимо написать невизуальный компонент, при execute которого будет открывать окно, в нем cxGrid, в общем будет что-то типа справочника (просмотр,выбор,редактирование)...
    всё бы ничего если бы я не парился с колонками и делал создать автоматом все колонки, но я  не хочу терять возможности настройки колонок.. в итоге хочу при даблклике открывать дизайнер колонок.. просто так колонки создать колонки походу не получится, поэтому при создании компонента создаю cxGridDBTableView, а потом уже в моём редакторе при нажатии добавить вызывается grid.creatcolumn

    unit uSprav

    type
     TSprav= class(TComponent)
     private
       { Private declarations }
       fView:tcxGridDBTableView;
       fowner:tcomponent;
       fItems: TList;
       fname:TComponentName;
       function GetItem(aIndex: Integer): TcxGridDBColumn;
       function GetItemCount: Integer;
       procedure SetItem(aIndex: Integer; const aValue: TcxGridDBColumn);

     protected
       { Protected declarations }
           procedure Notification(aComponent: TComponent; Operation: TOperation); override;
     public
       { Public declarations }

       constructor Create(aOwner: TComponent); override;
       destructor Destroy; override;
       property Items[aIndex: Integer]: TcxGridDBColumn read GetItem write SetItem; default;
       procedure AddItem(aItem: TcxGridDBColumn);
       procedure RemoveItem(aItem: TcxGridDBColumn);
       property ItemCount: Integer read GetItemCount;
       function CreateColumn:TcxGridDBColumn;
       property View:tcxGridDBTableView read fview write fview;
       procedure GetChildren(Proc: TGetChildProc; Root: TComponent);
     published
       { Published declarations }
     end;

    constructor TSprav.Create(aOwner: TComponent);

    begin
     inherited Create(aOwner);
     fItems := TList.Create;
     fowner:=aowner;
      fview:=TcxGridDBTableView.Create(aowner);
       fview.Name:='View'+self.Name;
       fview.Repository:=self;
       fview.SetSubComponent(true);
    end;

    function TSprav.CreateColumn:TcxGridDBColumn;
    var col:TcxGridDBColumn;
    begin
     col:=fView.CreateColumn;
     Col.Name:='Column'+inttostr(fitems.Count+1);
     col.SetSubComponent(true);
     additem(col);
     result:=col;
    end;
    .........



    кароче в design-time все создаётся, я своё TableView могу даже созданному cxGrid назначить, колонки всё отображается.. вываливается "Invalid propertry path"
    а.. и при alt+F12 ошибка вываливается..
  • Evgenn © (13.06.11 02:53) [1]
    http://zalil.ru/31248055  здесь исходник...
  • DimaBr © (14.06.11 03:01) [2]
    Проще унаследоваться от TcxGridViewRepository. Приемущества:
    1. Можно хранить несколько вьюшек (справочников) в одном компоненте
    2. Готовый редактор компонента с визуальным окном
    Останется реализовать только метод Excecute
  • DimaBr © (14.06.11 03:21) [3]
    Вот ваша ошибка.
    constructor TSprav.Create(aOwner: TComponent);
    begin
     inherited Create(aOwner);
     fItems := TList.Create;
     fowner:=aowner;
    // if assigned(fview)=false then
    //  begin
       fview:=TcxGridDBTableView.Create(nil);
       fview.Name:='View'+self.Name;
       fview.Repository:=self;    //              так делать нельзя
       fview.SetSubComponent(true);
    //  end;
    end;



    Если внимательно посмотрите исходник cxGridCustomView, то увидите что:

    type
     TcxGridViewRepositoryAccess = class(TcxGridViewRepository);

    destructor TcxCustomGridView.Destroy;
    begin
    ...
     if FRepository <> nil then
       TcxGridViewRepositoryAccess(FRepository).RemoveItem(Self);
    ...
    end;


    А так ка ваш FRepository не TcxGridViewRepository, то куда обратиться не известно и 100% вероятности получим AV.

    Вывод - нужен наследник TcxGridViewRepository
  • Evgenn © (14.06.11 10:35) [4]
    fview.Repository:=self;   это было выдрано из исходника cxGridRepository..
    фишка в том что я щас польностью передрал компонент репозитория..  вьюхи создаются нормально.. но вот при переходе alt+f12 созданной вьюхи нет.. может в эдиторе при создании нада что-то писать?..я щас в теле самого компонента сделал процедуру создания cxdbGridView... не сохраняет :(
  • evgenn © (14.06.11 10:43) [5]
    ну вот унаследовался от репозитория всё работает, но почему же у меня тогда не сохраняет, если я слово в слово переписал
  • DimaBr © (14.06.11 19:32) [6]
    Вы не читаете то что я написал ? Унаследуйтесь от TcxGridViewRepository
 
Конференция "Компоненты" » Коллекция колонок в компоненте [D1, WinXP]
Есть новые Нет новых   [118243   +31][b:0][p:0.002]