C#: WPF acceptbutton equivalent.

Vroeger kon je in een Windows.Form het volgende doen:

Form form = new Form();
//voeg wat dingen toe aan form
Button enterButton = new Button("Klik hier");
form.AcceptButton = enterKnop();

Resultaat: het form klikt ‘zelf’ op de enterKnop als je op enter duwt.

In WPF is het heel anders, vanuit een ander oogpunt bekeken, namelijk niet het Form (Window) zelf, maar de knop.

Button enterKnop = new Button();
enterKnop.Content = "Klik hier";
enterKnop.IsDefault = true;

Button.IsDefault dus :)

Visual Studio 2008: run as Administrator + touchpad trouble

Ik heb net gemerkt dat als men Visual Studio 2008 opent als Administrator (voor het aanmaken van de website bij IIS) de scrolling functie van mijn Synaptics touchpad niet werkt. Hij heeft er dus geen toegang tot.

Synaptics Touchad enhancer openen als Administrator helpt, maar daar moet je dan een geplande taak van maken, anders doet UAC iedere keer moeilijk.

-Kristof out

Visual Studio 2008 & VMware debugging.

Iedere programmeur komt het wel eens tegen: een app schrijven in u devomgeving (Vista x64 hier), en dan backwards compatibilty checken met XP, Vista x32, Server 2k3, you name it.

Daarvoor heeft VMware heel leuk speelgoed voor, namelijk de virtuele debugger.

Even uitleggen:

  • Op u host opent ge Visual Studio 2005/2008
  • In VMware opent ge een XP VM
  • Via de optie ‘VMware’ in Visual Studio launched ge u app IN de VM, en deze draait dan echt in XP
  • Debuggen maar!

Helaasch werkt VMware Workstation Virtual Debugger for Visual Studio 2005 niet samen met 2008.

Of wel? (Ik denk het wel, anders waart ge dit niet aan het lezen ;) )

De stappen voor 32-bit host

  1. Ga naar
    C:\Program Files\VMware\VMware Workstation
  2. Maak daar de volgende map aan:
    Visual Studio Integrated Debugger
  3. Open het bestand Visual~1.cab in de map
    C:\Program Files\VMware\VMware Workstation
  4. Pak de bestanden ws_vsid.pdf* en ws_vsid.dll* (niet vsid_ja.dll*!)
  5. Nu is het oppassen: Als ge deze bestanden uitpakt met Winrar plaatst hij deze in een Virtual Store, om dat te omzeilen moet ge de .cab openen met de Windows geintergreerde zip-handler.
  6. Pak deze dan uit naar de map
    C:\Program Files\VMware\VMware Workstation\Visual Studio Integrated Debugger
  7. Als ge het goed hebt gedaan, vraagt Vista u om toelating (UAC)
  8. Dan opent ge een CMD als Administrator (rechtermuisknop > Run As Administrator)
  9. Plak dit erin:
    regsvr32 "C:\Program Files\VMware\VMware Workstation\Visual Studio Integrated Debugger\vsid.dll"
  10. En als laatste, plak het volgende in een textbestand, sla op als vs.reg (niet vs.reg.txt!!!), en dubbelklik erop om het te mergen met het register:
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\AddIns\VMDebugger.Connect]
    "AboutBoxDetails"="For more information about VMware Inc, see their website at\\r\\nhttp://www.vmware.com\\r\\nFor customer support, call 1-800-xxx-xxxx\\r\\nCopyright (c) 2006 VMware Inc Inc."
    "AboutBoxIcon"="C:\\Program Files\\VMware\\VMware Workstation\\Visual Studio Integrated Debugger\\vsid.dll,1"
    "CommandLineSafe"=dword:00000000
    "CommandPreload"=dword:00000000
    "Description"="VMDebugger - Visual Studio Integrated Virtual Machine Debugger"
    "FriendlyName"="VMDebugger"
    "LoadBehavior"=dword:00000001

