quinta-feira, 13 de novembro de 2008

Dicas de DBGrid - Final [Mostrando Imagens]

Mostrando Imagens no DBGrid

Muito útil também na analise das informações de um DBGrid, um recurso que este componente também possibilita é o uso de imagens em agregadas à colunas e valores do mesmo. Para configurar o recurso de imagens, adicione ao formulário um componente ImageList da paleta de componentes Win32 e com um duplo clique sobre o mesmo, utilize o botão “Add” para adicionar dois ícones que utilizaremos na representação de aprovado ou reprovado quanto a nota média obtida pelo aluno. Os ícones poderão normalmente ser encontrados nos diretório “C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Images\Buttons”.

Após adicionados os ícones, vá até o evento DrawColumnCell do gdRegistros, onde criamos a pouco as linhas de código responsáveis por zebra o DBGrid. Os códigos de adição de imagens serão conciliados aos códigos já adicionados, onde o evento deverá ter o seguinte código exibido na Listagem 3.

Listagem 3. Utilizando imagens no DBGrid

procedure TfrmPrincipal.gdRegistrosDrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

var

bitmap : TBitmap;

fixRect : TRect;

bmpWidth : integer;

imgIndex : integer;

begin

//Deixa o DBGrid Zebrado

if not Odd (cdsRegistros.RecNo) then

if not (gdSelected in State) then

begin

gdRegistros.Canvas.Brush.Color := clSilver;

gdRegistros.Canvas.FillRect(Rect);

gdRegistros.DefaultDrawDataCell(Rect,Column.Field,State);

end;

//Incrementa as inagens no DBGrid

fixRect := Rect;

if Column.Field = cdsRegistrosNotaMedia then

begin

//Utilizaremos uma condiçao simulando a média de aprovação 8

if cdsRegistrosNotaMedia.Value >= 8 then

imgIndex := 0

else

imgIndex := 1;

//Criar em runtime um TBitmap

bitmap := TBitmap.Create;

try

//Selecionando a imagem...

ImageList1.GetBitmap(imgIndex,bitmap);

//Fixar as dimensões do bitmap

bmpWidth := (Rect.Bottom - Rect.Top);

fixRect.Right := Rect.Left + bmpWidth;

//Desenhar o bitmap (imagem)

gdRegistros.Canvas.StretchDraw(fixRect,bitmap);

finally

//Limpa o TBitmap

bitmap.Free;

end;

//Ajustar o espaço do Retângulo para a imagem

fixRect := Rect;

fixRect.Left := fixRect.Left + bmpWidth;

end;

//Desenhar o texto no Grid

gdRegistros.DefaultDrawColumnCell(fixRect,DataCol,Column,State);

end;

Ao executar agora nossa aplicação, observe que o Grid ficou organizado de uma forma bem diferente, onde todas as médias de alunas iguais ou acima de 8 foram agregadas a uma imagem e o restante dos resultados a um outro Bitmap representando que os mesmos foram reprovados (Figura 5).

Figura 5. Aparência do DBGrid após implementação do uso de imagens

Opções do DBGrid

Ao selecionar o DBGrid observe uma propriedade chamada Options, na qual poderemos ainda fazer uma série de configurações na aparência do DBGrid. Irei apresentar algumas das opções mais utilizadas:

- dgEditing: deixe esta opção habilitada com True. É responsável por permitir a edição e cadastro de registros diretamente no Grid, recurso que no caso desta aplicação está sendo utilizado por não termos uma tela especifica para cadastros e edições.

- dbTitles: recurso onde você poderá optar entre exibir ou ocultar a linha de apresentação dos títulos do DBGrid, deixe-a como True.

- dgIndicator: permite que você escolha em exibir ou não a seta de indicação na linha do Grid que está selecionada. Altere o recurso para False.

- dgColLines: nesta opção você poderá configurar se deseja exibir ou ocultar as linhas das colunas do DBGrid. Deixe habilitada como True esta função.

