.NET – Habilitando o OpenFileDialog no controle PropertyGrid

Postado em 24/08/2010 18:08:45 por Tomás Vásquez

Poucou utilizado em sistemas tradicionais, infelizmente, o controle PropertyGrid disponibilizado a partir do .NET Framework 2.0 possui um forma prática de exibir características de um determinado objeto ou controle. Um tutorial bem completo deste pode ser visto aqui.

Tudo certo. Em um de seus usos, fiquei curioso em saber como alguns sistemas, inclusive o Visual Studio e outras IDEs Microsoft conseguir transformar algumas das caixas de valores do PropertyGrid campos OpenFileDialog, ou seja, quando este precisar conter o caminho de um arquivo, que aparecesse o pequeno botão a direta do campo para exibir tal funcionalidade.

Bom, a resposta é simples. A propriedade que irá expor o valor deve conter os seguintes atributos:

[EditorAttribute(typeof(System.Windows.Forms.Design.FileNameEditor),
typeof(System.Drawing.Design.UITypeEditor))]
public string CaminhoDoArquivo { get; set; }

A mágica é feita pelo atributo System.Windows.Forms.Design.FileNameEditor. O projeto precisa referenciar a bibliotecas System.Windows.Forms e System.Design para alcançar as classes mencionadas. A aparência fica dessa forma:

Também é possível adicionar a caixa de mapeamento de diretório, trocando o valor para System.Windows.Forms.Design.FolderNameEditor. O funcionamento do clique nos botões dispensa explicações, bem como a versão do código para VB.NET, certo?

Referências

http://stackoverflow.com/questions/170791/how-can-i-get-an-openfiledialog-in-a-custom-controls-property-grid

Bom proveito!

Dicas – Instalando o Service Pack 2 no Windows 2003 Server

Postado em 23/08/2010 16:08:19 por Tomás Vásquez

Sofri um pouco com o problema, então, vou compartilhar a informação para economizar algumas horas de trabalho dos colegas internautas. Quando se tem uma instalação de um Windows 2003 Server em Português Brasileiro (não sei se no R2 o mesmo problema acontece) com SP1 instalado ou pré-instalado, a tentiva de instalar o Service Pack 2 via download direto do instalador ou mesmo via Windows Update é no mínimo frustada.

A 1ª sempre acusa corrompimento do arquivo e a 2ª o download simplesmente falha ou desaparece. Conclusão, nada de instalar o SP2.

Para variar, uma garimpada na internet resolve o caso (nem sempre, mas dessa vez foi). A solução é baixar a imagem do CD de instalação que a Microsoft geralmente disponibiliza em seus downloads de Service Pack. Por algum motivo, as instalações tradicionais não funcionam nesta atualização exclusivamente, só via o arquivo mencionado cujo link é colocado abaixo:

http://www.microsoft.com/downloads/details.aspx?familyid=1B9FE9E4-1D57-4698-A5CF-DB271ED6D90A&displaylang=pt-br

O ideial é gravar um CD/DVD usando um programa tradicional de gravação ou usar um desses mapeadores de arquivos ISO, como o Daemon Tools. Aí só proceder com a instalação normalmente.

Referências

http://www.linhadefensiva.org/forum/index.php?showtopic=91769

Excel – Desbloqueando Planilhas

Postado em 22/08/2010 18:08:30 por Tomás Vásquez

Esse é um dos posts “indesejados” por aqueles que trabalham com Excel em seu dia a dia, mas que precisam estar na base de conhecimento de todos eles, pois uma das características de qualquer bom sistema, é saber de suas fragilidades.

O Excel possui nativamente um sistema de proteção de planilhas baseados em senha, mas que é um pouco frágil, do ponto de vista técnico/avançado. Tão frágil que existe um código em VBA que é quase uma convenção entre os programadores da linguagem para desbloquear planilhas de forma rápida. Abaixo segue o mesmo:

