terça-feira, 30 de setembro de 2008
O DELPHI é um POETA.!
É gurizada no primeiro post, não saiu artigo por causa disso ai oh ...rsrsrs
segunda-feira, 29 de setembro de 2008
Artigo Nº 14: Performance em consultas com Stored Procedures
Veremos um exemplo de utilização de cursores no Banco Firebird, cursores são normalmente utilizados para retornar mais de um registro em uma SP, entre outras funcionalidades.
Criando nossa Stored Procedure:
CREATE PROCEDURE SP_CLIENTES (
cep integer)
returns (
nome varchar(100),
endereco varchar(100))
as
begin
for select clientes.nome,clientes.endereco from clientes
where clientes.cep = :cep
into :nome, :endereco do
suspend;
end^
O uso do for/selec/do caracteriza o uso do cursor.
Após criada nossa SP, para chamá-la basta realizarmos um simples select passando o parâmetro:
select * from sp_clientes(98910000)
Para consultas pesadas no BD, as SPs são uma ótima alternativa para aumentar a performance.
Abraço e até a próxima.
PS: O post mais comentado do blog foi simplesmente excluído pelo nosso administrador...
PS2: Tudo bem, a gente sabe que o blog não trata desse assunto, foi mesmo só pra tirar um pouco com o Azuis..., faz parte tb...
Artigo Nº 13: Carregar Lista de Dados em C#
Cria-se uma nova classe com o nome de BancoDados e dentro desta um objeto de conexão Odbc ficando assim.
public OdbcConnection sCon;
sCon = new OdbcConnection("Driver={SQL Native Client}; Server=crack\\sqlexpress; Database=prop; Uid=sa; Pwd=123456;");
Onde dentro dos parenteses seria a string de conexão no caso com SQL Server. Criado este objeto vamos criar duas funções, uma para abrir a conexão com o banco e outra para fechar a conexão com o banco. Vamos lá então. A primeira:
// Publica para ser chamada de qualquer lugar e VOID por que não retorna nada
public void Conecta()
{
try // Tratamento de Erros
{
if (sCon.State == 0) // Se fechada a conexão, abre ela
{
sCon.Open(); // Abre a conexão
}
}
catch (Exception e)
{
throw new Exception("Não Conectou: " + e.Message);
}
}
Pois então esta feito a primeira agora a segunda:
// Já foi explicado antes o por que do public e do void
public void Desconecta()
{
try
{
sCon.Close(); // Fecha a conexão
}
catch (Exception e)
{
throw new Exception("Erro: " + e.Message);
}
}
Bom, nossa primeira classe está pronta, agora vamos para a classe que retornará dados do banco de dados para uma GridView. Cria-se uma nova classe com o nome de usuarios. Nesta vamos criar uma function apenas.
// Publica e retorna um DataSet.
public DataSet Usuarios()
{
Bom, nossa primeira classe está pronta, agora vamos para a classe que retornará dados do banco de dados para uma GridView. Cria-se uma nova classe com o nome de usuarios. Nesta vamos criar uma function apenas.
// Publica e retorna um DataSet.
Muito bom, criamos as 2 classes que vamos utilizar. Cria-se uma nova página .aspx para que assim possamos buscar os dados com a nossa classe. Adicione nesta página aspx uma gridview e nomeie ela como desejar, aqui usaremos GVUsuarios como nome dela. Agora vamos no evento OnLoad da página aspx e lá vamos chamar a nossa classe.
// Define novamente uma variável para uma classe
usuarios User = new usuarios();
// Agora diz que o DataSource da GridView é o nosso DataSet
GVUsuarios.DataSource = User.Usuarios();
// Atualiza a tabela
GVUsuarios.DataBind();
Agora abaixo vocês podem ver o resultado final, mas é claro que vocês devem definir os campos que vocês querem trazer na GridView
Teclas de Atalho Delphi
Ctrl+F7: Executa a opção de debug Evaluate/Modify para verificar o conteúdo da variável selecionada em tempo de debug.
Ctrl+F5: Adiciona um Watch para a variável selecionada em tempo de debug.
Ctrl+Shift+F11: Chama as opções do projeto.
Ctrl+Shift+I: Indentar multiplas linhas de código de uma única vez em "n" espaços (conforme o que estiver especificado em Tools/Editor Options/General/Block Indent).
Ctrl+Shift+U: Recuar indentação em "n" espaços (ídem acima).
Ctrl+Shift+0 a 9: Inserir um Bookmark no editor de código.
Ctrl+: troque n pelo número do Bookmark.
Ctrl+Shift+0: para desmarcar um Bookmark.
Alt+G: Ir para uma determinada linha.
Ctrl+Shift+Seta (cima/baixo): Intercala entre o cabeçalho da procedure/função e a implementação da mesma.
Ctrl+Shift+C: Complementacao de Classes.
Ctrl+Shift+Up: Vai para a seção interface.
Ctrl+Shift+Down: Vai para a seção implementation.
Ctrl+Mouse: Clique com o botão esquerdo do mouse mantendo pressionada a tecla Ctrl sobre a chamada a uma procedure/function/variável para localizá-la na unit atual ou em outra unit.
Ctrl+J (Code Templates): Exibi templates de códigos.
Ctrl+Shift+J (Delphi 2006): Executar o SyncEdit para alterar variáveis com mesmo nome de uma só vez após a seleção de um bloco de código.
Ctrl+O+U: Alterna a caixa (maiúscula/minúscula) do código selecionado.
Ctrl+K+E: Converter o código selecionado para minúsculas.
Ctrl+K+F: Converter o código selecionado para maiúsculas.
Ctrl+E: Ativa a busca incremental. Sem a necessidade de teclar (Ctrl+F).
Ctrl+Shift+Setas: Mover o(s) componente(s) selecionado(s) rapidamente no form.
Ctrl+Setas: Move o componente pixel a pixel.
Shift+Setas: Redimensiona o componente pixel a pixel.
Ctrl+Alt+P (Delphi 2006...): Seleciona a Paleta de Ferramentas possibilitando a filtragem dos componentes ao se digitar seus nomes.
Ctrl+Shift+E (Delphi 2006...): Executa o Refactoring de modificação de nomes de variáveis, procedures/functions e propriedades.
Ctrl+Shift+A (Delphi 2006...): Executa o Refactoring Find Unit, que localiza as units onde as variáveis são declaradas e as coloca na seção uses automaticamente.
Ctrl+Shift+V (Delphi 2006...): Refactoring de declaração de variável, pressiona-se este atalho para declará-la localmente.
Ctrl+Shift+D (Delphi 2006...): Refactoring de declaração de atributo, pressiona-se este atalho para declará-lo na classe.
Ctrl+Shift+F9 (Delphi 2006...): Executa a aplicação sem a opção de depuração (Debug). A execução fica mais rápida.
Referências: Imasters, Marlos Waquim
sexta-feira, 26 de setembro de 2008
Artigo Nº 12: JavaScript Limitador e Contador de Caracteres
Montando o layout
Com a sua aplicação já criada, coloque um TextBox e logo abaixo coloque a seguinte frase:
Faltam ainda 99 caracteres.
Depois vá para o código .aspx da sua página, e procure o número da frase acima (esse número pode ser quanto a sua necessidade) e o substitua pelo seguinte código HTML:
99
É nessa tag span é que vai mostrar o número de caracteres que faltam.Aproveitando, dentro da tag do componente TextBox, coloque o código HTML abaixo, o evento onkeyup, evento acionado depois que clicar e voltar qualquer tecla do teclado.
onkeyup="LimitarCaracter(TextBox1, ContaCaractere,'99');"
Então, quando soltar qualquer tecla, será acionado o evento e executará a função “LimitarCaracter”, passando alguns parâmetros, como por exemplo: “TextBox1” id do TextBox, “ContaCaractere” id do SPAN e “99”, número máximo de caracteres e esse número tenque ser o mesmo a do SPAN.Caso seja necessário colocar a mesma função em outro evento, sinta-se a vontade. Ex.: onmousemove, evento quando passar o mouse sobre o TextBox.
Veja a figura 01 como que fica o código .aspx.
Figura 01: Codigo .aspx
Escrevendo a Função
Agora vamos criar a função JavaScript, para contar e limitar os caracteres. Abra o bloco de notas e salve dentro do diretório do projeto com o nome de Funcoes.js, arquivo responsável por armazenar todas as funções JavaScript do seu projeto. É uma maneira de deixar seus códigos mais organizados.
Feito isso, copie a função abaixo e salve:
function LimitarCaracter(idCampo, idContador, TamMax)Na linha 1, é declarado a função com o mesmo nome que foi definido no evento do TextBox, com as respectivas variáveis.
{
Caracteres = TamMax - document.getElementById(idCampo).value.length;
document.getElementById(idContador).innerHTML = Caracteres;
if(document.getElementById(idCampo).value.length >= TamMax)
{
document.getElementById(idCampo).value = document.getElementById(idCampo).value.substring(0, TamMax);
document.getElementById(idContador).innerHTML = "0";
}
}
Linha 3 , aplica na variável, a subtração do número máximo pela quantidade de caracteres que já possui no TextBox, resultando no número de caracteres que ainda faltam para chegar no máximo.
Linha 4, escrever na tag SPAN, o resultado.
Linha 5, verifica se número de caracteres que já tem no TextBox é maior ou igual ao número máximo permitido.
Se for verdadeira a condição, na linha 7, escreve no TextBox somente os caracteres que não ultrapassam o número máximo, caso passa da quantidade, apaga-se todos os caracteres a partir desse. E na linha 8, escreve na tag SPAN, o número zero.
Agora vá novamente no código .aspx da sua página e dentro da tag , localizada no início do código, coloque o script abaixo, responsável por linka a página com o arquivo das funções.
Feito tudo isso, compilando o resultado é de acordo com a figura 2.
Figura 02: Resultado
Caso tenha mais de um TextBox por página para realizar esse procedimento, faça tudo da mesma maneira, mas só substitui o id do TextBox e do SPAN, por outro qualquer e coloque-os na função do evento.
Ex:
onkeyup="LimitarCaracter(TextBox2, ContaCaractere2,'999');"
Um abraço e até o próximo post. Obrigado.quarta-feira, 24 de setembro de 2008
Delphi Tour em Porto Alegre
O evento foi voltado a desenvolvedores de software, arquitetos de sistemas, líderes de projetos de software e gerentes de desenvolvimento, onde tiveram a oportunidade de conhecer os novos recursos do Delphi 2009, tais como: globalização de aplicações, criação de interfaces ricas para desktop, escalabilidade de aplicações e muito mais.
Entre as novas funcionalidades da ferramenta de desenvolvimento, o Delphi 2009 traz diversos avanços na VCL (Visual Component Library, ou Biblioteca de Componentes Visuais), permitindo a criação de aplicações com interface Ribbon (Recursos presentes no Office 2007), suporte a UNICODE (suporte a código de padrão mundial) e tradução de aplicações. Além disso, vem com o novo DataSnap framework, integrado ao dbExpress e sem dependência da tecnologia COM (Component Object Model).
A empresa Embarcadero Technologies é a nova "dona" de ferramenta Delphi, onde a ferramenta só tende a crescer com mais força, pois a empresa dispõe de uma equipe com mais de 120 pessoas trabalhando no desenvolvimento e melhoramentos da ferramenta. Segundo Andreano, o Brasil ainda é considerado pequeno frente a outros países, como por exemplo a Rússia investiu neste ano, 1 milhão de licenças para distribuir entre escolas de Ensino Fundamental e Médio.
terça-feira, 23 de setembro de 2008
Artigo Nº 11: Resolvendo o erro de acesso negado no Delphi 2007 após instalar IE 7
Para abrir o arquivo de registro do Windows vá a executar->regedit, vai abrir a janela do editor de registro, vá para Meu Computador->HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Internet Explorer->Main->FeatureControl->FEATURE_OBJECT_CACHING e clique em Novo->Valor DWORD, nomeie de bds.exe e atribua valor 0. Veja imagem abaixo.
Feito isso, feche o editor, reinicie o computador e pronto.
Também existe uma solução pronta, basta baixar o arquivo deste link(http://www.stevetrefethen.com/files/FEATURE_OBJECT_CACHING.reg) e executar que faz a mesma coisa.
Até.
sexta-feira, 19 de setembro de 2008
Artigo Nº 10: Cuidados com Performance em ASP.NET
DataReader x DataSet
DataReader
Observação importante: A conexão utilizada pelo DataReader deve ser aberta e fechada manualmente (exceto quando você informa que ela deverá ser fechada automaticamente)
Observação importante: A conexão utilizada pelo DataSet não necessita ser aberta e/ou fechada manualmente. Ao chamar o método Fill do DataAdapter a conexão é aberta, são coletados os dados solicitados e a conexão é fechada.
Observação sobre os objetos Connection: É importante ressaltar que todas as conexões abertas manualmente devem ser fechadas manualmente (exceto quando chamar o ExecuteReader utilizando o CommandBehavior.CloseConnection). As conexões abertas e não fechadas, permanecerão abertas mesmo quando seu código estiver fora de escopo. As mesmas não serão fechadas automaticamente, e nem mesmo destruídas pelo Garbage Collector.
sexta-feira, 12 de setembro de 2008
Artigo Nº 09: CPF Válido - Javascript
//***********************************SCRIPT 100% DEVELOPED BY GABOWS#888***********************************\\
//if you're going to change or use this code, do not cut off these lines!
//se você vai alterar ou utilizar este codigo, não retire estas linhas!
//***********************************gabows888@yahoo.com.br***********************************\\
function criar(){
var cnpj=document.getElementById('cpf').value;
if(cnpj.length!=9){
alert("Preencha os nove campos!");
return false;
}
if(isNaN(cnpj)){
alert("Preencha somente com dados numéricos!");
return false;
}
if(cnpj!=!isNaN){
for(i=0;i<=cnpj.length;i++) total=cnpj.length; campo01=0; campo02=0; n1=cnpj.substring(0,total-8); n2=cnpj.substring(1,total-7); n3=cnpj.substring(2,total-6); n4=cnpj.substring(3,total-5); n5=cnpj.substring(4,total-4); n6=cnpj.substring(5,total-3); n7=cnpj.substring(6,total-2); n8=cnpj.substring(7,total-1); n9=cnpj.substring(8,total); tt1=parseFloat((n1*10)+(n2*9)+(n3*8)+(n4*7)+(n5*6)+(n6*5)+(n7*4)+(n8*3)+(n9*2)); div1=(tt1%11); if(div1<2){>=2){
campo01+=parseFloat(11-div1);
}
tt2=parseFloat((n1*11)+(n2*10)+(n3*9)+(n4*8)+(n5*7)+(n6*6)+(n7*5)+(n8*4)+(n9*3)+(campo01*2));
div2=(tt2%11);
if(div2<2){>=2){
campo02+=parseFloat(11-div2);
}
alert(n1+''+n2+''+n3+''+n4+''+n5+''+n6+''+n7+''+n8+''+n9+'-'+campo01+''+campo02);
return;
}
}
terça-feira, 9 de setembro de 2008
Artigo Nº 08: Customizando Calendar Extender com CSS no Rad Studio 2007
No Artigo Nº 05, foi comentado como aplicar o componente Calendar Extender do pacote Ajax Control Toolkit, agora vamos customizar o layout dele com estilo CSS.
Para começar, crie uma nova pasta chamada "estilos", dentro da pasta do projeto da aplicação. Depois, abra o bloco de notas ou notepad++ e salve esse arquivo dentro dessa pasta com o nome de "estilos.css", depois copie o código abaixo e cole no arquivo.
.calendario .ajax__calendar_container /*formatação da parte externa de onde encontra-se o corpo do calendário */
{background-color:#8080FF; border:solid 1px #004000;}
.calendario .ajax__calendar_header /*formatação do cabeçalho*/
{background-color:#ffffff; margin-bottom:3px; border:solid 1px #004000; width:170px;}
.calendario .ajax__calendar_title /*formatação do texto que encontra-se no cabeçalho*/
{color:black;}
.calendario .ajax__calendar_body /*formatação interna de onde se encontra o calendário(onde estão os dias do respectivo mês)*/
{background-color : white ;border : solid 1px #004000 ;}
.calendario .ajax__calendar_dayname /*formatação da descrição dos dias da semana*/
{text-align : center ; font-weight : bold ; margin-bottom : 4px ;margin-top : 2px ;color : blue;}
.calendario .ajax__calendar_day /*formatação dos dias do mês*/
{text-align : center ;color: black;}
.calendario .ajax__calendar_hover .ajax__calendar_day /*formatação para quando passar o mause sobre um determinado dia*/
{color: red;}
.calendario .ajax__calendar_hover .ajax__calendar_month /*formatação para quando passar mause sobre um determinado mês*/
{color: red;}
.calendario .ajax__calendar_hover .ajax__calendar_year /*formatação para quando passar o mause sobre um determinado ano*/
{color: red;}
.calendario .ajax__calendar_active /*formatação do dia, quando já possui uma data no textbox de controle*/
{background-color: #D4D0C8 ;font-weight : bold ; }
.calendario .ajax__calendar_today /*destaque para a data atual(Today)*/
{ font-weight : bold ; color : black;}
.calendario .ajax__calendar_other .ajax__calendar_day/*formatação dos dias que não pertencem ao mês selecionado*/
{color:#6A5ACD;}
.calendario .ajax__calendar_hover .ajax__calendar_today /*formatação para quando passar o mouse sobre a data atual(Today)*/
{color: #FFFFFF}
.calendario .ajax__calendar_hover .ajax__calendar_title /*formatação para quando passar o mouse sobre o texto do título*/
{color : red ; }
Salve e depois vá para o .aspx da página que você está utilizando o componente e dentro da tag HEAD, coloque o código seguinte logo abaixo da tag TITLE. Esse é o código responsável por buscar os estilos e aplicar na sua página.
Agora no design da página, selecione o componente CalendarExtender e na propriedade CssClass digite calendario, nome dado ao estilo. Daí só compilar e ver o resultado.
Mais detalhes, veja a edição 99 da revista ClubeDelphi.
segunda-feira, 8 de setembro de 2008
quarta-feira, 3 de setembro de 2008
Artigo Nº 05: Usando Calendar Extender e Mask Edit do Ajax Control Toolkit no Rad Studio 2007
Adicionar os componentes ScriptManager e UpdatePanel na página.
Selecionar o ScritManager e alterar para True as propriedades EnableScriptGlobalization e EnableScriptLocalization no Object Inspector.
Alterar ou adicionar na Web.config o termo "GLOBALIZATION" por "<globalization culture="pt-BR" uiCulture="pt-BR"/>" (para traduzir o calendário em português).
Abrir o arquivo .aspx verifique se a tag "head" está como runat="server", caso não esteja, coloque-a.
OBS: o código do head deve ser alterado para todas as páginas, indiferente se terá ou não CalendarExtender.
CALENDÁRIO
Quando clicar no textbox:
Adicionar um TextBox, depois o componente CalendarExtender(para isso deve estar instalado o Ajax Control Toolkit), não precisa ser necessariamente ao lado do textbox, e sim no fim dos layout, mas dentro do UpdatePanel, isso porque o componente, no Delphi não no navegador, ocupa um espaço e assim desconfigurando o visual
Selecione o CalendarExtender e altere as seguintes propriedades:
targetcontrolid=(nome do textbox que receberá a data selecionada)
format=dd/MM/yyyy (formato da data)
firstdayofweek=Sunday (qual será o primeiro dia da semana que exibirá no calendário)
popupPosition = Rigth (como o calendário será exibido)
Quando quer colocar uma imagem para exibir o calendário:
Faça tudo da mesma forma que a de anterior
Coloque o componente ImageButton e o nome do ImageButton, colocar na propriedade PopupButtonID do "CalendarExtender".
MÁSCARA
Adicionar o componente "MaskEditExtender" da mesma forma que o "CalendarExtender" e alterar as seguintes propriedades:
TargetControlID= selecionar o textbox de controle
Selecione o TextBox e no objector Inspector procure as propriedade Extenders e altere as seguintes propriedades:
mask="99/99/9999"
masktype="Date"
No próximo artigo estaremos mostrando estilos CSS para o componente CalendarExtender;
terça-feira, 2 de setembro de 2008
Artigo Nº 04: Trabalhando com datas no Delphi .NET usando DateUtils
De início declare na uses a biblioteca: DateUtils, esta possibilita várias funções de cálculo de datas, segue um exemplo de cálculo de dias, onde temos a data atual e queremos somar a mesma com determinado valor de dias:
No load da página, preencho o label com a data atual:
Label3.Text := DateTime.Now.ToString('dd/MM/yyyy');
Coloco um TextBox e outro Label onde visualizarei o resultado do cálculo, e tb um button. No click do Button vai o seguinte:
Label4.Text := IncDay(convert.ToDateTime(Label3.Text),Convert. ToInt16(TextBox1.Text)).ToString;
Existem diversas outras funções desta biblioteca, que com certeza serão uteis algum dia.
Abraço e até a próxima!
segunda-feira, 1 de setembro de 2008
Artigo Nº 03: Exibir um somatório no rodapé da datagrid
bdpCom := BdpCommand.Create('SELECT SUM(HORAS) AS FEITAS FROM HORAS WHERE BOLSA = ?', Dados.CONEXAO);
try
bdpCom.Parameters.clear; // Limpa os parâmetros.
bdpCom.Parameters.Add('BOLSA', BdpType.&String); //Adiciona um parâmetro.
//====================================
bdpCom.Parameters['BOLSA'].Value := BOLSA; //Da um valor para o parâmetro criado.
bdpRead :=bdpCom.ExecuteReader;
if bdpRead.read then//Se o reader tiver algo nele, retorna o seu valor se não retorna 0.
Result := bdpRead['FEITAS'].ToString
else
Result := '0';
finally
bdpCom.free; // Libera da memória
bdpRead.free;
end;
Onde o deve-se utilizar o comando ExecuteReader do bdpCommand no componente bdpRead, e após isto uma simples verificação para ver se retornou algo da consulta onde foi realizada um SUM(CAMPO), sempre é claro lembrando de liberar da memória os componentes (após o finally). E retornando no Result a variavel dbpRead[‘FEITAS’] que é o nosso dbpReader. Após isto, vá na DataGrid e habilite a opção ShowFooter para exibir o rodapé. Agora adicione o evento ItemDataBound na DataGrid para que quando esteja sendo desenhado cada linha ele efetue o comando desejado.
Neste evento deve-se adicionar o seguinte comando:
if e.Item.ItemType = ListItemType.Footer then // Se estiver no rodapé executa
e.Item.Cells[7].Text := Soma (Session['BOLSA'].ToString);
Primeiro se verifica se na hora de desenhar ele esta no rodapé, se sim ele joga para a coluna 7 o valor retornado pela nossa função, abaixo esta a foto do resultado final, é claro que o resto dos campos espera-se que sejam criados manualmente, alias uma ultima coisa.... Isto não funcionará caso exista paginação na datagrid pois na função ele trás logo o total e não o total das linhas que estão aparecendo.
Bom, creio que seja isto.... Até mais!
Artigo Nº 02: GridView em DELPHI .NET
Olá a todos!
Este tutorial é sobre GridView em RAD Studio .NET, ASP.NET.
- Adicionar Colunas em Tempo de Execução
Em alguns casos é necessário adicionar colunas em tempo de execução em uma GridView, isso pode ser feito adicionando um código parecido com este no evento que desejar:
var CAMPO1, CAMPO2, CAMPO3, CAMPO4 : BoundField; begin CAMPO1 := BoundField.Create; CAMPO2 := BoundField.Create; CAMPO3 := BoundField.Create; CAMPO4 := BoundField.Create; try CAMPO1.HeaderText := 'Código'; CAMPO1.DataField := 'CODIGO'; CAMPO2.HeaderText := 'Nome'; CAMPO2.DataField := 'NOME'; CAMPO3.HeaderText := 'Idade'; CAMPO3.DataField := 'IDADE'; CAMPO4.HeaderText := 'Telefone'; CAMPO4.DataField := 'TELEFONE'; GridView1.Columns.Insert(0,CAMPO1); GridView1.Columns.Insert(1,CAMPO2); GridView1.Columns.Insert(2,CAMPO3); GridView1.Columns.Insert(3,CAMPO4); finally CAMPO1.Free; CAMPO2.Free; CAMPO3.Free; CAMPO4.Free; end; end;
Obs: Pode ser adicionado outros tipos de colunas também como ButtonColumn e definir outras propriedades.
- Recuperar Valores
Tive alguns problemas para recuperar os valores de uma gridview no começo porque quando você define que a coluna código, por exemplo, é visible=false, ele não permite pegar o conteúdo daquela coluna facilmente, mas com DataKeys é tranquilo, os códigos abaixo:
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Item[0].ToString;
ou
GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[0].ToString;
Na gridview precisa ser preenchido a propriedade DataKeysNames, pode ir direto no código ou configurar na paleta propriedades mesmo, coloque o nome do campo que busca no BD, se quiser pode colocar mais de um(array), desde que separe com vírgula, se colocar mais de um, muda o valor -> Values[array], por exemplo, se quiser pegar o valor NOME, ficaria assim:
Ex: datakeynames="CODIGO, NOME"
//pega o código GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[0].ToString; //pega o nome GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[1].ToString;
O evento para pegar os valores é o RowCommand, fica no mesmo estilo que datagrid, coloca um buttonfield e atribui um commandname pra ele, no evento rowcommand pode-se implementar um codigo parecido com esse:
if e.CommandName = 'EXCLUIR' then begin lblcontrole.text := GrVwComponentes.DataKeys[Convert.ToInt32(e.CommandArgument)].Values[0].ToString; Excluir; end;
Qualquer dúvida postem ai!!