- dgRowLines: altere esta opção para False e observe que as linhas entre os registros do DBGrid não estarão mais sendo exibidas.

- dgMultiSelect: propriedade que permite a configuração de permitir que o usuário selecione mais de uma linha por vez no DBGrid. Altere a opção para True.

Após estas configurações execute sua aplicação novamente e verifique uma aparência diferenciada da qual obteve na execução anterior. A aparência do Grid será semelhante a imagem ilustrada na Figura 6.

Figura 6. DBGrid modificado através da propriedade Options

Conclusão

Vimos nestes post formas praticas e interessantes de trabalhar e customizar a aparência do componente DBGrid em suas aplicações. Estas dicas aqui mostradas foram poucas comparado com o grande número de situações e customizações possíveis ao componente, fica então o desafio de você mesmo descobrir novos recursos, como por exemplo implantação de campos Lookup em um DBGrid ou ainda em tempo de execução estar adicionando outros componentes em Runtime como por exemplo um CheckBox. Grande abraço e até a próxima.

quarta-feira, 12 de novembro de 2008

Dicas de DBGrid - Parte III [Zebrando colunas]

Zebrando o DBGrid

Um outro recurso também bastante interessante e útil para melhor visualização dos registros de um DBGrid é sua capacidade de estar organizando os registros de forma “zebrada”, que em casos de números muito grandes e de linhas extensas facilita muito a localização dos registros. Para implantar o recurso no Grid da nossa aplicação, selecione no evento DrawColumnCell e adicione o código da Listagem 2.

Listagem 2. Zebrando as linhas dos DBGrid

procedure TfrmPrincipal.gdRegistrosDrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn;

State: TGridDrawState);

begin

if not Odd (cdsRegistros.RecNo) then

if not (gdSelected in State) then

begin

gdRegistros.Canvas.Brush.Color := clSilver;

gdRegistros.Canvas.FillRect(Rect);

gdRegistros.DefaultDrawDataCell(Rect,Column.Field,State);

end;

end;

Ao executar mais uma vez nossa aplicação, observe que agora todo Grid foi organizado de uma forma com suas linhas intercaladas por cores diferentes, separando assim os registros (Figura 4).
Figura 4. Aplicação com DBGrid “zebrado”.

terça-feira, 11 de novembro de 2008

Dicas de DBGrid - Parte II [Destacando coluna selecionada]

Destacando a coluna selecionada

Ao utilizarmos o recurso de ordenação de registros em um DBGrid, geralmente usa-se um destaque para diferenciar a coluna que esta selecionada, alterando-se a cor do titulo ou a fonte. O recurso também será implementado no evento OnTitleClick, em conjunto com o código de ordenação dos registros. Para usar o recurso, digite no evento o código da Listagem 1.

Listagem 1. Ordenação e destaque de coluna do Grid

procedure TfrmPrincipal.gdRegistrosTitleClick(Column: TColumn);

Var

i:Integer;

begin

Try

cdsRegistros.IndexFieldNames := Column.FieldName;//Ordenação dos registros do Grid

for i:=0 to Column.Grid.FieldCount - 1 do

begin

gdRegistros.Columns.Items[i].Title.Font.Color:=ClBlack;//Cor da Fonte

gdRegistros.COLUMNS.ITEMS[I].TITLE.FONT.STYLE := [];//Estilo da Fonte

gdRegistros.Columns.Items[i].Title.Color:=clBtnFace;//Cor do Fundo do Titulo Normal

Column.Title.Color :=clSilver;//Cor do Fundo do Titulo Selecionado

COLUMN.TITLE.FONT.STYLE := [FSBOLD];//Estilo NEGRITO da coluna selecionada

Column.Title.Font.Color:=ClBlue;//Cor da fonte Selecionada

Column.Font.color:=clTeal;//Cor dos registros na coluna selecionada

gdRegistros.Columns.Items[i].Font.color:=ClBlack;//Cor dos registros nas colunas normais

end;

Except

ShowMessage('Ordenação não pode ser aplicada!');

