TcxGrid como ListBox (parte 2/2)

Na sequência (sem trema, pelas novas regras) do artigo anterior, veja como criar um descendente de TcxCustomDataSource para editar um TStringList (ou qualquer TStrings) com o componente TcxGrid.

Os componentes da DevExpress são excelentes exemplos de boa programação orientada a objetos. O conceito de GridView, por exemplo, é abstraído de tal forma que podemos ter visualização como tabelas com linhas e colunas, gráficos ou cartões (”cards”), como os do gerenciador de contatos do Outlook. Por essa razão as “colunas” de um GridView são referidas como “Items”, já que não faria sentido chamar de coluna uma série de gráfico ou uma linha de um cartão.

A fonte de dados que alimenta um grid é também generalizada pela classe TcxCustomDataSource. A descendente TcxDBDataSource é especializada para trabalhar com datasets e implementa filtragem, agrupamento e cálculo de sumários. O componente TcxGrid não presume nada sobre a forma como os dados são obtidos, lidos e escritos. Lida apenas com os métodos e propriedades de TcxCustomDataSource e com isso permite o polimorfismo.

É fácil implementar um novo descendente de TcxCustomDataSource para lidar com TStrings ao invés de TDataSet. No exemplo abaixo são implementados apenas os métodos básicos que precisam ser sobrescritos em qualquer descendente de TcxCustomDataSource.

O resultado é um list box editável. Você pode usar as teclas de atalho “Ins” para inserir uma linha e “Ctrl+Del” para deletar. Também pode adicionar uma linha no final da lista no modo “append”.

{**********************************************}
{                                              }
{  cxStringsDataSource                         }
{  by Daniel Maltarolli                        }
{  http://singularsistemas.com.br/blog         }
{                                              }
{  01) 2008-05-22 Initial release              }
{                                              }
{**********************************************}
 
unit cxStringsDataSource;
 
interface
 
uses Classes, cxCustomData;
 
type
  TcxStringsDataSource = class(TcxCustomDataSource)
  private
    FStrings: TStrings;
  protected
    function AppendRecord: TcxDataRecordHandle; override;
    procedure DeleteRecord(ARecordHandle: TcxDataRecordHandle); override;
    function GetRecordCount: Integer; override;
    function GetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): Variant; override;
    function InsertRecord(ARecordHandle: TcxDataRecordHandle): TcxDataRecordHandle; override;
    procedure SetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle; const AValue: Variant); override;
  public
    constructor Create(Strings: TStrings);
  end;
 
implementation
 
uses SysUtils, Variants;
 
{ TcxStringsDataSource }
 
constructor TcxStringsDataSource.Create(Strings: TStrings);
begin
  inherited Create;
  FStrings := Strings;
end;
 
function TcxStringsDataSource.AppendRecord: TcxDataRecordHandle;
begin
  FStrings.Append(EmptyStr);
  DataChanged;
  Result := TcxDataRecordHandle(FStrings.Count - 1);
end;
 
procedure TcxStringsDataSource.DeleteRecord(
  ARecordHandle: TcxDataRecordHandle);
begin
  FStrings.Delete(Integer(ARecordHandle));
  DataChanged;
end;
 
function TcxStringsDataSource.GetRecordCount: Integer;
begin
  Result := FStrings.Count;
end;
 
function TcxStringsDataSource.GetValue(ARecordHandle: TcxDataRecordHandle;
  AItemHandle: TcxDataItemHandle): Variant;
var
  Index: Integer;
begin
  Index := Integer(ARecordHandle);
  Result := FStrings.Strings[Index];
end;
 
function TcxStringsDataSource.InsertRecord(
  ARecordHandle: TcxDataRecordHandle): TcxDataRecordHandle;
var
  Index: Integer;
begin
  Index := Integer(ARecordHandle);
  FStrings.Insert(Index, EmptyStr);
  DataChanged;
  Result := ARecordHandle;
end;
 
procedure TcxStringsDataSource.SetValue(ARecordHandle: TcxDataRecordHandle;
  AItemHandle: TcxDataItemHandle; const AValue: Variant);
var
  Index: Integer;
begin
  Index := Integer(ARecordHandle);
  FStrings.Strings[Index] := VarToStrDef(AValue, EmptyStr);
end;
 
end.

Você precisa atribuir por código um objeto TcxStringsDataSource a GridView.DataController.CustomDataSource. É importante que o GridView seja um TcxTableView, não um TcxDBTableView. Para isso você precisará primeiro deletar no Form Designer o TcxDBTableView que é criado por default, criar um novo TableView e atribuí-lo a GridLevel1.

As propriedades do GridView são semelhantes àquelas usadas na parte um, porém deixando o grid editável e “OptionsSelection.CellSelect = True”.

Veja um exemplo completo de utilização no arquivo anexo.

Comments

One Response to “TcxGrid como ListBox (parte 2/2)”

  1. Leonel on May 28th, 2008 11:08 am

    Só faltou um screenshot. :)

Deixe uma Resposta




XHTML: Você pode usar essas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">