Revogar um destino???
segunda-feira, 21 de junho de 2010
terça-feira, 8 de dezembro de 2009
Exportar GridView para Excel Delphi ASP.NET
Após muita consulta no Google não encontrei nenhum exemplo que funcionasse perfeitamente no Delphi para exportar os dados de uma Grid para o Excel, então adaptei alguns em VB, outros em C# e hoje de manhã finalmente o negócio funcionou. Agora estou aqui para compartilhar com vocês, segue o código fonte da função para exportar:
procedure Texportarexcel.Button1_Click(sender: TObject; e: System.EventArgs);
var
sw: System.IO.StringWriter;
htw: HtmlTextWriter;
sb: StringBuilder;
form: HtmlForm;
pagina: System.Web.UI.Page;
begin
sb := stringbuilder.Create;
sw := StringWriter.create(sb);
htw := HtmlTextWriter.create(sw);
pagina := System.Web.UI.Page.Create();
form := HtmlForm.create();
gvDados.EnableViewState := false;
pagina.EnableEventValidation := False;
pagina.DesignerInitialize();
pagina.Controls.Add(form);
form.Controls.Add(gvDados);
pagina.RenderControl(htw);
Response.Clear();
Response.ClearContent();
Response.Buffer := True;
Response.ContentType := 'application/vnd.ms-excel';
Response.AddHeader('Content-Disposition', 'attachment;filename=data.xls');
Response.Charset := 'UTF-8';
Response.ContentEncoding := Encoding.Default;
Response.Write(sb.ToString());
Response.&End;
end;
Nesta página que fiz para testar tenho um Button e uma GridView (gvDados), o código acima está no evento OnClick do Button1, antes de exportar a grid é óbvio que ela precisa ter dados, mas isto já não é o objetivo deste post, espero que o código seja útil para alguém, abraços!
Obs.: Não esqueçam de comentar e visitem o Blog do Bolívar!
quarta-feira, 27 de maio de 2009
Resultados no rodapé do GridView
Esta semana precisei exibir resultados no rodapé do GridView, aki no blog tem um post sobre o DataGrid, porém é um pouco diferente.
Vamos calcular a média dos valores de uma coluna, sem precisar ir ao banco para tal. No evento DataBound do Grid View:
var soma:Integer begin for I := 0 to GridView1.Rows.Count - 1 do begin Soma := Soma+Int32.Parse(GridView1.Rows[I].Cells[1].Text); end; end;
Esse loop irá percorrer as linhas e somará os valores da coluna 1 do grid. Após isso basta calcular a média, para isso crie uma variável 'media' do tipo Double:
media := Soma/I;
Pronto, agora basta mostrar o resultado no rodapé:
GridView1.FooterRow.Cells[0].Text := 'Média dos Valores:';
GridView1.FooterRow.Cells[0].HorizontalAlign := HorizontalAlign.Right;
GridView1.FooterRow.Cells[1].Text := media.ToString('n');
GridView1.FooterRow.Cells[1].HorizontalAlign := HorizontalAlign.Center;
Na coluna 0 estamos mostrando o texto e na 1 a média dos valores já formatada.
Um abraço.
PS: Não esqueçam de visitar o Blog do Signori !
terça-feira, 5 de maio de 2009
Enviando e-mail no DELPHI for ASP.NET utilizando GMail
Olá pessoal, neste pequeno tutorial pretendo mostrar um exemplo simples de envio de e-mail em ASP.NET utilizando os serviços do Gmail e DELPHI 2007 for .NET, dica do Edinei.
Primeiramente vamos criar uma nova aplicação, File -> New -> ASP.NET Web Application.
Feito isso, adicione três TextBox, um Button e uma Label, renomeie a propriedade ID das textboxes para: txbdestinatario, txbassunto e txbmensagem respectivamente, a Label para lblretorno e o Button para btnenviar, aumente o tamanho das textboxes de acordo com sua preferência e mude a propriedade textMode da txbmensagem para “Multiline”. Apague o que tiver na propriedade Text da lblretorno e mude a propriedade Text do btnenviar para “Enviar E-mail”. O formulário deve ficar parecido com o da imagem abaixo.
O txtdestinatario vai receber o endereço de e-mail que se deseja enviar uma mensagem, txbassunto o assunto e txbmensagem a mensagem, a lblretorno irá mostrar se o e-mail foi enviado com sucesso ou se ocorreu algum erro durante o envio e o btnenviar chamará a função de envio de e-mail.
Para usar as funções de envio de e-mail do .NET, é necessário adicionar as seguintes bibliotecas na uses.
Uses
System.Net.Mail, System.Net.Configuration, System.Text, System.Net;
Feito isso, de um duplo clique no btnenviar e implemente a função que vai enviar o e-mail através do serviço de envio de e-mail da Google, o gmail, veja função abaixo.
procedure TDefault.btnEnviar_Click(sender: TObject; e: System.EventArgs);
var
EmailRemetente: string;
NomeRemetente: string;
Mail: MailMessage;
Client: SmtpClient;
begin
Mail := MailMessage.create;
Client := SmtpClient.create;
EmailRemetente := 'seuEmail@gmail.com'; // O e-mail do remetente
NomeRemetente := 'Seu Nome'; // O nome do remetente
try
Mail.&To.Add(txbDestinatario.text); // Destinatário
Mail.From := MailAddress.create(EmailRemetente, NomeRemetente, System.Text.Encoding.UTF8);
Mail.Subject := txbassunto.text; // Assunto do E-mail
mail.SubjectEncoding := System.Text.Encoding.UTF8;
mail.Body := txbmensagem.text; // Mensagem do e-mail
mail.BodyEncoding := System.Text.Encoding.UTF8;
mail.IsBodyHtml := true;
mail.Priority := MailPriority.High; // Prioridade do E-Mail
client.Credentials := NetworkCredential.create(EmailRemetente, 'AquiSuaSenha'); // usuário e senha do Gmail
client.Port := 587; // Esta porta é a utilizada pelo Gmail para envio
client.Host := 'smtp.gmail.com'; // Definindo o provedor que irá disparar o e-mail
client.EnableSsl := true; // Gmail trabalha com Server Secured Layer
try
client.Send(mail);
lblretorno.text := 'E-mail enviado com sucesso!';
except on erro:exception do
lblretorno.text := 'Erro ao tentar enviar e-mail. '+erro.message;
end;
finally
client.free;
mail.free;
end;
end;
Depois de implementada a função é só compilar e executar (CTRL+SCHIFT+F9) para testar o envio de e-mails.
Até.
Referências: http://www.devmedia.com.br/articles/viewcomp.asp?comp=12520
quarta-feira, 8 de abril de 2009
sexta-feira, 20 de março de 2009
Performance em ASP.NET: Desabilitar ViewState na Aplicação Inteira
Olá pessoal!
O ViewState é uma string armazenada em um campo oculto no HTML gerado para a sua página. Ele guarda os dados sobre a página e seus componentes, concatenado com um hash gerado no servidor para evitar ataques onde alguma pessoa maliciosa altere o conteúdo dessa string e faça um postback para o seu servidor. Essa string está em Base64, e é simples decodificar, como por exemplo usando o ViewState Decoder.
Cada componente colocado em uma página ASP.Net salva o seu estado no ViewState, para que cada vez que acontecer um postback esse componente possa voltar a ser exibido exatamente como estava antes, sem precisar fazer nova inicialização ou trazer os dados novamente do banco de dados, e assim por diante. Isso é prático, mas pode deixar o ViewState incrivelmente grande e aumentar bastante o tamanho da sua página e o tempo de carregamento por consequência.
Em páginas onde é desnecessário essa característica é recomendável desabilitar o ViewState ou então manter ele ativo apenas nos componentes em que é necessário, isso trará um aumento de performance na sua aplicação pois o navegador não precisará ficar enviando e recebendo essa string toda vez que é feita alguma requisição.
Por padrão o ViewState vem como True nos elementos, mas isso pode ser alterado facilmente mudando a propriedade EnableViewState para False. Agora se a sua aplicação já está pronta ou com a maior parte desenvolvida, você pode desativar o ViewState na aplicação inteira inserindo no arquivo web.config ou no machine.config o seguinte código:
Por enquanto é isso, para saber mais sobre o ViewState recomendo a leitura das referências, são dois excelentes artigos.
Referências
DotNetJohn || TechTips
quinta-feira, 19 de março de 2009
Artigo Nº 20: Concatenando resultados diretamente na SQL
Acredito que quase todos os programadores em algum momento, precisou concatenar várias colunas de uma função select, agrupando em uma única coluna. Para isso, quem não conhece ou conhecia esse tipo de concatenação, resolve agrupando no próprio código de programação. Um exemplo que posso escrever é: para programadores .net que trabalha com POO(Programação Orientadas a Objetos) ou em camadas, resolve esse problema criando uma function que vai retorna em um formato de DateTable, dentro dessa function monta a SQL, depois manda executa a função para retornar os dados. Daí depois de passar pelo banco, lê cada resultado e manualmente cria-se uma nova coluna onde o valor vai ser a concatenação entre os duas ou mais colunas do resultado: Ex: Coluna 03 = ColunaSQL1 +'/'+ ColunaSQL2;
Bom, aí vai os exemplos de como proceder em diversos bancos de dados:
FIREBIRD
SELECT (COLUNA1 ||' - '|| COLUNA2) as RESULTADO from TABELA
SQL SERVER
SELECT (CAST(COLUNA1 AS VARCHAR)+' - '+ CAST(COLUNA2 AS VARCHAR)) AS RESULTADO FROM TABEL
POSTGREE
SELECT (COLUNA1 ||' - '|| COLUNA2) AS RESULTADO FROM TABELA
MYSQL
SELECT CONCAT(COLUNA1,' - ',COLUNA2) AS RESULTADO FROM TABELA
Esses são os exemplos de concatenação. Pode-se concatena quantas colunas que necessita, sempre seguindo as sintaxe.
Caso sua aplicação está voltada para conexão independente de banco, tome cuidado ao utilizar essas funções, crie uma forma de parametrizações que quando trocar de banco chame a sintaxe de acordo com o banco.
Obrigado. Abraços.
segunda-feira, 9 de fevereiro de 2009
Artigo Nº 19: Customizando ValidatorCalloutExtender do Ajax Control Toolkit
.validar div, .validar td /*Formatação do visual da popup(EX: borda e cor de fundo)*/
{border:solid 1px red; background-color:white;}
.validar .ajax__validatorcallout_callout_cell /*Manter padrão*/
{width:80px; height:100%; text-align:right; vertical-align:top; border:none; background-color:transparent; padding:0px;}
.validar .ajax__validatorcallout_callout_table /* Manter padrão */
{height:100%; border:none;background-color:transparent;padding:0px;}
.validar .ajax__validatorcallout_callout_arrow_cell/* Manter padrão */
{padding:8px 0px 0px 0px; text-align:right; vertical-align:top; font-size:1px; border:none; background-color:transparent;}
.validar .ajax__validatorcallout_callout_arrow_cell .ajax__validatorcallout_innerdiv /* Manter padrão */
{font-size:1px; position:relative; left:1px; border-bottom:none; border-right:none; border-left:none; width:15px; background-color:transparent; padding:0px;}
.validar .ajax__validatorcallout_callout_arrow_cell .ajax__validatorcallout_innerdiv div /* Manter padrão */
{height:1px; overflow:hidden; border-top:none; border-bottom:none; border-right:none; padding:0px; margin-left:auto;}
.validar .ajax__validatorcallout_error_message_cell /*Formatação do texto dentro da popup */
{font-family:Verdana; font-size:10px; border-right:none; border-left:none; width:100%; color:red; font-weight:bold; text-align:left;}
.validar .ajax__validatorcallout_icon_cell /* Manter padrão */
{width:20px; padding:5px; border-right:none;}
.validar .ajax__validatorcallout_close_button_cell/* Manter padrão */
{vertical-align:top; padding:0px; text-align:right; border-left:none;}
.validar .ajax__validatorcallout_close_button_cell .ajax__validatorcallout_innerdiv /* Manter padrão */
{border:none; text-align:center; width:16px; height:16px; padding:2px; cursor:pointer;}
Depois de salvar esse estilo, vá para o .aspx da sua página e dentro da tag HEAD, coloque o código sequinte logo abaixo da tag TITLE. Esse é o código responsável por buscar os estilos e aplicar na sua página, caso já tenha, ignore-o.
< link rel="stylesheet" href="./estilos/estilos.css" type="text/css"/>Feito isso, volte para a página, verifique se a propriedade TargetControlID do componente ValidatorCallout está relacionada com o componente de validação. Se está, selecione esse componente, RegularExpressionValidator, e na janela Object Inspector procure as propriedades Extenders, figura 01. Mas para essas propriedades aparecerem, os dois componentes devem estar interligados.
Agora altere as seguintes propriedades:
CloseImageURL: coloque o caminho de onde o componente buscará a imagem para fechar a popup(se não colocar nada, ficará a imagem padrão);
CssClass: digitar o nome do estilo criado para sua formatação(EX: validar);
WarningIconImageURL: caminho da imagem que é exibida na frente do texto da popup.
Width: Tamanho da popup(em caso da mensagem ser muito grande)
Figura 01:

Para resolver possíveis problemas futuros com esse componente, baixe um arquivo nesse endereço http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx
Veja o resultado na figura 2.

segunda-feira, 19 de janeiro de 2009
Artigo Nº 18: Usando WebParts em C#
Em seguida vamos adicionar uma tabela com duas linhas e duas colunas na qual irão ficar os componentes WebPartZone, é dentro destas zonas que ficará tudo que você quer "mover", aqui iremos simplesmente adicionar componentes aleatoriamente, mas o que se costuma fazer é se adicionar uma User Control onde fica todas as funções desejadas e componentes mais organizadamente. Após adicionar uma WebPartZone em cada célula da tabela vamos adicionar algo dentro de cada uma, simplesmente algo como TextBox, Button, Label, o que você desejar só para ver o componente em ação. No final das contas deverá ficar mais ou menos como na imagem abaixo.

Bom, eu fiz assim Botões, TextBox e Label. Se fosse compilar agora sem problemas mas não iria acontecer nada sobre arrastar e largar em outro lugar. Para isto basta adicionar uma única linha de código no evento Page_Load.
WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode;
Este código esta em C# o que não muda quase nada para pascal, só se adiciona 2 pontos antes do igual ':='. Agora se você compilar você verá que é possível arrastar e largar o conteúdo das WebPartZone, mas somente é possível largar dentro das outras WebPartZone. Então esta logo abaixo uma imagem dele em funcionamento.