End;

end;

Ao executar a aplicação e utilizar o recurso da ordenação veja as diferentes características assumidas pela coluna ordenada (Figura 3).

Figura 3. Seleção e ordenação dos registros no Grid

segunda-feira, 10 de novembro de 2008

Dicas de DBGrid - Parte I [Configurando e ordenando registros]

Considerado um dos componentes mais populares presentes na VCL do Delphi o DBGrid é um componente que é utilizado nas mais diversas situações em aplicações Delphi Win32, sua riqueza de propriedades permite ao programador que o utilize das mais variadas formas e maneiras, possibilitando ao usuário aplicações com layouts de boa aparência e fácil integração com a visualização, inclusão ou manutenção dos registros de uma base de dados.

Sua compatibilidade de conexão de componentes com os presentes na VCL do Delphi é muito grande, sendo possível seu uso com os mais diferentes tipos de acessos e formatos de arquivos de dados.

Neste artigo veremos algumas dicas praticas que irão ajudar muito na hora do desenvolvimento do seu sistema quanto ao uso do DBGrid, faremos uma total personalização dos registros que serão apresentados no DBGrid, adotaremos um método de ordenação de dados além da exibição dos registros em grid “zebrado”. Antes da finalização do artigo, veja também uma dica interessante de como utilizar imagens no DBGrid, configurando-as em tempo de execução a partir de informações obtidas da conexão com a base de dados Employee.fdb, a qual acompanha a instalação do Firebird.

Criando aplicação

Neste artigo utilizarei o Delphi 7 para criação da aplicação e demonstração dos exemplos e dicas de DBGrid, mas fique livre para utilizar outra versão do Delphi para criação do projeto na plataforma Win32.

Crie uma nova aplicação através do menu File|New>Application. Altere a propriedade Name do formulário inicial para “frmPrincipal” e a propriedade Caption para “Dicas DBGrid”. Salve a Unit principal do projeto como “uPrincipal.pas” e o projeto salve como “prjDBGrid.dpr”.

Para melhor demonstrar algumas funcionalidade do DBGrid, criaremos através de um ClientDataSet nossa própria estrutura de dados, salvando as informações do mesmo em um arquivo XML. Adicione ao formulário principal um novo componente ClientDataSet (“cdsRegistros”) da paleta de componentes DataAcces e com um duplo clique sobre o mesmo abra o Fields Editor onde criaremos os campos da nossa base. Utilizando um clique de botão direito do mouse no espaço do Fields Editor selecione a opção New Field criando a seguinte estrutura de componentes:

Name | Type | Size |

----------------------------------
Codigo | AutoInc | |
----------------------------------
Aluno | String | 50 |
----------------------------------
DataNasc | Date | |
----------------------------------
NotaMedia | Integer | |

Tabela 1. Estrutura de dados do ClientDataSet

Após criada esta estrutura no Fields Editor, utilize o botão direito do mouse sobre o cdsRegistros e escolha a opção Create DataSet que fará a criação de uma base de dados em memória. Para salvar os registros do ClientDataSet em uma base XML, utilize novamente o botão direito do mouse sobre o componente selecionando a opção Save to MyBase Xml table (Figura 1), onde você devera mapear o mesmo diretório onde está salvando os fontes do sistema e informar ao nome do arquivo XML que está sendo solicitado o valor “dados.xml”. Ainda nas propriedades do cdsRegistro, localize agora através de sua propriedade FileName o arquivo dados.xml que acabamos de criar, o qual será localizado em tempo de execução e fará com que os registros salvos sejam carregados.

Figura 1. Salvando base de dados em arquivo XML.

Para visualização e cadastro dos registros precisamos ainda adicionar ao formulário um componente DataSource (“dsRegistros”) da paleta DataAcces e também um componente DBGrid (“gdRegistros”) da paleta DataControls. No dsRegistros relacione sua propriedade DataSet ao cdsRegistros e no gdRegistros atribua a propriedade DataSource relacionada ao componente dsRegistros, onde já deverão ser listados no Grid as colunas que criamos no cdsRegistros.

