VB.NET

Posts referentes à linguagem VB.NET

.NET CORE: API para conversão de moedas – Yahoo Currency

Yahoo Currency

Salve galera. Na verdade, eu já havia feito uma postagem sobre isso no passado. Mas decidi reescrever algumas partes do código e atualizar o projeto (de Portable Class Library) para uma Class Library(.NET CORE 2) que é multi plataforma.

O funcionamento é o mesmo, a diferença principal fica pelo suporte à assincronicidade permitindo que você use métodos async e use await.

Esse é mais um projeto livre e open source que estou disponibilizando no meu GITHUB.

Os códigos estão sumarizados(documentados) e acompanham um Demo em WPF.

Abaixo uma pequena porção de código:

        ///

        /// O código abaixo é um exemplo simples de como usar os webservices de moeda de forma assíncrona
        /// 

        /// 
        public static async Task AsyncExample()
        {
            HL.YahooCurrency.Currency currency = new HL.YahooCurrency.Currency();

            //VOCÊ DEVE INCLUIR A LINHA ABAIXO OBRIGATORIAMENTE
            //É de extrema importância que você use o método WaitLoad() para aguardar a inicialização desse objeto, que ocorre de forma assíncrona
            await currency.WaitLoad();

            //Seleciona a moeda de origem
            currency.SourceUnit = currency.Units.ElementAt(0);
            //Seleciona a moeda de destino, para a qual se quer converter um valor
            currency.OutputUnit = currency.Units.ElementAt(1);
            //Dá um valor para conversão
            currency.SourceValue = 2.32f;
            //Mostra o valor convertido para a moeda de destino
            System.Diagnostics.Debug.WriteLine(currency.OutputValue);
        }

        ///

        /// O código abaixo é um exemplo simples de como usar os webservices de moeda de forma síncrona(normal)
        /// 

        public static void SynchronousExample()
        {
            HL.YahooCurrency.Currency currency = new HL.YahooCurrency.Currency();

            //VOCÊ DEVE INCLUIR A LINHA ABAIXO OBRIGATORIAMENTE
            //É de extrema importância que você use o método WaitLoad() para aguardar a inicialização desse objeto, que ocorre de forma assíncrona
            //Ao invés de usar await, você pode usar o método .Wait() em contextos síncronos.
            //Dessa forma, a thread em execução irá ser bloqueada por algumas frações de tempo, até que o carregamento dos dados seja feito completamente
            //Normalmente, isso deverá tomar cerca de 1 segundo, mas em conexões de internet mais lentas, pode levar até 6. Ou seja, a interface de usuário irá ficar bloqueada durante esse tempo
            currency.WaitLoad().Wait();

            //Seleciona a moeda de origem
            currency.SourceUnit = currency.Units.ElementAt(0);
            //Seleciona a moeda de destino, para a qual se quer converter um valor
            currency.OutputUnit = currency.Units.ElementAt(1);
            //Dá um valor para conversão
            currency.SourceValue = 2.32f;
            //Mostra o valor convertido para a moeda de destino
            System.Diagnostics.Debug.WriteLine(currency.OutputValue);
        }

Gostou?

Detalhe, esse objeto YahooCurrency pode ser usado diretamente no XAML, pois ele implementa a interface INotifyPropertyChanged, permitindo que seja feito Data Bindings. Quando usando em XAML ele irá operar, por padrão, de forma assíncrona. Você deverá utilizar a propriedade IsLoading para exibir alguma mensagem de carregamento para o usuário (enquanto os dados são baixados) e/ou desabilitar os controles da interface.

Isso tudo que mencionei acima está implementado no exemplo em WPF que acompanha a API.

Chega de papo, aí está o link:

GitHub – HerbertLausmann/HL.YahooCurrency: .NET C# Multiplatform wrapper for Yahoo Currency Web Service. Convert between over 100 different currencies.

Lembrando, que como ela é escrita sob os padrões do .NET STANDARD 2, você poderá usa-la no Xamarin, Mono e etc.

Um abraço!

Anúncios

WPF: Trabalhando com MDI no Windows Presentation Foundation

Olá pessoal,

Neste post irei apresentar algo interessante para a plataforma WPF. Trata-se de uma API, open-source, que permite a implementação de interfaces MDI, fáceis de usar no Windows Forms, mas que não estão disponíveis no Windows Presentation Foundation.

Essa libraria possui dois temas: Aero (Windows 7) e Luna (Windows XP).

Aero luna

Essa API está disponível de forma gratuita e open-source no Codeplex, através do link abaixo:

WPF Multiple Document Interface (MDI) – Home

Aproveitem!

.NET: Rodar um executável externo como Administrador

Certas vezes é necessário rodar um executável externo com os direitos de Administrador. Pode ser algum utilitário do Windows como a Restauração do Sistema, um módulo separado do nosso aplicativo, e etc.

A metodologia é simples:

C#:

var rstrui = new System.Diagnostics.ProcessStartInfo();
rstrui.FileName = "rstrui.exe";
rstrui.UseShellExecute = true;
rstrui.Verb = "runas"; //O segredo é esta linha!
rstrui.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
System.Diagnostics.Process.Start(rstrui);

VB.NET:

Dim rstrui As New System.Diagnostics.ProcessStartInfo()
rstrui.FileName = "rstrui.exe"
rstrui.UseShellExecute = True
rstrui.Verb = "runas" 'O segredo é esta linha!
rstrui.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Windows)
System.Diagnostics.Process.Start(rstrui)

Basicamente, nós definimos o Verbo para runas que é o “comando” responsável por exigir os direitos de administrador na inicialização do aplicativo.
No caso, o código acima irá inicializar, com permissões de Administrador, o utilitário de restauração do sistema do Windows.

.NET: Deletar itens de uma coleção durante uma iteração (for, foreach) – C# & VB.NET

As vezes, precisamos percorrer uma determinada coleção fazendo verificações (Através de blocos if, por exemplo), removendo itens que não se enquadram em uma determinada regra. Contudo, não podemos modificar uma coleção de dentro de um laço foreach (For Each no VB), e também teremos problemas ao fazer isso de dentro de uma laço for (For) que esteja percorrendo uma coleção.

E a solução? Mais simples do que se pode imaginar! Ao invés de usar um foreach ou um for comum para percorrer a coleção, você usa um for reverso.

Segue o exemplo:

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace HL
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<string> Items = new List<string>(new string[]{"Herbert", "Lausmann", "é", "o", "cara", "!"});
            
            for(int i = (Items.Count - 1); i >= 0; --i)
            {
                if(Items[i].Contains('a'))
                {
                    Items.RemoveAt(i);
                }
            }
            
            foreach(string str in Items) Console.WriteLine(str);
            Console.ReadKey();
        }
    }
}

VB.NET:

Imports System.Collections.Generic
Imports System.Linq
Imports System.Text.RegularExpressions

Namespace HL
	Public Class Program
		Public Shared Sub Main()
			Dim Items As New List(Of String)(New String() {"Herbert", "Lausmann", "é", "o", "cara", "!"})

			For i As Integer = (Items.Count - 1) To 0 Step -1
				If Items(i).Contains("a"C) Then
					Items.RemoveAt(i)
				End If
			Next

			For Each str As String In Items
				Console.WriteLine(str)
			Next
			Console.ReadKey()
		End Sub
	End Class
End Namespace

😉

Win Forms: Mover form sem borda no C#

Código bem simples para mover um Form no C#. Inclusive é a melhor forma, mais leve e sem delays:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace HL
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public const int WM_NCLBUTTONDOWN = 0xA1;
        public const int HT_CAPTION = 0x2;
        public const int WM_LBUTTONDOWN = 0x0201;

        [DllImportAttribute("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd,
                         int Msg, int wParam, int lParam);
        [DllImportAttribute("user32.dll")]
        public static extern bool ReleaseCapture();

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.Msg == WM_LBUTTONDOWN)
            {
                ReleaseCapture();
                SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            }
        }

    }
}

Se você programa em VB.NET, eu tenho um post sobre isso para você:

Movendo um Form sem borda (FormBorderStyle = None): A forma correta – VB.NET

.NET: Criando e mostrando rotas com o Google Maps – C#

Recentemente, respondi uma thread nos fóruns do MSDN, cujo caso era mostrar uma rota usando o Google Maps no controle WebBrowser. O problema do inquiridor era um erro de script que acontecia no carregamento do Google Maps. Nós trabalhamos em conjunto e conseguimos resolver!

Daí resolvi postar o código aqui no blog, junto com um demo, pois achei o assunto bem interessante!

Criando rotas com o Google Maps

(mais…)

.NET, JavaScript: Revertendo uma string/url

Eu não sei bem qual a utilidade disso, mas é a forma mais simples de se reverter uma string:

C#:

using System;

namespace HL
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string str = @"/moc.sserpdrow.nnamsualtodtrebreh//:ptth";
            char[] chars = str.ToCharArray();
            
            Array.Reverse(chars);

            string reverted = new string(chars);
            
            Console.WriteLine(reverted);
        }
    }
}

VB.NET:

Imports System

Namespace HL
    Public Module Program
        Public Sub Main(args() As string)
            Dim str As String = "/moc.sserpdrow.nnamsualtodtrebreh//:ptth"
            Dim chars As Char() = str.ToCharArray()

            Array.Reverse(chars)

            Dim reverted As New String(chars)

            Console.WriteLine(reverted)
        End Sub
    End Module
End Namespace

Basicamente, eu transformo a string em um array de chars e uso o método Array.Reverse (Array) (System) para inverter a ordem do array. E depois eu crio uma nova instância de uma string usando o array de chars revertido.

E segue de bônus como reverter uma string no JavaScript:

var str = "/moc.sserpdrow.nnamsualtodtrebreh//:ptth";

var reverted = str.split("").reverse().join("");

print(reverted);

Até a próxima!