Pesquisar este blog

domingo, 21 de outubro de 2012

C# Windows Form Anti Flickadas


O componente RichTextBox é um componente muito útil para entrada de texto passíveis de formatação. Com este componente, podemos criar analisadores gramaticais,  editores de texto, entre outras finalidades. Através do método Select(), podemos selecionar o texto a ser formatado e aplicar uma diferenciação de fonte, cor e estilo. Porém em textos maiores, o ato de ficar sempre controlando o texto com o uso do método Select a cada entrada no controle, faz com que o mesmo dê algumas flickadas, comportando de maneira estranha a esperada.

Garimpando na internet, constatei em fórums, se tratar de uma funcionalidade não implementada no controle para controle do redesenho, o que faz com que ele haja desta maneira. Para contornar, encontrei mil e uma maneiras, porém a que me foi mais eficiente, foi a seguinte:

Importar a seguinte dll no código:


[DllImport("user32.dll")]
public static extern bool LockWindowUpdate(IntPtr hWndLock);

try
{
      LockWindowUpdate(richTextBox1.Handle);
      //As alterações desejadas vem aqui
}
finally
{
      LockWindowUpdate(IntPtr.Zero);
}

quinta-feira, 18 de outubro de 2012

IE9: Modo compatibilidade



Uma das premissas a ser levada em consideração na criação e manutenção de aplicações web a compatibilidade. Com os constantes avanços nas linguagens de desenvolvimento web (HTML5, XHTML, CSS3, entre outros), algumas funcionalidades e efeitos visuais tendem a funcionar em determinado navegador e não funcionar em outros.
No dia a dia, costumo testar minhas aplicações no navegador Internet Explorer 9 e o mesmo possui um ícone próximo à barra de endereços para exibição em modo de compatibilidade.

Porém na manutenção de uma aplicação web em que determinado recurso não funciona corretamente no IE9, ficar clicando neste ícone toda vez que for testar aplicação é na menor das hipóteses uma perda de tempo. Nestes casos, há como deixar o modo de compatibilidade ativo sempre que o navegador abrir. Para isto, basta abrir o IE, clicar em Configuração do Modo de Exibição de Compatibilidade. Lá você tem a opção de definir o endereço a ser acessado neste modo ou definir que todos os sites sejam acessados desta maneira.

terça-feira, 21 de agosto de 2012

Problemas com ASP.NET FileUpload

Em alguns cenários ao se trabalhar com o componente FileUpload no ASP.NET, revela-se uma caixa de pandora. Uma coisa importante ao se trabalhar com aplicações Web, é desabilitar as mensagens amigáveis de seu IE. Para fazer isso, basta acessar o menu Ferramentas> Opções da Internet> guia Avançadas> nas opções em Navegação, desmarque o checkbox Mostrar mensagens de erro HTTP amigáveis. e em seguida, clique em OK.
Voltando ao assunto, em alguns momentos, ao selecionar um arquivo para upload e executar qualquer ação/ evento que envolva um postback da página, a aplicação lança um erro. Existem muitas causas para este erro, mas a mais comum, é devido ao tamanho padrão para arquivos no controle.
Ou seja, para corrigir esta deficiência, basta definir no arquivo de configuração da aplicação (web.config) o seguinte nó:
<httpRuntime useFullyQualifiedRedirectUrl="true|false [para definir se haverá redirecionamento]" maxRequestLength="[tamanho máximo do arquivo em kbyes]" executionTimeout="120"/>

Na maioria dos cenários, esta pequena alteração costuma ser suficiente. Neste nó, outros parâmetros podem ser acrescentados para o controle de fila de requisições e das threads envolvidas.

quinta-feira, 16 de agosto de 2012

Found a quote for which there is no matching quote

Debugando uma aplicação recentemente, me deparei com um "erro", no mínimo intrigante. No momento em que a aplicação realizava o acesso à base para realizar uma atualização, ocorria uma exceção com a seguinte descrição:

"Found a quote for which there is no matching quote."

Inicialmente fui até minha consulta para verificar se havia esquecido algum apóstrofo, para minha alegria/desespero, a consulta estava ok. Garimpando na internet, descobri que esse erro, poderia ocorrer caso eu tivesse me esquecido de um apóstrofo ou aspas, ou, se a primeira aspa/apóstrofo estivesse em uma linha diferente da aspa/apóstrofo final. Logo após a leitura, verifiquei que um dos parâmetros a ser persistido na base, possuía um "\n" (quebra de linha). Após remover a quebra de linha, o comando funcionou. Portanto, caso você se depare com este erro, vale a pena rever a documentação de seu sistema de gerenciamento do banco de dados, pois, dependendo do sistema, o tratamento de "novas linhas" pode ser uma configuração a ser desativada/ativada.

domingo, 12 de agosto de 2012