Configurando as colunas do Grid

Uma característica bastante interessante do DBGrid já é a sua capacidade de configuração e Layout das colunas de dados, onde poderá ser aplicado um estilo diferente para cada situação e descrição da coluna. Essa atividade também poderia ser realizada diretamente no cdsRegistros alterando a propriedade DisplayLabel de cada campo no Fields Editor, mas faremos a customização dos nomes dos campos na própria estrutura do Grid.

Com um clique duplo sobre o gdRegistros, selecione na nova caixa de diálogos que está aparecendo o ícone Add All Fields que irá exibir todas as colunas que criamos na base (Figura 2). Selecione de forma individual o primeiro Field, observando no Object Inspector do Delphi a quantidade de propriedades e situações onde poderemos estar configurando a aparência da coluna no noss gdRegistros. Na propriedade Alignment do Field selecione a opção taCenter, que irá centralizar os valores na coluna. Altere a propriedade Title>Alignment também para taCenter que fará com que o titulo da coluna também fique centralizado, além de alterar ainda o Caption para “Código”. Observe que as alterações já tomaram formas no gdRegistros do formulário. Faça a configuração das demais colunas do gdRegistros, observando apenas uma propriedade muito interessante que iremos configurar para o Field “NotaMedia”. Com o Field selecionado, abra o editor da propriedade PickList onde em linhas individuais digite os números partindo de 0 até o numero 10.

A configuração da propriedade PickList será a responsável em tempo de execução quando clicamos sobre o item “NotaMedia” no Grid de abrir uma lista de registros pré-configurados para serem utilizados no cadastro. É uma característica muito importante e bastante utilizadas em cadastros de pessoas, onde informa-se siglas de estados, sexo, entre outras situações.

Figura 2. Editando colunas do DBGrid

Executando sua aplicação pela primeira vez, carregue o Grid com cerca de dez registros com as informações de diferentes alunos, informando o nome, data de nascimento e notas médias variadas para cada aluno. A coluna código não necessita de ser preenchida, uma vez que definimos seu DataType como sendo AutoInc. Após o cadastro dos cerca de dez registros, perceba que você poderá fechar sua aplicação e ao abri-la novamente todos os registros cadastrados serão carregados novamente, comprovando que a estrutura foi salva na base XLM criada.

Ordenando registros no DBGrid

Muito interessante também o recurso da ordenação de registros por meio do Click sobre uma coluna do Grid pela qual o usuário deseja que os registros sejam ordenados. Para implementar a funcionalidade, adicione ao evento OnTitleClick do gdRegistros a seguinte linha de códigos:

cdsRegistros.IndexFieldNames := Column.FieldName;

O código será responsável por alterar o campo de criação do índice do ClientDataSet, em Runtime a cada clique do mouse sobre o titulo de alguma coluna com valores exatos (Campos do tipo Blob ou Memo não poderão ser ordenados) fará com que os registros da mesma sejam organizados de forma ordenada.

Por hoje seria isto, até a próxima.

Substituindo Strings em Delphi for Win32

Estou trabalhando com Delphi for Win32 e preciso substituir caracteres de uma String, como posso resolver?

Fácil, não há necessidade de nenhuma rotina de repetição como for ou while para percorrer todos os caracteres do texto verificando se é igual ao caracter que deverá ser substituído. Da mesma forma que há o "ToString.Replace" do ASP.NET temos o StringReplace no Win32.

Declare a uses SysUtils e logo após implmente o comando da seguinte forma:

StringReplace(String,Antigo,Novo,Flags) ;

Ex.: StringReplace('Substituido Strings com Delphi Win32','s','Ass',[rfReplaceAll,rfIgnoreCase]);
rfReplaceAll: realiza a substituição de todos os caracteres encontrados
rfIgnoreCase: ingora diferenças entre maiúsculas e minúsculas.


Por hoje fica ai a dica... abraço e até a próxima.