PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Componente com lista de subcomponentes #417685

30/05/2012

0

Pois bem, abandonei TCollection e TCollectionItem, criei uma classe com Array de ClientDataSets com escopo public como abaixo:

unit MultiClientDataSet;

interface

uses
  System.SysUtils, System.Classes, Fmx.Types, DataSnap.DBClient;

type
  TMultiClientDataSet = class(TComponent)
  private
    FList: TList;
    function GetClientDataSet(Index: Integer): TClientDataSet;
    procedure SetClientDataSet(Index: Integer; const Value: TClientDataSet);
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    function Count: Integer;
    function AddClientDataSet(ClientDataSet: TClientDataSet): TClientDataSet; overload;
    function AddClientDataSet: TClientDataSet; overload;
    procedure RemoveAction(ClientDataSet: TClientDataSet);
    property ClientDataSets[Index: Integer] : TClientDataSet read GetClientDataSet write SetClientDataSet;
  published

    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(RCA Samples, [TMultiClientDataSet]);
end;

{ TMultiClientDataSet }

function TMultiClientDataSet.AddClientDataSet(ClientDataSet: TClientDataSet): TClientDataSet;
begin
  FList.Add(ClientDataSet);
  Result := ClientDataSet;
end;

function TMultiClientDataSet.AddClientDataSet: TClientDataSet;
var
  FClientDataSet: TClientDataSet;
begin
  FClientDataSet := TClientDataSet.Create(Self);
  FClientDataSet.Name := ClientDataSet + IntToStr(Count+1);
  Result := AddClientDataSet(FClientDataSet)
end;

function TMultiClientDataSet.Count: Integer;
begin
  Result := FList.Count;
end;

constructor TMultiClientDataSet.Create(AOwner: TComponent);
begin
  inherited;
  FList := TList.Create;
end;

function TMultiClientDataSet.GetClientDataSet(Index: Integer): TClientDataSet;
begin
  Result := TClientDataSet(FList[Index]);
end;

procedure TMultiClientDataSet.RemoveAction(ClientDataSet: TClientDataSet);
begin
  if FList.Remove(ClientDataSet) >= 0 then
  begin
    ClientDataSet.Destroy;
  end;
end;

procedure TMultiClientDataSet.SetClientDataSet(Index: Integer; const Value: TClientDataSet);
begin
  TClientDataSet(FList[Index]).Assign(Value);
end;

end.


Criei um editor de componente como mostra o código abaixo:

unit MultiClientDataSetEditor;

interface

uses
  System.Classes, DesignEditors, DesignIntf, FMX.Dialogs, System.SysUtils;

type
  TMultiClientDataSetEditor = class(TComponentEditor)
  private
    procedure ShowEditor;
  public
    function GetVerbCount : integer; override;
    function GetVerb (Index : integer): string; override;
    procedure ExecuteVerb (Index : integer); override;
    procedure Edit; override;
  end;

procedure Register;

implementation

uses
  MultiClientDataSet, UnitFrmMultiClientDataSetEditor;

procedure Register;
begin
  { Declare DesignIntf e StdCtrls no uses }
  RegisterComponentEditor(TMultiClientDataSet,TMultiClientDataSetEditor);
end;

{ TMultiClientDataSetEditor }

procedure TMultiClientDataSetEditor.Edit;
begin
  inherited;

  ShowMessage(Component  + Component.Name);

end;

procedure TMultiClientDataSetEditor.ExecuteVerb(Index: integer);
begin

  inherited;

  case Index of
    0 : ShowEditor ;
    1 : ShowMessage(Editor de Actions) ;
    2 : TMultiClientDataSet(Component).AddClientDataSet;
  end;

end;

function TMultiClientDataSetEditor.GetVerb(Index: integer): string;
begin
  case Index of
    0 : Result := Editor;
    1 : Result := Count:  + IntToStr(TMultiClientDataSet(Component).Count );
    2 : Result := Adicionar um ClientDataSet ;
  end;
end;

function TMultiClientDataSetEditor.GetVerbCount: integer;
begin
  Result := 3;
end;

procedure TMultiClientDataSetEditor.ShowEditor;
var
  Frm: TFrmMultiClientDataSetEditor;
begin

  Frm := TFrmMultiClientDataSetEditor.Create(NIL);

  try
    Frm.Component := Component;
    Frm.ShowModal;
  finally
    Frm.Free;
  end;

end;

end.


Com esse editor em mãos, após incluir o componente no Form, posso adicionar ClientDataSets através do Menu Popup.

[img]http://img835.imageshack.us/img835/8365/componentedelphiarraycl.png[/img]

Ou através do form de edição do componente

[img]http://img442.imageshack.us/img442/8365/componentedelphiarraycl.png[/img]

O problema é que não consigo persistir isso, pois o componente inserido não fica no código do Form.

[img]http://img3.imageshack.us/img3/8365/componentedelphiarraycl.png[/img]

Eu reparei que se eu modificar o Create do ClienteDataSet para

FClientDataSet := TClientDataSet.Create(Self.Owner);


Daí o ClientDataSet aparece código do Form, mas não fica legal.

Como faz ?
Aloizio Castro

Aloizio Castro

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar