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)”
Deixe uma Resposta

Só faltou um screenshot. :)