Hier volgen de stappen voor 64-bit host (praktisch identiek)

  1. Ga naar
    C:\Program Files (x86)\VMware\VMware Workstation
  2. Maak daar de volgende map aan:
    Visual Studio Integrated Debugger
  3. Open het bestand Visual~1.cab in de map
    C:\Program Files (x86)\VMware\VMware Workstation
  4. Pak de bestanden ws_vsid.pdf* en ws_vsid.dll* (niet vsid_ja.dll*!)
  5. Nu is het oppassen: Als ge deze bestanden uitpakt met Winrar plaatst hij deze in een Virtual Store, om dat te omzeilen moet ge de .cab openen met de Windows geintergreerde zip-handler.
  6. Pak deze dan uit naar de map
    C:\Program Files (x86)\VMware\VMware Workstation\Visual Studio Integrated Debugger
  7. Als ge het goed hebt gedaan, vraagt Vista u om toelating (UAC)
  8. Dan opent ge een CMD als Administrator (rechtermuisknop > Run As Administrator)
  9. Plak dit erin:
    regsvr32 "C:\Program Files (x86)\VMware\VMware Workstation\Visual Studio Integrated Debugger\vsid.dll"
  10. En als laatste, plak het volgende in een textbestand, sla op als vs.reg (niet vs.reg.txt!!!), en dubbelklik erop om het te mergen met het register:
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432node\Microsoft\VisualStudio\9.0\AddIns\VMDebugger.Connect]
    "AboutBoxDetails"="For more information about VMware Inc, see their website at\\r\\nhttp://www.vmware.com\\r\\nFor customer support, call 1-800-xxx-xxxx\\r\\nCopyright (c) 2006 VMware Inc Inc."
    "AboutBoxIcon"="C:\\Program Files (x86)\\VMware\\VMware Workstation\\Visual Studio Integrated Debugger\\vsid.dll,1"
    "CommandLineSafe"=dword:00000000
    "CommandPreload"=dword:00000000
    "Description"="VMDebugger - Visual Studio Integrated Virtual Machine Debugger"
    "FriendlyName"="VMDebugger"
    "LoadBehavior"=dword:00000001

Dat is het ;) Meer niet. Testen maar!

Succes, en post maar als het niet lukt ;)

-Kristof out.

UPDATE: Icoonfix in de x86-64 reg key :)

C#: System.Windows.Forms.Combobox issues

Ik ben al enige tijd bezig met een chatApp, zoals jullie weten. Voor de logfunctie wou ik iets moois, dus ik besloot een combobox te maken, waarbij steeds de nieuwe logmessage aan wordt geappended & dan die wordt geselecteerd, waardoor ge mooi de laatste logmessage in beeld krijgt.

Zo dus:

Combobox Readonly

Maar hoe lukt dat?

Na lang zoeken, en zelfs het proberen van het extenden van de combobox, en daarbij capturen van allerhande events (wat allemaal niet 100% werkt) is de oplossing SUPERSIMPEL:

this.comboBoxLog.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;

Meer is er echt niets aan.

M’n programmatje vlot ook heel mooi. Als sneak preview deze screenshot:

ChatHere screenshot

ChatHere: uitleg

Enige tijd geleden heb ik iets gepost over een ChatApp die ik aan het schrijven was. (hier). Nu is er een gigantische update, de source is volledig herschreven, apparte GUI en connectie DLL, voor betere portability (de DLL kan ik nu heel gemakkelijk gebruiken op WM6).

Het programma creeert bij het opstarten een listeningsocket op eender welk adres, op poort 8221.

Indien de persoon zelf kiest voor een connectie te maken naar een andere computer wordt de listeningsocket gesloten, en een workingsocket gecreeert wat bind op de door u ingegeven naam / ip.

De ontvanger, met dan de listeningsocket ontvangt uw packetje, en creeert een working socket op basis van de listeningsocket (met het ip van de zender).

Op dat moment kunt ge met elkaar chatten.

De source wordt binnenkort gepost, ik moet nog wat debuggen, en misschien van Windows.Forms naar XAML gaan, maar dat moet ik nog bekijken.

C# 3.0, .NET 3.5: Automatic properties

Properties, sommigen gebruiken het, sommigen niet. Zelf heb ik leren programmeren met getters & setters (vanuit Java). Sinds korte tijd gebruik ik toch properties in C#, omdat het eenvoudiger is, en overzichtelijker.

Voorbeeldje:

class TestProps
{
	private String nick;

	public TestProps(String nick)
	{
		this.nick = nick;
	}

	//de C# manier:
	public String Nick
	{
		get
		{
			return this.nick;
		}
		set
		{
			this.nick = value;
		}
	}

