VB.NET

Posts referentes à linguagem VB.NET

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!

Anúncios

.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!

Win Forms & WPF: Iniciando a aplicação junto com o Windows

Seria muito bom se pudéssemos configurar o nosso aplicativo para iniciar com o Windows apenas com um valor Booleano. Ex: IniciarComOWindows = true;

Justamente, desejando essa facilidade, eu escrevi a propriedade abaixo:

C#

        public bool RunAtStartup
        {
            get
            {
                Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey
                    ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                return !string.IsNullOrEmpty((string)registryKey.GetValue("Intelli_Clip"));
            }
            set
            {
                Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey
        ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                if (value)
                {
                    registryKey.SetValue("Intelli_Clip", System.Reflection.Assembly.GetExecutingAssembly().Location);
                }
                else
                {
                    registryKey.DeleteValue("Intelli_Clip");
                }
            }
        }

VB.NET:

Public Property RunAtStartup() As Boolean
	Get
		Dim registryKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
		Return Not String.IsNullOrEmpty(DirectCast(registryKey.GetValue("Intelli_Clip"), String))
	End Get
	Set
		Dim registryKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
		If value Then
			registryKey.SetValue("Intelli_Clip", System.Reflection.Assembly.GetExecutingAssembly().Location)
		Else
			registryKey.DeleteValue("Intelli_Clip")
		End If
	End Set
End Property

Troque Intelli_Clip pelo nome do seu aplicativo.

Esse código foi retirado do meu projeto Intelli Clip e funciona para WPF e Win Forms. 😉