Académique Documents
Professionnel Documents
Culture Documents
Cdigo
//Utilizando Zeos para postgreSQL //incluir sql com parametros a serem comparados //Cdigo utilizado na hora de um cadastro procedure TFRM_LOGIN.DBEdit3Exit(Sender: TObject); begin ZQuery1.Close; ZQuery1.ParamByName('usuario').Value:= DBEdit3.Text; ZQuery1.Open; if ZQuery1.Eof= False then begin ShowMessage('Usurio informado j consta em sua Base de Dados!'); ZQuery1.Active:= True; DBEdit3.SetFocus; DBEdit3.Text:= ''; end else Abort; DBEdit2.SetFocus; end;
Estou criando um cadastro de usurio e senha. Tentei fazer ele buscar o Nome com Locate e DBEdit.Text para verificar se o usurio j existe no banco de dados, mas ele aparece erro sempre.
Cdigo: if (ClientDataSet.Locate('Nome',DBEdit.Text,[])) then begin if MessageBox(Handle, 'Usurio j Existe!!', 'Ateno!', MB_OK or MB_ICONEXCLAMATION) = IDOK then end else begin ADODataSet.Close; ClientDataSet.ApplyUpdates(0); ADODataSet.Open; end;
Ele est aparecendo que existe usurio mesmo no existindo o nome do usurio no banco e no insere no banco.
Voltar ao Topo joemil
Enviada: Sex Nov 19, 2010 9:16 am Assunto:
Moderador
toda vez q vc muda o ponteiro do registro em um Dataset, o delphi automaticamente da um post no registro q esta em edicao/insercao. entao vc deveria usar um Edit pra digitar os dados e gravar essas informacoes manualmente. _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b> Enviar imagens: http://tinypic.com/
Amigo, eu uso assim pra localizar o CPF_CNPJ j cadastrado, voc poder adaptar a sua necessidade..
Cdigo: procedure TFClientes.DBEdit9KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); //VERIFICAO DE CPF/CNPJ IMPLEMENTADA/MODIFICADA EM 17/08/2010. begin IF Qytabela.State In [DsInsert] then if (key = 13) or (key = 9) Then Begin if (( DBEdit9.Text = '00000000000') or (DBEdit9.Text = '00000000000000')) then
DBEdit17.SetFocus else With ExecSql('Select * from Clientes where CPF_CNPJ = :Nom',varArrayOf([DbEdit9.Text]) ) Do if not(bof and eof) then Begin ShowMessage('CPF/CNPJ J CADASTRADO NO SISTEMA, FAVOR VERIFICAR'); QyTabela.Cancel; end end; end;
RAFFAEL1983 escreveu: Estou criando um cadastro de usurio e senha. Tentei fazer ele buscar o Nome com Locate e DBEdit.Text para verificar se o usurio j existe no banco de dados, mas ele aparece erro sempre. Cdigo: if (ClientDataSet.Locate('Nome',DBEdit.Text,[])) then begin if MessageBox(Handle, 'Usurio j Existe!!', 'Ateno!', MB_OK or MB_ICONEXCLAMATION) = IDOK then end else begin ADODataSet.Close; ClientDataSet.ApplyUpdates(0); ADODataSet.Open; end;
Ele est aparecendo que existe usurio mesmo no existindo o nome do usurio no banco e no insere no banco.
Voltar ao Topo RAFFAEL1983
Membro Junior Enviada: Sex Nov 19, 2010 4:30 pm Assunto:
No estou conseguindo. Pensei em colocar um ADOQuery s para consultar e depois verificar se existe no banco por ele. Caso tivesse ele exibiria a mensagem, caso contrario ele voltaria para o DataSet e incluiria no ClientDataSet; Sem sucesso no consegui at agora um jeito de fazer isso funcionar.
Case RadioGroup1.ItemIndex of 0: begin if not (ValidarCNPJ(edtCNPJ.Text)) then begin MessageDlg('CNPJ Invlido, favor digitar corretamente!',mtWarning,[mbOK],0); edtCNPJ.SetFocus; end else Result:=True; end; 1: begin if not (ValidarCPF(edtCNPJ.Text)) then begin MessageDlg('CPF Invlido, favor digitar corretamente!',mtWarning,[mbOK],0); edtCNPJ.SetFocus; end else Result:=True; end; end; end; Var Novo_ADODataSet : TADODataSet; S_Tipo : String; begin Case RadioGroup1.ItemIndex of 0: S_Tipo:='CNPJ '; else S_Tipo:='CPF '; end; result:=False; if edtCNPJ.ReadOnly then Exit; if Length(SomenteNumeros(edtCNPJ.Text))=0 then begin result:=True; Exit; end; With Novo_ADODataSet do begin Novo_ADODataSet:=TADODataSet.Create(Application); Connection:=ADOConnection1; if (DataSource1.State in [dsEdit]) then CommandText:='select * from Clientes where Cdigo <>'+ADOQuery1Cdigo.AsString+' and CNPJ = '+quotedstr(edtCNPJ.Text) else CommandText:='select * from Clientes where CNPJ = '+quotedstr(edtCNPJ.Text); Open; end; if not Novo_ADODataSet.IsEmpty then begin MessageDlg(S_Tipo+'J Cadastrado',mtError,[mbOK],0); edtCNPJ.SetFocus; end else if CNPJCPFValido then result:=True; FreeAndNil(Novo_ADODataSet);
end;
Desenvolvimento Fortes Report - Tutorial - Parte 1 Neste artigo veremos como fazer um relatrio simples usando um outro componente bem parecido com o Quick Report, que j vem com o Delphi, porm com vrias vantagens que poderemos ver em futuros artigos que sero publicados no portal.
Delphi
Desenvolvendo o Primeiro Relatrio Amigos, fazer relatrios o famoso mal necessrio, que particularmente eu no me incomodo em desenvolver, at porque, geralmente a parte mais rentvel do negcio ! Ao final do artigo tem o link onde voc poder baixar este componente e ensina como instalar. Bom, mas deixemos de delongas e vamos ao trabalho... Primeiros Passos No vou me prender em detalhes de banco e conexo. Eu usei um banco de dados de exemplo em Firebird que se encontra na pasta Examples do mesmo. Abra um projeto novo no Delphi e renomeie o formulrio corrente para frmChamaRel, coloque um Data Module e chame-o de dmDados e um segundo formulrio para frmRelEmpregados. Coloque os componentes no Data Module como mostra a Figura 1, apontando o SQLConnection para o banco EMPLOYEE.FDB da pasta C:\Arquivos de programas\Firebird\Firebird_1_5\examples.
Figura 1. Data Module com os componentes de conexo Coloque o SQL descrito na Listagem 1 no SQLDataSet na propriedade CommandText: Listagem 1 SQL do relatrio select e.emp_no, e.first_name, e.last_name, e.phone_ext, e.job_country, d.department from employee e Inner join department D On d.dept_no = e.dept_no Ligue os componentes e vamos seguir em frente... Criando o Relatrio Agora vamos comear a brincadeira com o Fortes Report. V para o form frmRelEmpregados. Adicione no formulrio o componente RLReport da paleta do Fortes (Fortes Report) e posicione-o conforme a Figura 2.
Figura 2. Posicionamento de RLReport no formulrio de impresso Este componente o que faz toda a manipulao dos outros componentes de impresso que j iremos ver. Pressione Alt+F11 para dar um Uses na unit do DataModule dmDados. Inclua um DataSource a este formulrio e aponte a propriedade DataSet ao ClientDataSet do DataModule. Inclua agora trs componentes RLBand ao RLReport e modifique as propriedades dos componentes do relatrio como descrito na Tabela 1. Componente RLReport1 Propriedade DataSource Title RLBand1 BandType Color Font/Style/fsBold RLBand2 BandType Font/Style/fsBold RLBand3 RLBand3 BandType BandType Valor DataSource1 Relatrio de Empregados btHeader ClSilver True btHeader True btDetail btFooter
Tabela 1. Valores para as propriedades dos comp. do relatrio Na primeira banda do relatrio, o ttulo do relatrio, insira um componentes RLLabel e dois RLSystemInfo. Altere as propriedades como descrito na Tabela 2. Componente RLLabel1 Propriedade Align Caption RLSystemInfo1 Align Info RLSystemInfo2 Align Valor faLeftTop linhadecodigo.com.br faCenterTop itTitle faRightTop
Info Text
Posicione agora na segunda banda do relatrio, RLBand, insira seis RLLabel e altere as propriedades como descrito na Tabela 3. Componente Todos RLLabel2 Propriedade Align Caption Left RLLabel3 Caption Left RLLabel4 Caption Left RLLabel5 Caption Left RLLabel6 Caption Left RLLabel7 Caption Left Valor faTopOnly N 0 Nome 48 Sobrenome 200 Ramal 392 Pas 448 Departamento 592 Tabela 3. Valores para as propriedades da banda de ttulo Na banda de detalhe, insira seis RLDBText, que sero os componentes DataWare contendo os dados de cada coluna da tabela. Veja a na Tabela 4 os valores de suas propriedades. Componente Todos Propriedade Align AutoSize DataSource RLDBText1 DataField Left RLDBText2 DataField Left RLDBText3 DataField Left RLDBText4 DataField Left RLDBText5 DataField Left Valor faTopOnly False DataSource1 EMP_NO 0 FIRST_NAME 48 LAST_NAME 200 PHONE_EXT 392 JOB_COUNTRY 448
RLDBText6
DataField Left
DEPARTMENT 592
Tabela 4. Valores para as propriedades da banda de detalhe E finalmente v para a ltima banda, que a de rodap, insira dois RLSystemInfo e altere as propriedades como descrito na Tabela 5. Componente RLSystemInfo3 Propriedade Align Info Text RLSystemInfo4 Align Info Text Valor faRightTop itDate Data: faRightTop itHour Hora:
Tabela 5. Valores para as propriedades da banda do rodap E para terminar este formulrio, v no evento BeforePrint e coloque a seguinte linha em negrito descrita abaixo em negrito: procedure TfrmRelEmpregados.RLReport1BeforePrint(Sender: TObject; var PrintIt: Boolean); begin dmDados.ClientDataSet.Open; end; Este evento ir abrir o ClientDataSet antes do incio da impresso. Salve este formulrio e v para o formulrio (frmChamaRel) que ir chamar o relatrio. O resultado final ficar como a Figura 3.
Figura 3. Posicionamento de de todos os componentes em RLReport no formulrio de impresso Chamando o Relatrio Agora iremos programar o formulrio para a chamada do relatrio propriamente dito. Insira um RadioGroup e um BitBtn e posicione-os como mostra a Figura 4.
Figura 4. Formulrio para chamada do relatrio Aperte Alt+F11 e de um Uses na unit que contm o relatrio.
No evento OnClick do boto coloque o cdigo descrito abaixo em negrito: procedure TfrmChamaRel.BitBtn1Click(Sender: TObject); begin If RadioGroup1.ItemIndex = 0 Then frmRelEmpregados.RLReport1.Preview() // preview do relatrio Else frmRelEmpregados.RLReport1.Print; // imprime direto para impressora end; Executando o relatrio O prximo passo executar o relatrio apertando F9 no Delphi. J executando, marque a primeira opo do RadioGroup e clique no boto Imprimir. O relatrio ser mostrado como na Figura 5.
Figura 5. Parte do preview do relatrio E depois, informe a opo Impressora e veja como sair a impresso no papel. Concluses Vimos aqui como podemos fazer um relatrio simples em um outro componente bem parecido com o Quick Report, que j vem com o Delphi, porm com vrias vantagens que poderemos ver em futuros artigos que sero publicados aqui no site. Abrao a todos e at a prxima. Links www.fortesinformatica.com.br Site para baixar os componentes do FortesReport, com instrues para instalao.
Agora adicione um novo form aplicao. Localize a aba Fortes Report e coloque um TRLReport. No Inspetor de Objetos expanda a propriedadeAllowedBands e coloque em True as opes btColumnHeader, btDetaile btHeader. Na propriedade DataSource selecione dsVenda, a tabela mestre. Agora coloque um TRLBand. Defina a propriedade BandType comobtHeader. Aumente a altura da banda e coloque um TRLLabel sobre aTRLBand. Defina a propriedade Caption como Relatrio de Vendas. Na propriedade Align selecione faCenter, para centralizar o rtulo na banda. Expanda a propriedade Font e defina Size como 14, por exemplo. Coloque um TRLSystemInfo no lado esquerdo da banda. Na propriedade Infoselecione itDate. Isso mostrar a data atual na banda. Coloque outroTRLSystemInfo, este no lado direito da banda e defina a propriedade Infocomo itPageNumber. Isso mostra o nmero da pgina. Coloque outro TRLBand e defina a propriedade BandType como btDetail. Sobre essa banda, que deve mostrar os dados da tabela mestre, coloqueTRLLabels definindo seus Caption como Venda, Data, Cliente, CDIGO,NOME, QTDE, PREO e TOTAL. Coloque tambm trs TRLDBTexts. Defina seus DataSource como dsVenda e DataField como ID_VENDA,DATA_VENDA e NOME.
A banda deve ser dimensionada adequadamente de acordo com a figura acima. Coloque um TRLSubDetail e defina a propriedade DataSourcecomo dsItem. Esta banda ir mostrar os dados da tabela detalhe. Expanda a propriedade AllowedBands e coloque em True as opes btDetail ebtSummary. Sobre essa banda coloque um TRLBand. Defina BandTypecomo btDetail. Coloque cinco TRLDBTexts e defina DataSource comodsItem. Em DataField informe ID_PRODUTO, NOME, QUANTIDADE, PRECO_VENDA e TOTAL. Coloque outro TRLBand sobre TRLSubDetaile defina BandType como btSummary. Esta banda usada para imprimir totais de relatrios ou grupos. Sobre esta banda coloque um TRLLable e defina seu Caption como Total da Venda:. Ao lado dele coloque umTRLDBResult. Este componente usado para totalizar uma coluna, por exemplo. Defina DataSource como dsItem. Em DataField informeTOTAL. A propriedade Info define a operao que ser realizada. Defina como riSum. que indica que a coluna TOTAL ser somada. Na propriedadeDisplayMask escreva #,###,##0.00. Isso ir formatar o valor mostrado. Pode-se definir DisplayMask para os TRLDBTexts referentes aPRECO_VENDA e TOTAL. No form que ir chamar o relatrio coloque um boto e no evento OnClick escreva o cdigo que mostrar uma prvia do relatrio: frmMestreDetalhe.rlVendas.Preview(); necessrio informar na clusula uses o nome da unit do relatrio. Abrir a conexo e as Queries tambm necessrio para que o relatrio seja visualizado.
Quem que nunca precisou , nunca utilizou um Arquivo Ini para carregar os parmetros de uma conexo no DbExpress . Tudo muito bonito e prtico , sem ter que recompilar a aplicao , s alterando o database no Arquivo Ini . Mas no se pode falar de parmetros de conexo do DbExpress sem entender as propriedades LoadParamsOnConnect , DriveName , connectionName e os mtodos Params.LoadFromFile e LoadParamsFromIniFile Existe uma mgica por trs disso , e na maioria das vezes fazemos sem entender ou no querermos entender o que esta passando , bem ao estilo : j que deu certo assim que eu vou fazer . E vamos simbora para o mundo dos sem Tempo . Mas agora a hora de mudar isto e evitar dores de cabea no futuro . No delphi crie novo projeto e adicione ao Form um Componente TButton. todos os exemplo abaixo podero estar sendo programados no evento Onclick . Declare na Uses da seco Interface ou implementation os namespaces DB, SqlExpr,dbxfirebird; Pois esteremos instanciando e configurando um objeto sqlconexao (tSqlConnection) em rumTime e precisaremos dessas unidades . Obs) Aqui eu estarei utilizando o Delphi2010 .Para uma verso anterior do Delphi2010 a diferena esta no Nome do Driver e da respectiva Unidade que o Driver foi definido . Pode-se fazer todos os Teste escolhendo o DiverName Interbase (Nativo do Delphi) e definindo na Uses a Unidade DBXpress no lugar do dbxfirebird Vamos comear com a propriedade LoadParamsOnConnect . Esta propriedade esta no Objecto inspector , e tem um impacto importante neste processo. O Padro desta propriedade False , mas quando cetada para True , o SqnConnection carrega para a propriedade params o Driver que esta definido na propriedade ConnectionName . Para isto este Driver deve existir no Arquivo dbxconnections.ini . Veja o exemplo abaixo 1)Exemplo com a Propriedade LoadParamsOnConnect cetada em True
01 var
02
sqlConexao:TSQLConnection;
03
begin
04
sqlConexao:=TSQLConnection.Create(nil);
05
try
06
sqlconexao.Close;
07
sqlconexao.ConnectionName:='EMPLOYEE_2_1.FDB';
08
sqlconexao.DriverName:='FIREBIRD';
09
sqlconexao.LoadParamsOnConnect:=true;
10
sqlconexao.LoginPrompt:=false;
11
sqlconexao.Open;
12
13
finally
14
sqlConexao.Free;
15
end;
16
end;
ps)no meu caso particular eu tenho um Driver de Nome [EMPLOYEE_2_1.FDB] no Arquivo dbxconnections.ini Perceba que o SqlConexao , procurou no Arquivo DBXCONNECTIOS.INI a definio do driver EMPLOYEE_2_1.FDB e carregou na propriedade params do SqlConexao . Alterando agora , esta propriedade para False , ser nossa a responsabilidade de passar um Arquivo Ini Vlido , para isto iremos carregar este Arquivo ini para a propriedade params do SqlConexao . Para fazer isto temos os mtodos Params.LoadFromFile ouLoadParamsFromIniFile . H uma diferena sutil e significativa entre eles . No diretorio do exe da aplicao defina um Arquivo Ini com as seguintes configurao . Salve este Arquivo com o Nome de Config.ini . Veja que este Driver tem um Nome , que no caso [EXEMPLO.FDB] . Guarde este nome pois iremos precisar dele
01
[EXEMPLO.FDB]
02
drivername=FIREBIRD
03
blobsize=-1
04
commitretain=False
05
06
localecode=0000
07
password=masterkey
08
rolename=RoleName
09
sqldialect=3
10
isolationlevel=ReadCommitted
11
user_name=sysdba
12
waitonlocks=True
13
trim char=False
02
sqlConexao:TSQLConnection;
03
begin
04
sqlConexao:=TSQLConnection.Create(nil);
05
try
06
sqlconexao.Close;
07
08
sqlconexao.DriverName:='FIREBIRD';
09
sqlconexao.LoadParamsOnConnect:=False;
10
11
sqlconexao.LoginPrompt:=false;
12
sqlconexao.Open;
13
showmessage(sqlconexao.Params.Text);
14
finally
15
sqlConexao.Free;
16
end;
17
end;
3)Utilizando o LoadParamsFromIniFile(config.ini);
01 var
02
sqlConexao:TSQLConnection;
03
begin
04
sqlConexao:=TSQLConnection.Create(nil);
05
try
06
sqlconexao.Close;
07
08
sqlconexao.DriverName:='FIREBIRD';
09
sqlconexao.LoadParamsOnConnect:=False;
10
sqlconexao.LoadParamsFromIniFile('config.ini');
11
sqlconexao.LoginPrompt:=false;
12
sqlconexao.Open;
13
showmessage(sqlconexao.Params.Text);
14
finally
15
sqlConexao.Free;
16
end;
17
end;
perceba que a diferena que o mtodo LoadParamsFromIniFile so carrega para o Params se o Nome do Driver , que no nosso caso [EXEMPLO.FDB] , for vlido , Isto , seexistir o Alias [EXEMPLO.FDB] no Arquivo Config.Ini . Mas ateno , alm desse quesito de segurana , existe ainda uma caracteristica mais importante neste mtodo , que a possibilidade de carregar para o params um Driver especifico . Vc pode ter no Arquivo Config.ini vrios drivers criados definidos por vc , e em tempo de execuo , escolher qual o driver que vc quer se conectar , so alterando o valor do sqlconexao.ConnectionName. Recapitulando : Assim como no Dbxconnections.ini tem vrios drivers definidos , podemos ter tambm no config.ini varios drivers e escolher qual deles acessar com a propriedade sqlconexao.ConnectionName e carregando com o mtodoLoadParamsFromIniFile . Vamos agora entender a propriedade DriveName do SqlConnection . A principio o nome do Driver que estamos utilizando , porm introduz no params algumas propriedades caracterstica do Driver Mas internamente qnd se atribui um nome de um Driver para esta propriedade , o delphi no mtodo procedure TSQLConnection.SetDriverName(Value: string); faz uma srie de operaes , atribuies , comparaes , de modo que ele recria o Params do Sqlconnection . Agora PENSE e tente escolher qual das duas situaes mais indicado
01 var
02
sqlConexao:TSQLConnection;
03
begin
04
sqlConexao:=TSQLConnection.Create(nil);
05
try
06
sqlconexao.Close;
07
sqlconexao.ConnectionName:='Exemplo.FDB';
08
sqlconexao.LoadParamsOnConnect:=False;
09
10
sqlconexao.LoadParamsFromIniFile('config.ini');
11
sqlconexao.LoginPrompt:=false;
12
sqlconexao.Open;
13
showmessage(sqlconexao.Params.Text);
14
finally
15
sqlConexao.Free;
16
end;
17
end;
e/ou
01 var
02
sqlConexao:TSQLConnection;
03
begin
04
sqlConexao:=TSQLConnection.Create(nil);
05
try
06
sqlconexao.Close;
07
sqlconexao.ConnectionName:='Exemplo.FDB';
08
sqlconexao.LoadParamsOnConnect:=False;
09
sqlconexao.LoadParamsFromIniFile('config.ini');
10
11
sqlconexao.LoginPrompt:=false;
12
sqlconexao.Open;
13
showmessage(sqlconexao.Params.Text);
14
finally
15
sqlConexao.Free;
16
end;
17
end;
Ao fazermos Sqlconexao.DriverName:=FIREBIRD aps termos carregado o params por um dos mtodos anteriores (LoadParamsFromIniFile , params.LoadFromFile) , estaremos recriando o params e com isto algumas definies sero sobre escritas . Por isto Sugerimos que a atribuio do Nome do Driver Ocorra antes de carregar os parmetros com o Arquivo Ini , conforme estamos fazendo desde o inicio Consideraoes finais:
A propriedade LoadParamsOnConnect em true o Driver carregado ser do Arquivo dbxconnections A propriedade LoadParamsOnConnect em False o Driver carregado ser definido por nos e carregado por um dos mtodos (LoadParamsFromIniFile e/ou params.LoadFromFile) A diferena alm da segurana entre o mtodo LoadParamsFromIniFile do params.LoadFromFile que o primeiro temos condues de escolher qual o Driver que queremos acessar , basta definir corretamente a propriedade connectionName
Por ltimo vimos que o Nome do driver deve vir antes de carregar o params do sqnconection
Com isto terminamos este artigo , Lembrando que qualquer dvida , opinio , manifestao estaremos de prontido e aptos para receber qualquer tipo de crtica .espero ter sido til agradeo a pacincia , meu muito obrigado e at a prxima .
CategoryPanelGroup Outro componente que achei muito bom, pois tem a capacidade de criar painis e dentro desses, adicionar controles. Com isso, podemos fazer um painel de navegao semelhante ao NavBar da sute DevExpress. Se voc no conhece o NavBar, veja nesse link: www.devexpress.com/Products/VCL/ExNavBar. Vamos criar um painel de navegao muito incrementado. Adicione o controle em um formulrio. Adicione trs painis, clicando com o boto direito e escolhendo Add Panel. Na propriedade Images do CategoryPanelGroup, vamos vincular um ImageList com imagens grandes, do tipo 24x24, que so as imagens que aparecero no ttulo dos painis. Voc pode configurar a imagem que vai aparecer quando o painel estiver expandido ou recolhido, quando o mouse passar sobre a imagem, tudo isso usando as propriedades:XXHotImageIndex, XXImageIndex e XXPressedImageIndex, onde o XX indica ser Collapsed ou Expanded. Vamos configurar a imagem dos painis e dar ttulos aos mesmos (propriedade Caption), exemplificado pela Figura 6.
Figura 6. Configurando ttulos e imagens do painel Agora, vamos adicionar um Button ao primeiro painel. Altere as seguintes propriedades do Button: Align = alTop, Style = bsCommandLink. Adicione um ImageList no formulrio com imagens do tamanho 16x16 ou a seu critrio. As mesmas sero vinculadas aos botes. Vincule o ImageList ao boto, atravs da propriedades Images e adicione a imagem atravs da propriedadeImageIndex. Para finalizar a configurao do boto, vamos incluir um texto alternativo sobre o Caption do boto, usando a propriedade CommandLinkHint. Veja que temos um Caption e um texto abaixo do mesmo. Esse padro do Windows Vista, portanto essa configurao s funciona nesse SO (ou claro no Windows 7). Claro, que poderamos ter uma ActionList para concentrar as regras dos botes, mas aqui, vamos apenas copiar e colar os botes, alterando apenas Caption, CommandLinkHint e ImageIndex. Veja na Figura 7 como fica o componente na sua configurao final.
Figura 7. CategoryPanelGroup configurado BallonHint Outro controle bastante requisitado pelos desenvolvedores um Hint mais incrementado. Agora, controles visuais, receberam uma nova propriedade chamada CustomHint, nela vamos vincular um BallonHint para mostrar dicas em formato de balo, com ttulo, subttulo e imagens. Se voc no quiser usar o CustomHint do controle, no tem problema, seu hint continuar funcionando perfeitamente. No BalonHint, configuramos um ImageList atravs da propriedade Imagens. Aps, vinculamos o BallonHint, atravs doCustomHint do controle. Na propriedade Hint, escrevemos a dica que ser mostrada. Podemos dividir o texto em trs partes: a primeira o ttulo do Hint, a segunda um texto auxiliar e a terceira, a imagem que vamos usar. Elas devem ser separadas pelo caractere pipe |, assim um hint pode ser colocado com o seguinte valor: Cadastro|Cadastro de Clientes|2. O primeiro texto, ser o ttulo do balo, o segundo a descrio do hint e o ltimo o ndice da imagem que temos no ImageList vinculado ao BallonHint. Se quisermos, podemos "jogar" com essas trs opes, por exemplo: Cadastro||2, no mostrar a descrio do hint, somente o ttulo e a imagem. Assim, podemos mostrar vrias formas diferentes, sem esquecer claro, de colocar o caractere | para separar as partes (Figura 8).
Figura 8. CategoryPanelroup configurado Atualizaes Tivemos algumas alteraes nos componentes para a verso 2009/2010 do Delphi. Button: recebeu uma propriedade chamada Style, onde podemos configurar o boto no estilo Vista com uma descrio auxiliar (como vimos no exemplo do CategoryPanelGroup). Temos tambm no Style uma configurao para que seja mostrado a opo de mostrar uma lista suspensa, usando o tipo bsSplitButton. Depois, basta configurar a propriedade DropDownMenu com um PopupMenu para ter as opes ao clicar no boto (Figura 9).
Figura 9. Button com estilos diferentes ListView: agora podemos criar grupos para os itens do ListView. Vale ressaltar que essa funcionalidade esta presente apenas no ambiente do Windows Vista. Adicione um ListView e crie dois grupos, clicando com o boto direito e escolhendo o item Groups Editor. Em Header indicamos o texto que ser mostrado no grupo. Crie uma coluna e alguns itens. No editor de itens, agora temos mais uma opo que se refere ao grupo ao qual o item estar vinculado, como podemos ver na Figura 10.
Figura 10. Vinculando o item ao grupo Basta indicar as imagens que deseja e temos um ListView com um layout com grupos (Figura 11).
Figura 11. ListView com grupos Outras novidades Novo Search no editor de cdigo Aproveitando o padro utilizado em browsers (FireFox e Internet Explorer) onde o texto a ser localizado fica sombreado, agora temos a mesma funcionalidade no IDE do Delphi. No editor de cdigo, aperte Crtl+F e ser mostrada uma barra inferior no editor para a digitao do texto de busca (Figura 12).
Figura 12. Configuraes para localizar texto Digite o texto e veja que o mesmo sombreado e todas as palavras encontradas so tambm destacadas (Figura 13)
Figura 13. Configuraes para localizar texto Melhoria no dialog Use Unit Agora para adicionar uma unit (ALT + F11), podemos filtrar pelo nome das mesmas e tambm podemos escolher se vamos adicionar a referncia na seo Interface ou Implementation (Figura 14).
Figura 14. Novo editor para adicionar referencia de units Melhoria no debugger para visualizar dados
Agora podemos visualizar valores para variveis do tipo TDate, TDateTime ou TTime, o que ajuda em muito a usabilidade do debugger no desenvolvimento. Assista na vdeo-aula disponvel, um exemplo da utilizao dessa nova funcionalidade do IDE. Concluso Vimos neste artigo, algumas novidades do maior e melhor Delphi lanado at hoje. Temos muitas outras novidades que no cabem nesse artigo. Fica a dica para voc se aprofundar mais, verificando vdeos e artigos no site da Embarcadero ou aqui na The Club. Um grande abrao a todos e sucesso em seus projetos!