No próximo artigo estarei mostrando como administrar cada uma das "caixinhas" para que se estas forem fechadas seja possível se abrir as mesmas novamente.
Abração e até.
sexta-feira, 16 de janeiro de 2009
Artigo Nº 17: Usando AutoCompleteExtender do Ajax Control Toolkit
Para começo adicione os componentes ajax básicos (UpdatePanel e ScriptManager) e em seguida um textbox e o componente AutoCompleteExtender, feito isso vá para o aspx para adicionar uma coisa no componente AutoCompleteExtender, é:
- servicemethod="AutoCompleta"
[WebMethod]
class function AutoCompleta(prefixText: string; count: Integer): TStringArray; static;
...isso mesmo tem sim um [WebMethod] ali junto na declaração dela, e se tentar compilar vai dar erro, então adicione System.Web.Services nas suas uses. Outra coisa necessária a se fazer é logo depois do Type fazer esta declaração:
TStringArray = array of string;
Pois o delphi não aceita funções que retornem array of string, então se da uma enrolada nele. Agora vamos para o código da nossa função.
PESSOA := TuClassPessoa.create; SetLength(Result, Count); for I := 1 to count do
begin
Result[I - 1] := PESSOA.AutoComplete(prefixText,I);
end;
Bom, aqui foi o básico, tenho uma classe que retorna uma string com uma sql que faz o filtro por like, isso vocês mesmos podem fazer fácil fácil, e no final retorno uma array of string com o result (lembra pra enganar ele criamos um tipo chamado TStringArray. A variavel prefixText vem do componente AutoComplete que é o texto digitado no textbox. Bom, esta feito e agora vamos ao teste.
Abração e Até
Delphi.net Nova Versão
Algumas das novidades em relação ao Delphi Prism...
- Não mais a VCL.NET
- .NET Framework 3.5
- Não necessita uma nova licença do Visual Studio
- Produz executáveis compatíveis com o framework .NET Mono, para Linux e Mac
- Ainda não se pode desenvolver aplicativos .NET Compact Framework uma vez que a Microsoft fez o CF só para suas linguagens.
- A linguagem traz recursos avançados como nullable types e “future” types, generics, sequences e query expressions (LINQ)
- Funcionará com as tecnologias WPF, Silverlight, ASP.NET and LINQ
- Não precisa instalar os outros pacotes do Visual Studio.
Abração e até.
quinta-feira, 23 de outubro de 2008
Artigo Nº 16: Usando Validator Callout Extender do Ajax Control Toolkit em suas Aplicações com o Rad Studio 2007
Nesse artigo, trabalharemos com mais um componente do Ajax Control Toolkit, o ValidatorCalloutExtender, cuja função é exibir as mensagens dos componentes da Web Validation (CompareValidator, RegularExpressionValidator, RequireFieldValidator, CustonValidator, RangeValidator).
Neste exemplo utilizaremos o RegularExpressionValidator, responsável por validar valores informados em um TextBox. Ex: Data e Hora.
Seguindo, arraste para sua página um TextBox, o RegularExpressionValidator, e o ValidatorCalloutExtender.
OBS: Para aprimorar sua aplicação, veja o Artigo Nº 5 e 8.
Aplique as configurações no RegularExpressionValidator:
ID: Coloque um nome mais simples(Ex: revData).
ErroMessage: Uma mensagem de erro(Ex: Data Inválida).
Display: Marque a opção None, ou seja, opção que não permitirá exibir a mensagem de erro no próprio componente.
ControlToValidator: Selecione o nome do TextBox para o controle.
ValidationExpression: Coloque a expressão seguinte para que seja feita a validação para o formato de data dd/MM/yyyy:
^(((((0[1-9])(1\d)(2[0-8]))\/((0[1-9])(1[0-2])))((31\/((0[13578])(1[02])))((2930)\/((0[1,3-9])(1[0-2])))))\/((20[0-9][0-9])(19[0-9][0-9])))((29\/02\/(1920)(([02468][048])([13579][26]))))$
Para o componente ValidatorCalloutExtender, a única propriedade a ser configurada é a TargetControlID, onde deve-se selecionar qual é o RegularExpressionValidator para o seu controle
OBS: Sempre lembrando que os componentes do Ajax Control Toolkit devem ficar dentro do UpdatePanel.
Compile e digite uma data inválida e veja o resultado(Figura 1).
Figura 1:
Show de Bola. No próximo post, customizando com CSS esse componente.
Valeu. Até a próxima.
terça-feira, 14 de outubro de 2008
Conclusão do Curso DELPHI for ASP.NET
sexta-feira, 3 de outubro de 2008
Artigo Nº 15: Trabalhando com Diretórios e Arquivos
procedure TWebForm1.btn_listar_Click(sender: System.Object; e: System.EventArgs);
var
caminho : string;
begin
caminho := Server.MapPath('.');
DataGrid1.DataSource := System.IO.Directory.GetFiles(caminho);
DataGrid1.databind;
end;
Também é possivel listar apenas os subdiretório de um diretório conforme exemplo 2.
Exemplo 2:
procedure TWebForm1.btn_listar_1_Click(sender: System.Object; e: System.EventArgs);
var
caminho : string;
begin
caminho := Server.MapPath('.');
DataGrid1.DataSource := System.IO.Directory.GetDirectories(caminho);
DataGrid1.databind;
end;
Existe sim uma maneira de criar subdiretório no delphi, basta declara duas variáveis, a primeira deve ser com as informações do diretório, da seguinte maneira "pasta : System.IO.DirectoryInfo;" e a segunda uma variável String. Bom agora o procedimento de criação de diretório ou subdiretório pode ser feito de duas maneiras, veja o exemplo 3.
Exemplo 3:
procedure TWebForm1.btn_criar_Click(sender: System.Object; e: System.EventArgs);
var
pasta : System.IO.DirectoryInfo;//Declare a uses System.IO
caminho : string;
begin
caminho := Server.MapPath('.');
pasta := DirectoryInfo.Create('C:\');
pasta.CreateSubdirectory('temp\'+TextBox1.Text);
Directory.CreateDirectory(caminho+'/'+TextBox1.Text);
end;
É possivel verificar se um diretório já existe, quando se precisar dele, para não se tentar criar um diretório com o mesmo nome ,exemplo 4.
Exemplo 4:
procedure TWebForm1.btn_verificar_Click(sender: System.Object; e: System.EventArgs);
var
Caminho : String;
begin
Caminho := Server.MapPath('./teste');
if Directory.Exists(Caminho) then
Response.Write('Este Diretório ja Existe')
else
Response.Write('Este Diretório não Existe')
end;
Existem diversas outras funcionalidades dentro da biblioteca System.IO, basta implementar. Aqui vimos apenas 4 formas de se trabalhar com diretórios e arquivos.
Forte abraço e até a próxima.
quinta-feira, 2 de outubro de 2008
terça-feira, 30 de setembro de 2008
O DELPHI é um POETA.!
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.