Introdução ao PSR(Problem Step Recorder)

O PSR (Problem Step Recorder), é uma ferramenta desenvolvida pela Microsoft para a exibição de cenários de erros. Por muitas vezes após a etapa de desenvolvimento de um sistema, na etapa de QA(Quality Assurance), alguns erros aparecem em cenários bem específicos, muitas vezes, não descobertos/percebidos ou até mesmo especificados no desenvolvimento. E neste momento, para facilitar a exibição do cenário, é que chega o PSR. Para acessar a ferramenta, pressione (Windows)+R e digite psr.exe.


Feito isso, será aberta a seguinte janela:


Ao clicar em iniciar gravação, pode-se minimizar a janela e todos os passos executados pelo usuário, serão detalhados. E quando digo todos, me refiro a TODOS! Todas as interações do usuário serão sumarizadas e printadas com a descrição da ação executada. Quando desejar parar, basta abrir a janela minimizada no início do tutorial e clicar em parar. Será gerado um arquivo zip com uma página em .mht com todos os passos para a simulação do erro. Espero que tenham gostado e que ajude!


domingo, 5 de agosto de 2012

Controlando Exceções

Em alguns momentos debugando algumas aplicações, nos deparamos com determinadas exceções que acabam nos atrapalhando, pois não é algo que se trate de um erro, mas sim um aviso da plataforma. Recentemente, me deparei com uma exception que me impedia de continar a depuração de uma rotina e a seguinte mensagem era exibida:

ContextSwitchDeadlock was detectedMessage: The CLR has been unable to transition from COM context 0x16a300 to COM context 0x16a020 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.

No Visual Studio 2010, há como controlar as exceptions a serem lançadas. No meu caso, esta mensagem tratava-se de um MDA (Managed Debugging Assistants). Para controlar algumas exceptions lançadas pela IDE, basta acessar o menu Debug->Exceptions > MDA e habilitar/desabilitar os check boxes.

segunda-feira, 27 de fevereiro de 2012

Armazenando configurações nos Gadgets / Side bar Gadgets Windows Vista/Windows 7


O que acho interessante nas tecnologias, é o como elas se cruzam e muitas vezes se completam. Os tão aclamados gadgets, foram uma das grandes novidades da Microsoft em aplicações, pois estes nada mais são do que páginas da web. Porém, em muitos sites na internet, como fórums e grupos de discussão, em diversas línguas, reside uma única dúvida.



Como armazenar as configurações parametrizadas pelo usuário em um Gadget, ou, side bar gadgets como descobri recentemente? 

Despois de árduas horas de pesquisa, encontrei em apenas um site uma solução definitiva. Portanto, o conteúdo deste post, nada mais é do que a multiplicação do conhecimento, pois, quanto mais conteúdo de um determinado assunto ou tecnologia fica disponível na internet, mais fácil a solução para determinados problemas será encontrada.
Nativamente, os Gadgets recorrem aos métodos  System.Gadget.Settings.read("parametroChave") e System.Gadget.Settings.readString("parametroChave") para ler valores de configurações relacionados à chave informada e os métodos System.Gadget.Settings.write("parametroChave", "valor") e System.Gadget.Settings.writeString("parametroChave", "valor").
E aí me veio a seguinte pergunta, e esta pode ser a sua neste momento. Qual a diferença entre writeString e write? A resposta é bem simples, ao chamar o writeString, o valor será armazenado no formato string. E qual a utilidade? Em caso de números com maior precisão, é recomendável armazená-los em String para evitar um arredondadmento, visto que usando write, deixamos a cargo do sistema, a interpretação do tipo de dados a ser gravado (o que em alguns casos, resulta em um truncamento ou perca de precisão). E feito a gravação, aonde encontro as informações gravadas?
As informação dos Gadgets em execução, geralmente podem ser encontradas no seguinte caminho:

C:\Users\Nome_de_Usuário\AppData\Local\Microsoft\Windows Sidebar

Nesta pasta, encontramos geralmente, um arquivo chamado Settings e uma pasta chamada Gadgets. No arquivo Settings.ini, ficam armazenadas todas as informações referentes as instâncias dos Gadgets em execução no Windows, como sua localização na tela entre outros. Ou seja, toda e qualquer alteração em um Gadget, resulta na atualização deste arquivo.

Partindo deste conhecimento, uma biblioteca JavaScript muito útil é o SettingsManager. Importando esta biblioteca, temos acesso aos seguintes métodos:

SettingsManager.loadFile() e SettingsManager.saveFile().

Segue abaixo um exemplo do uso desta biblioteca:

O método SettingsManager.loadFile(), carrega todas as configurações do arquivo Settings.ini localizado na pasta raíz do Gadget em memória.
Com o método SettingsManager.setValue("nome_grupo_config","chave", "valor"),  armazenamos em memória um valor associado a uma chave, pertencente a um grupo de configurações (o nome do grupo não faz muita diferença). É importante ressaltar que até o momento, nada foi escrito no arquivo
SettingsManager.getValue("nome_grupo_config","chave", valorPadrão), obtem da memória, um valor associado a uma chave, pertencente a um grupo de configurações, caso não seja possível obter este valor, será retornado o valor padrão.
O método SettingsManager.saveFile(), armazena todas as informações carregadas em memória em um arquivo Settings.ini (nome definido por padrão). Caso o arquivo não exista, ele é automaticamente criado.
E assim, independente de o computador ser reiniciado, desligado, ou o gadget fechado, todas as configurações permanecem salvas. Para maiores informações, segue o link original

Fonte: Settings Manager for Windows Vista Sidebar Gadgets

terça-feira, 21 de fevereiro de 2012

Criando, Hospedando e Consumindo um WCF Service

Neste tutorial, utilizei o Visual Studio 2010, IIS 7.0 e um navegador para vizualisar o conteúdo hospedado.


O projeto é um exemplo muito simples de uma calculadora, onde os métodos são expostos pelo serviço e consumidos por um client.

Iniciamos criando o projeto WCF que será o portador dos métodos do serviço a serem consumidos:

File>New Project>WCF>WCF Service Application

Neste projeto iremos editar  os arquivos Service1.svc.cs e o IService.cs (A interface (Service Contract), responsável por definir quais os métodos(Operation Contracts) a serem expostos pelo serviço.



Após editar os arquivos, é interessante compilarmos a solução para garantir que a mesma está funcionando corretamente.

Feito isso, clique com o botão direito no projeto WCF>Build Deployment Package. Com isto, o Visual Studio irá gerar um pacote na pasta obj>package pronto para ser publicado no IIS.


Agora, para que o serviço seja acessível, é necessário que ele rode em algum lugar. Neste post, usaremos o IIS para hospedar o serviço.


Com o IIS aberto, clique com o botão direito no site que hospedará a aplicação>Implantar>Importar Aplicativo. Em algumas versões dependendo do idioma, o termo implantar, pode aparecer como deploy.

Será exibida a seguinte janela onde apontaremos para nosso pacote gerado anteriormente na pasta obj>package.

Clique em avançar. Serão exibidos os conteúdo que o pacote contém e que serão implantados.


Em seguida, será exibida uma tela onde podemos personalizar o "alias", ou nome da aplicação no site.


Após definir um nome, clique em avançar e em seguida, concluir. Após isso, nossa aplicação teoricamente, deveria estar no ar. Para confirmar, basta abrir um navegador e digitar o endereço da máquina que hospedou a aplicação /(barra)nome da aplicação.


Se você obtiver um resultado igual a este, ou, parecido com este, sua aplicação está no ar.

Agora, criaremos uma aplicação do tipo Console, apenas para consumir o serviço e trazer o resultado.

Abrimos um novo projeto no Visual Studio: File>New>Project>Windows>Console Application

Para consumirmos um serviço, é necessário adicinar uma referência ao mesmo. Portanto, clicamos com o botão direito no projeto>Add Service Reference. Será exibida a seguinte janela:



Caso seu projeto WCF, Esteja na mesma solução do projeto Console, basta clicar no botão Discover e o serviço aparecerá na relação Services. Seguindo a idéia do post, inserimos o mesmo endereço utilizado no browser, apontando para o arquivo ".svc" e ao clicarmos em GO, será encontrado o serviço hospedado no IIS. Ainda na mesma janela, acessando a interface, vemos os métodos expostos pelo serviço. No campo inferior "Namespace" podemos definir o nome para identificação do serviço.
Após editarmos estas informações, basta clicar em OK.



Com isto já possuímos a referência de serviço em nosso projeto console para consumirmos o serviço própriamente dito.
Para consumirmos o serviço, basta instanciarmos um objeto client e a partir dele, efetuar a chamada dos métodos. Em meu teste, chamo a função Calculate passando dois valores decimais e a operação soma.
É uma boa prática, fecharmos a conexão com o serviço após as operações. Ao rodar o código acima, obtive o seguinte resultado:


Simples não? Nos vemos nos próximos posts! =)
Qualquer dúvida, crítica ou sugestão, sintam-se livres em comentar!

sexta-feira, 17 de fevereiro de 2012

Apresentação

Meu nome é Bruno, atuo na área de desenvolvimento em .NET com ênfase em C# e ASP.NET entre outros a quase um ano. No momento estou cursando a graduação em Desenvolvimento de Jogos Digitais na FATEC de Carapicuíba. Este blog tem a simples e única finalidade de contribuir na disseminação de conhecimentos das tecnologias de desenvolvimento Microsoft. Todos os comentários e sugestões são bem vindos.