	//de Java manier (zelfde syntax in C#)
	public String getNick()
	{
		return this.nick;
	}

	public void setNick(String nick)
	{
		this.nick = nick;
	}
}

Dus ofwel gebruikt ge de C# manier, ofwel de Java manier, whatever you wish, beiden hebben hetzelfde eindresultaat.

Maar nu zit deze nieuweigheid in C#:

class TestProps2
{
	public TestProps2(String nick)
	{
		this.Nick = nick;
	}

	public String Nick { get; set; }
}

That’s it! Geen interne private variable meer, dat wordt automatisch door de compiler gedaan. Veel korter dus, en ge kunt er op dezelfde manier aan als de properties op de C# manier :)

Seminarie Visual Studio 2008

Vandaag mochten we met de klas naar een seminarie van Visual Studio 2008, met daarin uitleg van de nieuwe features van de talen vooral.

Een aantal dingen die me zijn bijgebleven:

  • Shitload aan nieuwe features
  • XAML is prachtig
  • LINQ is cool
  • Automatic properties zijn handig!

Alleen was het zeer jammer dat ook de eerste jaars daar waren, omdat zij er niets van snapten van het code-gedeelte, en zij zorgden dan ook voor lawijt. Jammer.

 

Maar over het algemeen was het zeer geslaagd, en ben ik nog meer overtuigd van wat ik al wist: Microsoft is the way to go in de toekomst.

Java syntax en Swing, tegen C++ syntax en .NET (Windows Forms)

Vandaag mijn examen Java zitten te leren, eigenlijk gewoon alle oefeningen opnieuw maken, zodat ik terug de feel van Java te pakken krijg (veel gewerkt met C++ laatste tijd), toch gek, die syntax van klasses in Java, t.o.v. die van C++.

Een voorbeeldje:

//Java
public class ProfileTest extends Test
{
	public ProfileTest()
 	{
 		super();
 	}
}
//C++
public class ProfileTest : Test
{
 	public ProfileTest() : Test()
 	{
 	}
}

Veel verschil is er niet, doch vind ik het gek, waarom ze werken met die super();, omdat die toch op de eerste regel MOET staan, voordat er iets anders wordt uitgevoerd. Dan is de syntax van C++ duidelijker, omdat er daar geen verwarring kan bestaan, op welke regel in de constructor deze moet komen.

Een ander onderdeel, waar een compleet andere gedachtengang nodig voor is, is het schrijven van een GUI, neem het simpele voorbeeld van een knop:

In Java doet men:

JButton b = new JButton();
b.addActionListener(new Listener());
public class Listener implements ActionListener
{
	public void actionPerformed(ActionEvent e)
	{
	}
}

In .NET (Windows Forms) doet met het zo:

Button^ b;
b->Click += gcnew System::EventHandler(this, &button_Click);
System::Void button_Click(System::Object^ sender, System::EventArgs^ e)
{
}

Weer is .NET veel meer to the point, het enige wat er moet gebeuren, is een functie schrijven, met de code wat er moet gebeuren, en dan een bepaald event aan de knop hangen, die de functie triggert, itt Java, daar moet de code worden geschreven, eventueel een class, of innerclass, die weer bepaalde klassen implementeert, en wat voor een namen: addActionListener(), actionPerformed()… in .NET is het Click. Simpeler kan toch niet?

C#: Compact framework, numericonly TextBox

Voor een TextBox puur numeriek te maken is er de volgende simpele code in het .NET 2.0 framework:

InputModeEditor.SetInputMode(textBox, InputMode.Numeric);

Dan kunt ge nog steeds # en * invoeren, ik wou dat deze 2 veranderd werden in een comma, dus ik ben tot de volgende code gekomen:

Windows.Forms.TextBox textBox = new Windows.Forms.TextBox();
this.textBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Numeric_KeyPress);

/* ... */
private void Numeric_KeyPress(object sender, KeyPressEventArgs e)
{
	char decimalSeperator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator.ToCharArray()[0];

	if ((e.KeyChar == '#' || e.KeyChar == '*'))
	{
		if (((TextBox)sender).Text.IndexOf(decimalSeperator) == -1)
			((TextBox)sender).SelectedText += decimalSeperator;

		e.Handled = true;
	}
}

Enjoy :)