Sub DesprotegerEstaPlanilha()
 
    Dim i, i1, i2, i3, i4, i5, i6 As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer
    On Error Resume Next
    For i = 65 To 66
        For j = 65 To 66
            For k = 65 To 66
                For l = 65 To 66
                    For m = 65 To 66
                        For i1 = 65 To 66
                            For i2 = 65 To 66
                                For i3 = 65 To 66
                                    For i4 = 65 To 66
                                        For i5 = 65 To 66
                                            For i6 = 65 To 66
                                                For n = 32 To 126
                                                    ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                                                    If ActiveSheet.ProtectContents = False Then
                                                        MsgBox "Planilha " & ActiveSheet.Name & " debloqueada sob a senha: " & Chr(i) & Chr(j) & _
                                                               Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
                                                               Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                                                        Exit Sub
                                                    End If
                                                Next
                                            Next
                                        Next
                                    Next
                                Next
                            Next
                        Next
                    Next
                Next
            Next
        Next
    Next
End Sub

O motivo da facilidade do desbloqueio está na simplicidade do algoritmo de encriptação da senha. Conforme anunciado pela própria especificação do Office Open XML specification, a mesma se baseia em um hash de 16 bits. Uma lida rápida em documentações de criptografia nos leva a constatação de que o algoritmo hash produz resultados “sem volta”, ou seja, é impossível obter o valor original a partir de “seu hash”, mas também que a base em 16 bit é quebrável sem muito esforço computacional. A função acima quebra a senha fazendo uso de força bruta, o que comprova a fragilidade do método utilizado.

Disso, dá para tirar algumas conclusões e cuidados que devemos tomar quando falamos de aplicativos e planilhas sérias em nosso dia a dia:

  • Use o recurso de proteção de planilhas somente para bloqueio de nevegação ou algo parecido
  • Se quiser proteger efetivamente, use proteção de senha do arquivo
  • Use senhas fortes sempre que possível

Para projetos VBA:

  • Use sempre proteção de senha para os projetos
  • Siga as dicas deste blog e do nosso fórum sobre técnicas de segurança para projetos VBA

Mais algumas dicas:

http://www.oraxcel.com/projects/encoffice/help/How_safe_is_Excel_encryption.html

Referências

http://kohei.us/2008/01/18/excel-sheet-protection-password-hash/

VBA – Retornando erros do Excel em Funções personalizadas

Postado em 19/08/2010 22:08:52 por Tomás Vásquez


Aproveitando o gancho do post anterior, deixo mais uma dica para funções personalizadas no Excel.

Quando você criar suas funções personalizadas no Excel, como qualquer função que se cria, uma situação possível são os erros que podem acontecer. Dá para tratar sem muito segredo, retornando uma mensagem de erro, MsgBox ou coisa parecida. Mas em alguns casos, o ideal mesmo seria retornar um erro do próprio Excel, por exemplo, #N/D ou não disponível. Além de ser a coisa “certa” a fazer, o usuário pode usar as fórmulas do Excel para validação e verificação como ÉERROS ou É.NÃO.DISP, entre outras.

Para retornar o erro, é preciso usar a função CVErr e uma das constantes de erro no Excel. A função CVErr retorna um tipo Variant de subtipo Error que contém um número de erro especificado pelo usuário. Meio complicado, mas o uso é simples:

Function RetornaErro()
	RetornaErro = CVErr(2007)
End Function

Criando essa função no VBA, bastar colocar em uma célular a fórmula =RetornaErro() e ver o resultado. No caso, o erro demonstrado é o #DIV/0, erro de divisão por zero, pois o código se refere a ele. Abaixo segue uma tabela com todos os códigos de erro de função do Microsoft Excel:

  • xlErrDiv0 – Número do erro: 2007 – Erro de divsão por zero
  • xlErrNA – Número do erro: 2042 – Erro valor Não Disponível
  • xlErrName – Número do erro: 2029 – Erro valor Nome Inválido
  • xlErrNull – Número do erro: 2000 – Erro valor Valor Nulo
  • xlErrNum – Número do erro: 2036 – Erro valor Número Inválido
  • xlErrRef – Número do erro: 2023 – Erro valor Referência Inválida
  • xlErrValue – Número do erro: 2015 – Erro valor Valor Inválido

Há muitos outros códigos de erro, mas para o contexto do Excel, precisamos nos manter a estes. Abaixo mais um exemplo:

Function CalculaDolar(ByVal Valor As Double)
	'... cálculo
	If Not IsNumeric(Valor) Then
		CalculaDolar = CVErr(xlErrNum)
	End If
End Function

Em resumo, se o valor informado no parâmetro não for numérico, é retornado o erro. Dessa forma, as funções ficam bem mais profissionais, não?

Bom proveito!




Página 3 de 10612345102030...Última »