<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom"><channel><title>Dicas Técnicas BufaloInfo</title><link>http://www.bufaloinfo.com.br/</link><description>Dicas Técnicas Produzidas pela Búfalo Informática</description><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1015</link><title>.NET : Forçando a Gravação do DateTimePicker</title><description>&lt;br&gt;Em aplica&amp;#231;&amp;#245;es Windows o DateTimePicker &amp;#233; um controle de uso bem interessante para a digita&amp;#231;&amp;#227;o de datas. O problema &amp;#233; que o DateTimePicker possui um pequeno bug.&lt;br&gt;&lt;br&gt;Quando &amp;#233; carregado, ele j&amp;#225; exibe a data atual, mesmo que na origem de dados a data encontre-se em branco. Por&amp;#233;m caso ele n&amp;#227;o seja alterado, ele n&amp;#227;o grava esta data atual na origem de dados, deixando a origem de dados em branco e frequentemente gerando erros por causa disso.&lt;br&gt;&lt;br&gt;Para corrigir o problema precisamos for&amp;#231;ar a grava&amp;#231;&amp;#227;o dos dados do datetimepicker na origem de dados. Isso &amp;#233; feito da seguinte forma :&lt;br&gt;&lt;br&gt;MeuBindingSource.CurrencyManager.Bindings(indice do binding do DTP).WriteValue()&lt;br&gt;&lt;br&gt;Ou, em C# :&lt;br&gt;&lt;br&gt;MeuBindingSource.CurrencyManager.Bindings[indice do binding do DTP].WriteValue;&lt;br&gt;&lt;br&gt;Essa instru&amp;#231;&amp;#227;o deve ser feita antes do EndEdit ou qualquer a&amp;#231;&amp;#227;o equivalente que v&amp;#225; realizar a grava&amp;#231;&amp;#227;o do registro no dataset&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1000</link><title>.NET : Utilizando o Copy Source as HTML no Visual Studio 2008</title><description>&lt;br&gt;&lt;br&gt;O CSAH &amp;#233; uma ferramenta indispens&amp;#225;vel para qualquer um que codifique e publique c&amp;#243;digo em blog, artigos e outros meios mais. Ele permite fazer um copy/past direto do Visual Studio para uma p&amp;#225;gina HTML levando toda a formata&amp;#231;&amp;#227;o tradicional do visual studio e eventualmente bem mais.&lt;br&gt;&lt;br&gt;Por&amp;#233;m n&amp;#227;o foi lan&amp;#231;ada uma vers&amp;#227;o do CSAH para o Visual Studio 2008, apenas para o Visual Studio 2005.&lt;br&gt;&lt;br&gt;Mas usar o CSAH atual no Visual Studio 2008 &amp;#233; muito simples :&lt;br&gt;&lt;br&gt;&lt;br&gt;1) Copie os arquivos que voc&amp;#234; ir&amp;#225; encontrar em My Documents\Visual Studio 2005\AddIns&lt;br&gt;&lt;br&gt;CopySourceAsHtml.dll &lt;br&gt;CopySourceAsHtml.AddIn &lt;br&gt;CopySourceAsHtml.dll.config&lt;br&gt;&lt;br&gt;2) Cole esses arquivos em My Documents\Visual Studio 2008\AddIns&lt;br&gt;&lt;br&gt;3) Abra o arquivo CopySourceAsHtml.AddIn no notepad&lt;br&gt;&lt;br&gt;4) Altere a tag &amp;lt;Version&amp;gt; que aparece como 8.0 para 9.0&lt;br&gt;&lt;br&gt;5) J&amp;#225; dentro do Visual Studio 2008, v&amp;#225; em tools-&amp;gt;Addins Manager e habilite o CSAH&lt;br&gt;&lt;br&gt;6) Reinicie o Visual Studio&lt;br&gt;&lt;br&gt;Pronto, s&amp;#243; utilizar !&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=964</link><title>.NET : Cuidado com o nome dos fluxos no Workflow</title><description>&lt;br&gt;&amp;#201; necess&amp;#225;rio ter muito cuidado com o nome dos arquivos e classes de fluxo quando estiver utilizando o workflow foundation.&lt;br&gt;&lt;br&gt;A quest&amp;#227;o &amp;#233; simples : O nome dos arquivos .cs e/ou .vb precisam ser iguais ao nome das classes do workflow&lt;br&gt;&lt;br&gt;Isso acontece porque algumas configura&amp;#231;&amp;#245;es - em especial as declarative rule conditions - s&amp;#227;o gravadas na forma de stream de xml como resources do assembly.&lt;br&gt;&lt;br&gt;Ocorre que o nome do arquivo afeta a grava&amp;#231;&amp;#227;o durante a compila&amp;#231;&amp;#227;o e o workflow foundation n&amp;#227;o consegue ler as declarative rule conditions de volta durante a execu&amp;#231;&amp;#227;o, dando a estranha mensagem de que as regras n&amp;#227;o est&amp;#227;o l&amp;#225; quando est&amp;#227;o.&lt;br&gt;&lt;br&gt;Para corrigir isso, basta igualar o nome dos arquivos com o nome das classes.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=893</link><title>.NET : Transformando uma URL em Hyperlink dentro de um texto</title><description>&lt;br&gt;As express&amp;#245;es regulares s&amp;#227;o capazes de realizar tarefas muito poderosas, mas desconhecidas por muitos.&lt;br&gt;&lt;br&gt;Por exemplo : formul&amp;#225;rios de dados s&amp;#227;o validados para impedir que o usu&amp;#225;rio entre com instru&amp;#231;&amp;#245;es HTML no formul&amp;#225;rio, o que seria uma tentativa de invas&amp;#227;o conhecida como script injection.&lt;br&gt;&lt;br&gt;Mas digamos que o usu&amp;#225;rio entre com URLs nestes formul&amp;#225;rios. Voc&amp;#234; pode desejar que as URLs sejam exibidas com links, mas nem  por isso quer que seu usu&amp;#225;rio digite tags HTML.&lt;br&gt;&lt;br&gt;Se for s&amp;#243; um campo URL, &amp;#233; muito f&amp;#225;cil. Mas e se forem URLs digitados no meio de um longo texto e voc&amp;#234; desejar que, ao exibir o texto, todas as URLs do texto apare&amp;#231;am como links ?&lt;br&gt;&lt;br&gt;Neste ponto entram as express&amp;#245;es regulares : Elas s&amp;#227;o capazes de identificar um padr&amp;#227;o no meio de um grande texto (as URLs tem um formato padr&amp;#227;o) e a partir deste padr&amp;#227;o fazer inclusive um replace, mas n&amp;#227;o necessariamente um replace comum, mas um replace baseado no padr&amp;#227;o que foi identificado.&lt;br&gt;&lt;br&gt;Veja como ficaria uma rotina para transformar, dentro de um texto, todas as URLs para hyperlinks :&lt;br&gt;&lt;br&gt;C#&lt;br&gt;&lt;br&gt;public string ConvertURLsToHyperlinks(string sInput)&lt;br&gt;{&lt;br&gt;return Regex.Replace(sInput, @&amp;quot;(\bhttp://[^ ]+\b)&amp;quot;, @&amp;quot;&amp;lt;a href=&amp;quot;&amp;quot;$0&amp;quot;&amp;quot;&amp;gt;$0&amp;lt;/a&amp;gt;&amp;quot;);&lt;br&gt;}&lt;br&gt;&lt;br&gt;VB.NET :&lt;br&gt;&lt;br&gt;public function ConvertURLsToHyperlinks(sInput as string) as string&lt;br&gt;&lt;br&gt;return Regex.Replace(sInput,&amp;quot;(\bhttp://[^ ]+\b)&amp;quot;,&amp;quot;&amp;lt;a href=&amp;quot;&amp;quot;$0&amp;quot;&amp;quot;&amp;gt;$0&amp;lt;/a&amp;gt;&amp;quot;)&lt;br&gt;&lt;br&gt;end function&lt;br&gt;&lt;br&gt;N&amp;#227;o esque&amp;#231;a de fazer um imports/using para o namespace System.Text.RegularExpressions. Observe tamb&amp;#233;m que dentro do colchete existe um espa&amp;#231;o&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=892</link><title>.NET : Outra forma de forçarmos a atualização via ClickOnce</title><description>&lt;br&gt;A distribui&amp;#231;&amp;#227;o via ClickOnce, com sua capacidade de identificar automaticamente se a aplica&amp;#231;&amp;#227;o sofreu ou n&amp;#227;o alguma atualiza&amp;#231;&amp;#227;o, &amp;#233; sem d&amp;#250;vida um excelente recurso para as aplica&amp;#231;&amp;#245;es windows. &lt;br&gt;&lt;br&gt;Sempre que a aplica&amp;#231;&amp;#227;o &amp;#233; acessada, verifica se existe uma nova vers&amp;#227;o e caso exista, pergunta se o usu&amp;#225;rio deseja atualizar. &lt;br&gt;&lt;br&gt;Por&amp;#233;m, caso o usu&amp;#225;rio responda que n&amp;#227;o deseja atualizar, nenhuma nova pergunta &amp;#233; realizada nas vezes seguintes em que o usu&amp;#225;rio acessa a aplica&amp;#231;&amp;#227;o. Desta forma a atualiza&amp;#231;&amp;#227;o acaba precisando ser feita por c&amp;#243;digo, assim como se o administrador n&amp;#227;o desejar que o usu&amp;#225;rio tenha a op&amp;#231;&amp;#227;o de n&amp;#227;o atualizar. &lt;br&gt;&lt;br&gt;Mas existem algumas formas tamb&amp;#233;m simples de evitar isso ainda sem a necessiade de codifica&amp;#231;&amp;#227;o.&lt;br&gt;&lt;br&gt;Acessando as propriedades do projeto, no item Publish, bot&amp;#227;o Updates, podemos determinar a vers&amp;#227;o m&amp;#237;nima requerida para a execu&amp;#231;&amp;#227;o da aplica&amp;#231;&amp;#227;o. Se determinarmos a vers&amp;#227;o m&amp;#237;nima sempre como sendo a vers&amp;#227;o atual, o usu&amp;#225;rio n&amp;#224;o ter&amp;#225; a op&amp;#231;&amp;#227;o de n&amp;#227;o atualizar (skip), a atualiza&amp;#231;&amp;#227;o ser&amp;#225; autom&amp;#225;tica.&lt;br&gt;&lt;br&gt;Desta forma, com a configura&amp;#231;&amp;#227;o do ClickOnce podemos tamb&amp;#233;m for&amp;#231;ar uma constante atualiza&amp;#231;&amp;#227;o da aplica&amp;#231;&amp;#227;o. Mas observando que por c&amp;#243;digo podemos ainda obter recursos mais avan&amp;#231;ados, como atualiza&amp;#231;&amp;#227;o ass&amp;#237;ncrona, sob demanda e envolvendo muitas outras poss&amp;#237;veis regras de neg&amp;#243;cio.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=889</link><title>.NET : Forçando atualização via ClickOnce</title><description>&lt;br&gt;A distribui&amp;#231;&amp;#227;o via ClickOnce, com sua capacidade de identificar automaticamente se a aplica&amp;#231;&amp;#227;o sofreu ou n&amp;#227;o alguma atualiza&amp;#231;&amp;#227;o, &amp;#233; sem d&amp;#250;vida um excelente recurso para as aplica&amp;#231;&amp;#245;es windows.&lt;br&gt;&lt;br&gt;Sempre que a aplica&amp;#231;&amp;#227;o &amp;#233; acessada, verifica se existe uma nova vers&amp;#227;o e caso exista, pergunta se o usu&amp;#225;rio deseja atualizar.&lt;br&gt;&lt;br&gt;Por&amp;#233;m, caso o usu&amp;#225;rio responda que n&amp;#227;o deseja atualizar, nenhuma nova pergunta &amp;#233; realizada nas vezes seguintes em que o usu&amp;#225;rio acessa a aplica&amp;#231;&amp;#227;o. Desta forma a atualiza&amp;#231;&amp;#227;o acaba precisando ser feita por c&amp;#243;digo, assim como se o administrador n&amp;#227;o desejar que o usu&amp;#225;rio tenha a op&amp;#231;&amp;#227;o de n&amp;#227;o atualizar.&lt;br&gt;&lt;br&gt;Fazer a atualiza&amp;#231;&amp;#227;o via c&amp;#243;digo &amp;#233; muito mais simples do que a complexidade desta tarefa pode fazer parecer. Veja como &amp;#233; f&amp;#225;cil :&lt;br&gt;&lt;br&gt;        If My.Application.Deployment.CheckForUpdate Then&lt;br&gt;            My.Application.Deployment.Update()&lt;br&gt;            Application.Restart()&lt;br&gt;        End If&lt;br&gt;&lt;br&gt;O mesmo em C# :&lt;br&gt;&lt;br&gt;            if (System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CheckForUpdate())&lt;br&gt;            {&lt;br&gt;                System.Deployment.Application.ApplicationDeployment.CurrentDeployment.Update();&lt;br&gt;                Application.Restart();&lt;br&gt;            }&lt;br&gt;&lt;br&gt;&lt;br&gt;Nestes exemplos a atualiza&amp;#231;&amp;#227;o da aplica&amp;#231;&amp;#227;o encontra-se sendo realizada de forma s&amp;#237;ncrona. Isso fica ainda melhor se forem usados m&amp;#233;todos para atualiza&amp;#231;&amp;#227;o de forma ass&amp;#237;ncrona (que est&amp;#227;o dispon&amp;#237;veis no mesmo objeto) e for criada uma interface agrad&amp;#225;vel avisando ao usu&amp;#225;rio que a aplica&amp;#231;&amp;#227;o est&amp;#225; sendo atualizada.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=835</link><title>.NET : Abrindo arquivo de configuração com nome diferente</title><description>&lt;br&gt;Os arquivos de ocnfigura&amp;#231;&amp;#227;o normalmente tem um nome padr&amp;#227;o. Na web s&amp;#227;o sempre web.config. Em aplica&amp;#231;&amp;#245;es windows s&amp;#227;o app.config durante o desenvolvimento e viram suaaplicacao.exe.config ap&amp;#243;s a compila&amp;#231;&amp;#227;o.&lt;br&gt;&lt;br&gt;Por&amp;#233;m &amp;#233; perfeitamente poss&amp;#237;vel manter v&amp;#225;rios arquivos de configura&amp;#231;&amp;#227;o em uma aplica&amp;#231;&amp;#227;o e com nomes distintos. Mas como manipular as configura&amp;#231;&amp;#245;es contidadas nestes arquivos ?&lt;br&gt;&lt;br&gt;Normalmente a classe ConfigurationManager busca um nome padr&amp;#227;o para o arquivo de configura&amp;#231;&amp;#227;o, mas com um pequeno truque podemos indicar um nome alternativo. &lt;br&gt;&lt;br&gt;Veja : &lt;br&gt;&lt;br&gt;        Dim map As New ExeConfigurationFileMap&lt;br&gt;        map.ExeConfigFilename = &amp;quot;meuarquivo.config&amp;quot;&lt;br&gt;        ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None)&lt;br&gt;&lt;br&gt;&lt;br&gt;Desta forma podemos manipular arquivos de configura&amp;#231;&amp;#227;o com nomes diferentes do padr&amp;#227;o utilizando o ConfigurationManager&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=823</link><title>.NET : Solução sempre visível</title><description>&lt;br&gt;No VS 2005, ao contr&amp;#225;rio do VS 2003, a solu&amp;#231;&amp;#227;o nem sempre fica vis&amp;#237;vel no solution explorer. Enquanto temos um &amp;#250;nico projeto a solu&amp;#231;&amp;#227;o n&amp;#227;o &amp;#233; exibida, quando adicionamos mais projetos ela aparece.&lt;br&gt;&lt;br&gt;Caso desejemos que a solu&amp;#231;&amp;#227;o fique sempre visivel, ao inv&amp;#233;s deste comportamento default do VS 2005, podemos configurar isso em tools-&amp;gt;options-&amp;gt;projects and solutions. &lt;br&gt;&lt;br&gt;Basta marcar a checkbox &amp;quot;Always show solution&amp;quot;.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=821</link><title>.NET : Criando aplicações windows singleInstance</title><description>&lt;br&gt;Aplica&amp;#231;&amp;#245;es singleInstance s&amp;#227;o aplica&amp;#231;&amp;#245;es que podem ser rodadas uma &amp;#250;nica vez, o usu&amp;#225;rio n&amp;#227;o pode abrir diversas instancias da aplica&amp;#231;&amp;#227;o, rodando v&amp;#225;rias vezes o execut&amp;#225;vel.&lt;br&gt;&lt;br&gt;O VB.NET, atrav&amp;#233;s dos recursos do MY, implementa facilmente aplica&amp;#231;&amp;#245;es singleInstance. Basta nas propriedades do projeto marcarmos a checkbox solicitando isso e ele gera o c&amp;#243;digo para n&amp;#243;s.&lt;br&gt;&lt;br&gt;No C#, por&amp;#233;m, n&amp;#227;o temos o recurso do My, consequentemente precisamos n&amp;#243;s mesmos programar isso.&lt;br&gt;&lt;br&gt;Para fazer isso devemos utilizar um Mutex. Um Mutex &amp;#233; um objeto do sistema operacional que permite criarmos uma sinaliza&amp;#231;&amp;#227;o entre nossas aplica&amp;#231;&amp;#245;es. Assim sendo, a primeira inst&amp;#226;ncia de nossa aplica&amp;#231;&amp;#227;o abre um Mutex e as inst&amp;#226;ncias seguintes, vendo que o Mutex j&amp;#225; existe, n&amp;#227;o se iniciam.&lt;br&gt;&lt;br&gt;Devemos fazer isso na Main. Vejam como fica :&lt;br&gt;&lt;br&gt;       static void Main()&lt;br&gt;        {&lt;br&gt;            Mutex mu = null;&lt;br&gt;            try&lt;br&gt;            {&lt;br&gt;                mu = Mutex.OpenExisting(&amp;quot;RUNMEONCE&amp;quot;);&lt;br&gt;            }&lt;br&gt;            catch (WaitHandleCannotBeOpenedException)&lt;br&gt;            {&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            if (mu == null)&lt;br&gt;            {&lt;br&gt;                mu = new Mutex(true, &amp;quot;RUNMEONCE&amp;quot;);&lt;br&gt;            }&lt;br&gt;            else&lt;br&gt;            {&lt;br&gt;                mu.Close();&lt;br&gt;                return;&lt;br&gt;            }&lt;br&gt;            Application.EnableVisualStyles();&lt;br&gt;            Application.SetCompatibleTextRenderingDefault(false);&lt;br&gt;            Application.Run(new Form1());&lt;br&gt;        }&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=799</link><title>.NET : Fazendo PING para outro micro</title><description>Eventualmente precisamos descobrir se um determinado micro (em geral, servidores) encontra-se ativo ou n&amp;#227;o na rede. &lt;br&gt;&lt;br&gt;Em termos de rede temos o protocolo ICMP, ou mais conhecido como PING. Mas como fazer isso via c&amp;#243;digo ? &lt;br&gt;&lt;br&gt;Nada mais simples : &lt;br&gt;&lt;br&gt;siteResponds = My.Computer.Network.Ping(&amp;quot;somehost.my.domain&amp;quot;) &lt;br&gt;&lt;br&gt;A resposta &amp;#233; boolean, indicando se o computador encontra-se ativo ou n&amp;#227;o. &lt;br&gt;&lt;br&gt;O C#, por&amp;#233;m, n&amp;#227;o possui o MY, portanto para realizar esta tarefa teremos que recorrer diretamente as classes do System.NET, vejam : &lt;br&gt;&lt;br&gt;          System.Net.NetworkInformation.Ping p; &lt;br&gt;            System.Net.NetworkInformation.PingReply pr;&lt;br&gt;            pr = p.Send(&amp;quot;servidor&amp;quot;); &lt;br&gt;&lt;br&gt;            if (pr.Status == Net.NetworkInformation.IPStatus.Success) {&lt;br&gt;                  MessageBox.Show(&amp;quot;Servidor ok&amp;quot;);&lt;br&gt;&lt;br&gt;            }&lt;br&gt;&lt;br&gt;A classe PING nos permite realizar o PING e nos devolve a resposta na forma da classe PINGREPLY. O Status do PINGREPLY &amp;#233; bem detalhado, mas nesse exemplo fui direto ao status de sucesso. &lt;br&gt;</description></item></channel></rss>