<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>BigBasti's Blog</title>
	
	<link>http://blog.bigbasti.com</link>
	<description>About Me &amp; my Digital Lifestyle</description>
	<lastBuildDate>Thu, 19 Aug 2010 09:22:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/bigbasti/yEFJ" /><feedburner:info uri="bigbasti/yefj" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>HowTo: Bilder als Links benutzen in ASP.NET MVC</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/4wbwS4MYBVQ/</link>
		<comments>http://blog.bigbasti.com/howto-bilder-als-links-benutzen-in-asp-net-mvc/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 09:20:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1247</guid>
		<description><![CDATA[In diesem Artikel geht es um eine eigentlich ganz simpl [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Artikel geht es um eine eigentlich ganz simple Angelegenheit, nämlich Bilder-Links in ASP.NET MVC.  Um Links zu generieren wird hier eine <a href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;l=DE-DE&amp;k=k%28SYSTEM.WEB.MVC.HTMLHELPER%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-CSHARP%29&amp;rd=true" target="_blank">HtmlHelper Klasse</a> bereitgestellt, die die Links abhängig von der gewünschten Action und dem gewünschten Controller generiert, das ist eigentlich eine feine Sache, nur lassen sich damit leider keine Bilder-Links generieren.</p>
<p>Das Problem an der Sache ist, dass der HtmlHelper seine Ausgabe für HTML formatiert und somit einer Übergabe von "&lt;img src="..." alt="..." /&gt;" als Linkname nicht verarbeitet werden würde, sondern direkt so ausgegeben.</p>
<p>Ich habe mich dann an Google gewendet und viele verschiedene Ansätze gefunden um das <em>Problem </em>zu lösen oder wenigstens zu umgehen. Hier gibt es allgemein gesagt zwei Lösungsansätze und man muss wohl selber entscheiden welches einem mehr Vorteile bietet und einem persönlich zusagt.</p>
<p><strong>Ansatz 1: Den a-Tag und den img-Tag selber anlegen und die Route mit der <a href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;l=DE-DE&amp;k=k%28SYSTEM.WEB.MVC.URLHELPER.ACTION%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-CSHARP%29&amp;rd=true" target="_blank">UrlHelper-Klasse</a> generieren.</strong> Hier ein paar Beispiele:</p>
<pre>
<pre class="brush: html; ">

&lt;a href=&quot;&lt;%= Url.RouteUrl(&quot;&gt;&quot;&gt;
   put in &lt;span&gt;whatever&lt;/span&gt; you want, also &lt;img src=&quot;a.gif&quot; alt=&quot;images&quot; /&gt;.
&lt;/a&gt;

&lt;a href=&quot;&lt;%= Url.Action(&quot;&gt;&quot;&gt;
   &lt;img src=&quot;../../Content/Images/add_48.png&quot; alt=&quot;&quot; /&gt;
&lt;/a&gt;

&lt;%= Html.ActionLink(&quot;__IMAGE_PLACEHOLDER__&quot;, &quot;Products&quot;)
.Replace(&quot;__IMAGE_PLACEHOLDER__&quot;, &quot;&lt;img src=&quot;\&quot; alt=&quot;&quot; /&gt;&quot;)%&gt;
</pre>
</pre>
<p>Alle diese Methoden funktionieren und erzeugen einen Link der ein Bild umschießt, doch in meinen Augen ist das eine nicht so schöne Methode, denn solche Links werden doch ziemlich oft generiert und da fände ich eine schöne Methode wie Html.ActionLinkWithImage schon angenehmer und lesbarer.</p>
<p><strong>Ansatz 2: Eine Eigene Helper Methode erstellen die die Generierung für uns übernimmt:</strong></p>
<p>Nach etwas mehr Suchen habe ich auch eine <a href="http://blog.bigbasti.com/net-mit-extension-methods-arbeiten/" target="_blank">Extension Method</a> in<a href="http://www.superexpert.com/blog/archive/2009/03/03/chapter-6-understanding-html-helpers.aspx" target="_blank"> Stephen Walthers Blog gefunden</a>. Diese sieht wie folgt aus (habe die Funktion noch um den Parameter Controller ergänzt):</p>
<pre>
<pre class="brush: csharp; ">

public static string ImageLink(this HtmlHelper helper, string actionName,
    string controllerName, string imageUrl, string alternateText, object routeValues,
    object linkHtmlAttributes, object imageHtmlAttributes) {

    var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
    var url = urlHelper.Action(actionName, controllerName, routeValues);

    // Create link
    var linkTagBuilder = new TagBuilder(&quot;a&quot;);
    linkTagBuilder.MergeAttribute(&quot;href&quot;, url);
    linkTagBuilder.MergeAttributes(new RouteValueDictionary(linkHtmlAttributes));

    // Create image
    var imageTagBuilder = new TagBuilder(&quot;img&quot;);
    imageTagBuilder.MergeAttribute(&quot;src&quot;, urlHelper.Content(imageUrl));
    imageTagBuilder.MergeAttribute(&quot;alt&quot;, urlHelper.Encode(alternateText));
    imageTagBuilder.MergeAttributes(new RouteValueDictionary(imageHtmlAttributes));

    // Add image to link
    linkTagBuilder.InnerHtml = imageTagBuilder.ToString(TagRenderMode.SelfClosing);

    return linkTagBuilder.ToString();
}

//Benutzung:
&lt;%= Html.ImageLink(&quot;Action&quot;, &quot;Controller&quot;, &quot;Pfad_zum_Bild&quot;, &quot;alternativText&quot;, new { id = e.Id }, null, new { border = &quot;0&quot; })%&gt;
</pre>
</pre>
<p>Diese Funktion erledigt genau das was ich brauchte, sie generiert den benötigten Link und auch den IMG-Tag aus meinen übergebenen Informationen und sieht der Html.ActionLink() Methode dabei auch noch so ähnlich dass man gar nicht darauf kommt, dass es eine nachträglich eingefügte Extension ist <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Falls ihr noch nach einer Möglichkeit nutzt das ganze auch mit streng typisierten Links zu nutzen solltet ihr in <a href="http://blogs.aspiant.com/Mirko/Trackback.aspx?guid=0bc618ee-cce8-4f3a-8269-b7d38f790e5f" target="_blank">Mirkos Blog vorbeischauen</a>, er hat auch dafür eine Extension Method gebastelt.</p>
<p>Ich bin mit dieser Lösung ganz zufrieden, doch interessiert es mich trotzdem, wie ihr das in euren Projekten handhabt und eure Links erstellt. Vielleicht habt ihr ja eine bessere Methode auf Lager.</p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/4wbwS4MYBVQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/howto-bilder-als-links-benutzen-in-asp-net-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/howto-bilder-als-links-benutzen-in-asp-net-mvc/</feedburner:origLink></item>
		<item>
		<title>Add-On Perle: Visual Studio Productivity Power Tools</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/0ODdh6N0aRE/</link>
		<comments>http://blog.bigbasti.com/add-on-perle-visual-studio-productivity-power-tools/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 07:14:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1240</guid>
		<description><![CDATA[Wer mit Visual Studio 2010 arbeitet und Visual Studio P [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/2010-08-17-09-12-00.png"><img class="alignleft size-full wp-image-1243" title="2010-08-17 09 12 00" src="http://blog.bigbasti.com/uploads/2010-08-17-09-12-00.png" alt="" width="82" height="66" /></a>Wer mit Visual Studio 2010 arbeitet und Visual Studio Productivity Power Tools noch nicht kennt sollte schnellst möglich handeln und sich dieses Add-On installieren, denn es macht die Arbeit mit Visual Studio sehr viel angenehmer (kaum zu glauben dass das eigentlich möglich ist <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</p>
<p>Diese Power Tools verbessern hierbei viele Kleinigkeiten, die den Arbeitsprozess angenehmer machen. Hier ein paar Beispiele:</p>
<ul>
<li>STRG+Mausklick auf eine Variable befördert euch zu der Klasse</li>
<li>STRG+1/2/3 Bringen bequeme Sprungmöglichkeiten innerhalb der markierten Klasse</li>
<li>ALT+Pfeil hoch/runter verschiebt den markierten Text</li>
<li>Ein neuer Solution navigator</li>
<li>Ein verbesserter "Verweis hinzufügen" Dialog mit Suchfunktion</li>
<li>Farbige und pinnbare Tabs</li>
<li>und und und</li>
</ul>
<p><a href="http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef" target="_blank">Schnell laden, installieren und genießen!</a> Ich kann schon jetzt nicht mehr ohne! <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.13';
var flattr_uid = '14720';
var flattr_url = 'http://blog.bigbasti.com';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'BigBasti&#039;s Blog';
var flattr_dsc = 'About Me &amp; my Digital Lifestyle';
</script>
<script src="https://api.flattr.com/js/0.5.0/load.js?mode=auto" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/0ODdh6N0aRE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/add-on-perle-visual-studio-productivity-power-tools/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/add-on-perle-visual-studio-productivity-power-tools/</feedburner:origLink></item>
		<item>
		<title>.NET: Mit Extension Methods arbeiten</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/Mzcp3K3HCiI/</link>
		<comments>http://blog.bigbasti.com/net-mit-extension-methods-arbeiten/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 07:41:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1225</guid>
		<description><![CDATA[Aus gegebenen Anlass möchte ich heute einen kleinen Ar [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/2010-08-16-09-12-29.png"><img class="alignleft size-full wp-image-1227" title="2010-08-16 09 12 29" src="http://blog.bigbasti.com/uploads/2010-08-16-09-12-29.png" alt="" width="137" height="104" /></a>Aus gegebenen Anlass möchte ich heute einen kleinen Artikel zu dem Thema <a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank">Extension Methods</a> in .NET schreiben, einfach nur weil es eine sehr simple Möglichkeit bietet sich das Leben zu erleichtern. Falls es euch nichts sagt, mit Extension Methods, die  es seit C# 3.0 gibt ist es möglich bestehende Klassen, sogar interne Core-Klassen wie Integer oder String mit eigenen Methoden zu erweitern.</p>
<p>Wieso das nützlich ist fragst du dich? Na ganz einfach, habt ihr schon mal die Methode String.toInt32() vermisst? Diese ist nur eine (sehr simple) Methode, die man häufiger gebrauchen könnte, die es aber nicht gibt. Diese könnte man sehr einfach mit einer Extension Method erweitern.</p>
<p>Als Beispiel möchte ich hier aber <a href="http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/" target="_blank">den Artikel von vor ein paar Tagen</a> nehmen, wo wir eine Methode erstellt haben mit der man ein XmlElement in einem XmlDocument umbenennen konnte. Dies mussten wir machen, da die Klasse XmlDocument keine Methode dafür anbietet. Nun wollen wir mal die XmlDocument Klasse um diese Methode erweitern.</p>
<p>Das ganze funktioniert sehr einfach:</p>
<pre>
<pre class="brush: csharp; ">

    public static class XmlDocumentExtension
    {
        public static bool RenameXmlElement(this XmlDocument doc,
                                            XmlElement oldElement,
                                            string newName) {
            try {
                //Neues XmlElement mit neuem namen anlegen
                XmlElement newElement = oldElement.OwnerDocument.CreateElement(newName);

                //Dem neuen XmlElement alle Attribute des alten Elements übergeben
                foreach (XmlAttribute a in oldElement.Attributes) {
                    newElement.SetAttributeNode((XmlAttribute)a);
                }

                //Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen
                foreach (XmlNode n in oldElement.ChildNodes) {
                    newElement.AppendChild(n.Clone());
                }

                oldElement.ParentNode.ReplaceChild(newElement, oldElement);
            } catch {
                return false;
            }

        return true;
        }
    }
</pre>
</pre>
<p>Wir legen eine ganz normale Klasse an, diese kann heißen wie man will, ich habe sie hier nur zum besseren Verständnis so benannt. In der klasse legen wir nun die Funktion an um die wir unsere Klasse erweitern wollen. Hierbei ist wichtig, dass sowohl die Klasse als auch die Funktion als public und static markiert wird. Des Weiteren sollte man einen Verweis auf System.Code.dll setzen.</p>
<p>Bei der Deklaration der Funktion muss man dann angeben welche Klasse erweitert werden soll. Hier erweitern wir die Klasse XmlDocument weswegen vor diesem Parameter noch ein this steht. Dieser Parameter wird nur dazu benötigt und muss dann später bei dem Aufruf der Funktion nicht gesetzt werden.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/2010-08-16-09-35-56.png"><img class="aligncenter size-full wp-image-1235" title="2010-08-16 09 35 56" src="http://blog.bigbasti.com/uploads/2010-08-16-09-35-56.png" alt="" width="682" height="220" /></a><em>Bild 1: Auch IntelliSense erkennt unsere Erweiterung an und bietet diese an</em></p>
<p>Natürlich bleibt die "original" Klasse XmlDocument unberührt von dieser Aktion und wird nur <em>virtuell </em>erweitert. Diese Erweiterung ist natürlich auch nur für das Aktuelle Projekt nutzbar.</p>
<p>Ich finde dieses Feature wirklich sehr nützlich und kann es euch deswegen auch nur empfehlen.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 308px; width: 1px; height: 1px; overflow: hidden;">public static bool RenameXmlElement(this XmlDocument doc,<br />
XmlElement oldElement,<br />
string newName) {<br />
try {<br />
//Neues XmlElement mit neuem namen anlegen<br />
XmlElement newElement = oldElement.OwnerDocument.CreateElement(newName);</p>
<p>//Dem neuen XmlElement alle Attribute des alten Elements übergeben<br />
foreach (XmlAttribute a in oldElement.Attributes) {<br />
newElement.SetAttributeNode((XmlAttribute)a);<br />
}</p>
<p>//Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen<br />
foreach (XmlNode n in oldElement.ChildNodes) {<br />
newElement.AppendChild(n.Clone());<br />
}</p>
<p>oldElement.ParentNode.ReplaceChild(newElement, oldElement);<br />
} catch {<br />
return false;<br />
}</p>
<p>return true;<br />
}</p>
</div>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/Mzcp3K3HCiI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/net-mit-extension-methods-arbeiten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/net-mit-extension-methods-arbeiten/</feedburner:origLink></item>
		<item>
		<title>Tod den Modulen in VB.NET</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/sOh83pcgRxI/</link>
		<comments>http://blog.bigbasti.com/tod-den-modulen-in-vb-net/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 21:53:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1213</guid>
		<description><![CDATA[In diesem Beitrag möchte ich ein paar Worte über Modu [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Beitrag möchte ich ein paar Worte über Module unter VB.NET verlieren. Wie ihr dem Titel vielleicht auch schon entnehmen könnt steh ich diesen nicht allzu freundschaftlich gegenüber. Deswegen möchte ich in diesem Artikel erklären warum man keine Module benutzen sollte.</p>
<p><strong>Wenn man Module nicht benutzen sollte warum gibt es sie dann?</strong></p>
<p>Module gibt es in VB.NET nur aus einem Grund, nämlich um VB6 Programmierern den Umstieg auf die .NET Plattform zu erleichtern. Denn .NET ist komplett Objektorientiert und hier haben Module keinen Platz. Aber um es den Entwicklern einfacher zu machen bestehende Projekte auf die .NET Plattform zu porten wurden die Module mitgenommen.</p>
<p><strong>Modul, Klasse wo ist eigentlich der Unterschied?</strong></p>
<p>Wenn man sich so ein Modul anschaut hat es eine Enorme Ähnlichkeit mit einer <em>gewöhnlichen </em>Klasse, unterscheidet sich aber dennoch gewaltig von ihr.</p>
<p>Im Prinzip sind Module auch Klassen, die aber vielen Beschränkungen unterliegen. Hier die Hauptpunkte:</p>
<ul>
<li>Alle Methoden und Variablen eines Moduls sind automatisch Shared, was bedeutet, dass man auf diese Methoden/Variablen zugreifen kann ohne eine Instanz der Klasse bilden zu müssen.</li>
<li>Alle Methoden und Variablen eines Moduls sind in dem gesamten Projekt verfügbar und sind somit Global - was nicht im Sinne von OOP ist. Der Programmierer kann dabei direkt auf die Methoden und Variablen zugreifen, dies erzeugt das Bild von Globalen Objekten und steht dabei im Gegensatz zu dem Klassischen Objektzugriff Object.Member.</li>
<li>Module sind automatisch NonInheritable, was die Instanzierung verhindert, desweiteren kann ein Modul auch nicht mit weiteren Schnittstellen wie z.B.: Interfaces erweitert werden.</li>
<li>Module sind zur Laufzeit einzigartig. Das bedeutet, dass alle Programmteile immer auf die selben Werte zugreifen, anders als bei einer Klasse wo jede Instanz eigene Werte hat.</li>
<li>Ein weiterer Punkt ist, dass Module nicht nach Außen hin sichtbar sind und somit eine Wiederverwendung ausschließen, was im totalen Gegensatz der OOP ist.</li>
</ul>
<p><strong>Warum werden Module dann so häufig benutzt?</strong></p>
<p>Im Normalfall ist es entweder Unwissenheit oder Faulheit, oder beides. Denn viele Einsteiger (und auch alte VB6 Hasen) haben Probleme damit das Objektorientierte Prinzip zu verstehen, und da kommen die Module wie gerufen, denn diese ersparen die korrekte Deklarierung, man muss keine Namespaces beachten, die Instanzierung kann man sich auch sparen und man muss sich nicht mit Properties herumschlagen! Also geht im Endeffekt alles schneller aber dafür wird lauter Spaghetticode erzeugt!</p>
<p><strong>Schlusswort</strong></p>
<p>Wenn du noch relativ neu in der Objektorientierten Programmierung bist oder ein umsteiger von VB6, lass dich nicht davon verleiten schnellen unsauberen Code zu schreiben. Lass dir lieber etwas mehr Zeit um das OOP Konzept zu verstehen und mach es dann richtig. Je länger man diesen Pakt mit dem Teufel eingeht, desto schwieriger wird es dann später die alten Gewohnheiten los zulassen.</p>
<p>Ein weiterer Punkt ist, dass es unter C# keine Module gibt, daher wird man spätestens dann Probleme bekommen wenn man an einem C# Projekt mitarbeitet und dann gezwungen ist <em>sauberer </em>zu programmieren!</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.13';
var flattr_uid = '14720';
var flattr_url = 'http://blog.bigbasti.com';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'BigBasti&#039;s Blog';
var flattr_dsc = 'About Me &amp; my Digital Lifestyle';
</script>
<script src="https://api.flattr.com/js/0.5.0/load.js?mode=auto" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/sOh83pcgRxI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/tod-den-modulen-in-vb-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/tod-den-modulen-in-vb-net/</feedburner:origLink></item>
		<item>
		<title>Mit dem ICE macht Bahnfahren Spass</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/ybaEdnzahRA/</link>
		<comments>http://blog.bigbasti.com/mit-dem-ice-macht-bahnfahren-spass/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 22:08:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1200</guid>
		<description><![CDATA[Ich gehöre ja zu den Menschen, die so gut wie nie we [...]]]></description>
			<content:encoded><![CDATA[<p>Ich gehöre ja zu den Menschen, die so gut wie nie weitere Entfernungen mit der Bahn fahren. Täglich fahre ich mit der Bahn zur Arbeit und wieder zurück, doch verbringe ich da maximal 15 Minuten im Zug (RE). Hier habe ich auch schon viele negative Erfahrungen mit der Bahn gesammelt und bin auch Zeuge geworden wie anderen Menschen ihre negativen Erfahrungen gemacht haben.</p>
<p>Doch während meiner kürzlichen Reise von Berlin nach Minden, konnte die Bahn wirklich viele Pluspunkte bei mir sammeln.</p>
<p>Für diese Fahrt habe ich mich für einen IC entschieden, mit dem ich von Berlin starten wollte. Doch leider (wie sollte es auch andres sein) habe ich den Zug um ca 1 Minute verpasst, wirklich sehr sehr ärgerlich, wenn man seinen Zug bei der Abfahrt vom Bahnsteig beobachten kann, und dazu kam noch, dass der nächste IC (mit den gleichen Anschlusszügen) erst wieder in ein paar Stunden fuhr.</p>
<p>Dann bin ich also mit einem enormen  <a href="http://trygve.kvisle.net/wp-content/uploads/2009/07/ffffuuuu.jpg" target="_blank">FFFFUUUU</a>-Gesicht zum Info-Schalter der Bahn gegangen - doch hier begann für mich die Überraschung.</p>
<p>Die Dame an dem Info-Schalter hat mein Problem sofort verstanden, und kurz in ihrem Computer rum getippt - keine 10 Minuten später saß ich in einem ICE der in die selbe Richtung fuhr. Die zweite Überraschung kam dann, als der Schaffner kam und ich mein Ticket nachlösen wollte.</p>
<p>Der Schaffner, in meinem Fall sogar eine Schaffnerin, hat sich meine Leidensgeschichte <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  angehört und hat mich ohne eine weitere Zuzahlung mitfahren lassen. Auch wenn die Zuzahlung die 30 Eur wohl nicht überschritten hätte, fand ich es trotzdem sehr überraschend, dass hier so menschlich und kulant gehandelt wurde, da bin ich aus meinem Bahnalltag und auch aus dem Medien wirklich anderes gewohnt.</p>
<p>Ich weiß hier natürlich nicht ob es immer so ist oder ich nur Glück hatte und eine nette Schaffnerin erwischt habe (wobei ich es nicht glaube). Aber so wie es momentan aussieht denke ich, dass die Menschlichkeit und teilweise auch die Freundlichkeit des Bahnpersonals in den ICE/IC Zügen eingesperrt ist. - Schade eigentlich!</p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/ybaEdnzahRA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/mit-dem-ice-macht-bahnfahren-spass/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/mit-dem-ice-macht-bahnfahren-spass/</feedburner:origLink></item>
		<item>
		<title>XML: Den Namen eines XmlNode Aendern</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/IVsyYy2XSNA/</link>
		<comments>http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 10:31:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1186</guid>
		<description><![CDATA[Wenn man unter .NET mit XML Dokumenten arbeitet, nimmt  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/xml_at_work.gif"><img class="alignleft size-medium wp-image-1187" title="xml_at_work" src="http://blog.bigbasti.com/uploads/xml_at_work-300x184.gif" alt="" width="146" height="89" /></a>Wenn man unter .NET mit XML Dokumenten arbeitet, nimmt man sehr oft Änderungen am Dokument vor. Doch letztens ist mir aufgefallen, dass eine der einfachsten Änderungen garnicht so einfach ist, nämlich wenn man den Namen eines XmlNode ändern will. Also die XmlNode.Name Eigenschaft.</p>
<p>Denn wenn man mal einen Blick ins <a href="http://msdn.microsoft.com/de-de/library/system.xml.xmlnode.name.aspx" target="_blank">MSDN</a> wirft wird man feststellen, dass diese Eigenschaft read-only ist! Das ist natürlich blöd, da man nun keinen einfachen Weg hat den Namen des Knotens zu ändern.</p>
<p>Wenn man diesen aber unbedingt ändern will muss man das über einen kleinen Umweg machen. Man muss ein neues XmlElement erstellen und dabei den Namen ändern, anschließend noch alle Attribute und Kinder-Elemente des alten Elements übernehmen und an der Stelle des alten wieder in das XmlDocument einfügen.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/xmlnodeprob.png"><img class="aligncenter size-full wp-image-1194" title="xmlnodeprob" src="http://blog.bigbasti.com/uploads/xmlnodeprob.png" alt="" width="486" height="165" /></a><em>Bild 1: Struktur &amp; Änderungswunsch</em></p>
<p>Konkret sieht das Ganze so aus: C#</p>
<pre>
<pre class="brush: csharp; ">

        private void Form1_Load(object sender, EventArgs e) {
            //XmlDomument erstellen und eine Xml-Datei laden
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(Application.StartupPath + &quot;\\xml.xml&quot;);

            //Zur Demonstration die alte XML-Struktur ausgeben
            System.Console.WriteLine(xmlDoc.OuterXml);

            //Das Element das umbenannt werden soll heraussuchen
            XmlElement oldElement = (XmlElement)xmlDoc.GetElementsByTagName(&quot;books&quot;)[0];

            //Das herausgesuchte Element mit einem neuen Namen klonen
            XmlElement newElement = renameXmlElement(oldElement, &quot;my-books&quot;);

            //Das alte Element mit dem neuen ersetzen
            oldElement.ParentNode.ReplaceChild(newElement, oldElement);

            //Kontrolle: Die neue Struktur ausgeben
            System.Console.WriteLine(xmlDoc.OuterXml);

            xmlDoc.Save(Application.StartupPath + &quot;\\xml.xml&quot;);
        }

        public static XmlElement renameXmlElement(XmlElement e, string newname) {
            //Neues XmlElement mit neuem namen anlegen
            XmlElement newElement = e.OwnerDocument.CreateElement(newname);

            //Dem neuen XmlElement alle Attribute des alten Elements übergeben
            foreach (XmlAttribute a in e.Attributes) {
                newElement.SetAttributeNode((XmlAttribute)a);
            }

            //Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen
            foreach (XmlNode n in e.ChildNodes) {
                newElement.AppendChild(n.Clone());
            }

            //Das neue XmlElement zurückgeben
            return newElement;
        }
</pre>
</pre>
<p>Und hier das Ganze noch mal in VB.NET:</p>
<pre>
<pre class="brush: vb.net; ">

Private Sub Form1_Load(sender As Object, e As EventArgs)
	&#039;XmlDomument erstellen und eine Xml-Datei laden
	Dim xmlDoc As New XmlDocument()
	xmlDoc.Load(Application.StartupPath + &quot;\xml.xml&quot;)

	&#039;Zur Demonstration die alte XML-Struktur ausgeben
	System.Console.WriteLine(xmlDoc.OuterXml)

	&#039;Das Element das umbenannt werden soll heraussuchen
	Dim oldElement As XmlElement = DirectCast(xmlDoc.GetElementsByTagName(&quot;books&quot;)(0), XmlElement)

	&#039;Das herausgesuchte Element mit einem neuen Namen klonen
	Dim newElement As XmlElement = renameXmlElement(oldElement, &quot;my-books&quot;)

	&#039;Das alte Element mit dem neuen ersetzen
	oldElement.ParentNode.ReplaceChild(newElement, oldElement)

	&#039;Kontrolle: Die neue Struktur ausgeben
	System.Console.WriteLine(xmlDoc.OuterXml)

	xmlDoc.Save(Application.StartupPath + &quot;\xml.xml&quot;)
End Sub

Public Shared Function renameXmlElement(e As XmlElement, newname As String) As XmlElement
	&#039;Neues XmlElement mit neuem namen anlegen
	Dim newElement As XmlElement = e.OwnerDocument.CreateElement(newname)

	&#039;Dem neuen XmlElement alle Attribute des alten Elements übergeben
	For Each a As XmlAttribute In e.Attributes
		newElement.SetAttributeNode(DirectCast(a, XmlAttribute))
	Next

	&#039;Dem neuen XmlElement alle Kinder Elemente des alten Elements anhängen
	For Each n As XmlNode In e.ChildNodes
		newElement.AppendChild(n.Clone())
	Next

	&#039;Das neue XmlElement zurückgeben
	Return newElement
End Function
</pre>
</pre>
<p>Kompliziert ist es natürlich nicht, aber trotzdem etwas ärgerlich, dass man diese Methode dann doch selber implementieren muss.</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.13';
var flattr_uid = '14720';
var flattr_url = 'http://blog.bigbasti.com';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'BigBasti&#039;s Blog';
var flattr_dsc = 'About Me &amp; my Digital Lifestyle';
</script>
<script src="https://api.flattr.com/js/0.5.0/load.js?mode=auto" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/IVsyYy2XSNA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/xml-den-namen-eines-xmlnode-aendern/</feedburner:origLink></item>
		<item>
		<title>Windows Aero Glas in eigenen Projekten Nutzen Teil 5 – Der letzte Versuch</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/Xd9JAPV2K1M/</link>
		<comments>http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-5-der-letzte-versuch/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 20:33:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1168</guid>
		<description><![CDATA[In den letzten Tagen habe ich mal wieder ein wenig mit  [...]]]></description>
			<content:encoded><![CDATA[<p>In den letzten Tagen habe ich mal wieder ein wenig mit der Windows API herumgespielt, speziell mit der Aero Glas API (DWMAPI). Ich habe euch ja auch noch versprochen einen Beitrag über Steuerelemente in Verbindung mit Glas nachzuliefern. Nunja hier ist er <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/glasprobpem1.png"><img class="aligncenter size-full wp-image-1170" title="glasprobpem1" src="http://blog.bigbasti.com/uploads/glasprobpem1.png" alt="" width="447" height="268" /></a><em>Bild 1: Probleme mit der Transparenz</em></p>
<p>In Bild 1 sehen wir das Problem, viele der Windows Forms Steuerelemente nutzen GDI zur Darstellung und haben deswegen keinen Alpha-Kanal, der aber für die Darstellung auf Glas benötigt wird. Deswegen nutzen wir die Schwarze Farbe um unsere Fläche in Glas zu verwandeln, leider denkt der DWM dann, dass auch die Texte auf unseren Steuerelementen zu Glas werden sollen.</p>
<p>Ich habe mich nun ein wenig im Internet umgehört und verschiedene Ansätze gefunden und diverse Hacks mit der Windows32API Ausprobiert, die aber alle leider nicht mehr funktionieren. So will ich euch heute zwei Möglichkeiten vorstellen wie man es doch hinkriegen könnte.</p>
<p><strong>1. Owner Drawing</strong></p>
<p>Da die Steuerelemente mit GDI gerendert werden haben wir ein kleines Problem wie man oben sieht. Also müssen wir die Darstellung der Steuerelemente selbst in die Hand nehmen. Dieser Vorgang nennt sich OwnerDrawing und bedeutet soviel wie "SelberZeichnen". Ich will das Ganze mal anhand einer Textbox demonstrieren.</p>
<p>Und genauso ist auch das Vorgehen. Wir erstellen eine neue Klasse und nennen Sie "AeroTextBox". Diese Klasse erbt nun von der Original TextBox. Nun müssen wir ein paar kleine Änderungen an der Klasse vornehmen in Bezug auf die Darstellung, also des WM_PAINT Ereignisses.</p>
<p>Da wir das Zeichnen des Steuerelements selbst in die Hand nehmen wollen müssen wir die WM_PAINT Message abfangen und auf unsere eigene Methode umleiten:</p>
<p>C#</p>
<pre>
<pre class="brush: csharp; ">

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        base.WndProc( ref m);

        switch (m.Msg)
        {
            case 0xf: //WM_PAINT
                RedrawControlAsBitmap(this.Handle);
                break;
        }
    }
</pre>
</pre>
<p>VB.NET</p>
<pre>
<pre class="brush: vb.net; ">

 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
	MyBase.WndProc(m)

	Select Case m.Msg
		Case &amp;Hf &#039;WM_PAINT
			RedrawControlAsBitmap(Me.Handle)
			Exit Select
	End Select
End Sub
</pre>
</pre>
<p>Wie man sieht fangen wir hier die Message ab und rufen unsere eigene Methode auf, die das Zeichnen übernehmen wird:</p>
<p>C#</p>
<pre>
<pre class="brush: csharp; ">

    public void RedrawControlAsBitmap(IntPtr hwnd)
    {
        Control c = Control.FromHandle(hwnd);
        using (Bitmap bm = new Bitmap(c.Width, c.Height))
        {
            c.DrawToBitmap(bm, c.ClientRectangle);
            using (Graphics g = c.CreateGraphics())
            {
                g.DrawImage(bm, new Point(-1, -1));
            }
        }
        c = null;
    }
</pre>
</pre>
<p>VB.NET</p>
<pre>
<pre class="brush: vb.net; ">

Public Sub RedrawControlAsBitmap(hwnd As IntPtr)
	Dim c As Control = Control.FromHandle(hwnd)

	Using bm As New Bitmap(c.Width, c.Height)
		c.DrawToBitmap(bm, c.ClientRectangle)

		Using g As Graphics = c.CreateGraphics()
			g.DrawImage(bm, New Point(-1, -1))
		End Using
	End Using
	c = Nothing
End Sub
</pre>
</pre>
<p>Was hier passiert ist eigentlich sehr simpel, wir zeichnen das Control neu und legen das gezeichnete Bild nun über das Control drüber. Nur diesmal machen wir das ganze mit einem Alpha Kanal, sodass der DWM uns die Darstellung nicht versaut!</p>
<p>Nun bleibt noch ein kleines Problem, nämlich dass bei manchen Aktionen des Benutzers wie zB. bei MouseOver oder KeyPress Events das Steuerelement neugezeichnet wird und unsere Funktion da oben nicht greift. Hier müssen wir manuell dafür sorgen, dass Windows erneut die WM_PAINT Message versendet. Das erreichen wir indem wir die einzelnen Events überschreiben und die Invalidate()-Methode aufrufen. Diese Methode erklärt die ganze Oberfläche des Steuerelements für ungültig und bewirkt,  dass das Steuerelement neu gezeichnet wird.</p>
<p>C#</p>
<pre>
<pre class="brush: csharp; ">

    protected override void OnMouseClick(System.Windows.Forms.MouseEventArgs e)
    {
        base.OnMouseClick(e);
        Invalidate();
    }

    protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
    {
        base.OnMouseMove(e);
        Invalidate();
    }

    protected override void OnTextChanged(System.EventArgs e)
    {
        base.OnTextChanged(e);
        Invalidate();
    }

    protected override void OnMouseEnter(System.EventArgs e)
    {
        base.OnMouseEnter(e);
        Invalidate();
    }
</pre>
</pre>
<p>VB.NET</p>
<pre>
<pre class="brush: vb.net; ">

Protected Overrides Sub OnMouseClick(e As System.Windows.Forms.MouseEventArgs)
	MyBase.OnMouseClick(e)
	Invalidate()
End Sub

Protected Overrides Sub OnMouseMove(e As System.Windows.Forms.MouseEventArgs)
	MyBase.OnMouseMove(e)
	Invalidate()
End Sub

Protected Overrides Sub OnTextChanged(e As System.EventArgs)
	MyBase.OnTextChanged(e)
	Invalidate()
End Sub

Protected Overrides Sub OnMouseEnter(e As System.EventArgs)
	MyBase.OnMouseEnter(e)
	Invalidate()
End Sub
</pre>
</pre>
<p>Nun wird das Control richtig dargestellt. Wie ihr vielleicht auch gesehen habt haben wir in unserer Methode, die für das Neuzeichnen verantwortlich ist nicht TextBox sondern die Superklasse Control benutzt. Das bedeutet für uns, dass wir mit diesem Code jedes Steuerelement ableiten und auf diese Weise neuzeichnen können mit mehr oder weniger viel Erfolg. Ich habe mal ein paar Klassen abgeleitet und für euch auf dem Glass-Form platziert:</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/glasprobpem2.png"><img class="aligncenter size-full wp-image-1177" title="glasprobpem2" src="http://blog.bigbasti.com/uploads/glasprobpem2.png" alt="" width="454" height="266" /></a><em>Bild 2: Die OwnerDrawn Steuerelemente</em></p>
<p>Wie man sieht ist das schon eine sehr vielversprechende Verbesserung der Darstellung, wenn auch nicht perfekt. Aber natürlich steht es euch noch frei die Darstellung weiter zu verbessern und auf die einzelnen Steuerelemente anzupassen.</p>
<p>Nachdem ihr die selbst erstellten Klassen die von den einzelnen Steuerelementen erben einmal kompiliert habt, wird Visual Studio dies bemerken und euch diese neuen Steuerelemente zusammen mit den anderen in der Toolbox anbieten. Diese können dann wie gewohnt per Drag &amp; Drop auf das Formular gezogen werden.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/glasprobpem3.png"><img class="aligncenter size-full wp-image-1179" title="glasprobpem3" src="http://blog.bigbasti.com/uploads/glasprobpem3.png" alt="" width="454" height="204" /></a><em>Bild 3: Bequemer Gehts nicht</em></p>
<p>Wie ihr euch vorstellen könnt ist es ein ziemlicher Aufwand jedes Steuerelement noch mal neu anzulegen und dessen komplette Darstellung zu übernehmen. Es ist wirklich sehr frickelig! Deswegen wird dieser Ansatz auch eher selten verwendet! Die Demo dazu könnt ihr euch übrigens am Ende des Artikels herunterladen.</p>
<p><strong>Variante 2. "The Microsoft Way"</strong></p>
<p>Natürlich stolpert man irgendwann bei der Recherche über das <a href="http://code.msdn.microsoft.com/WindowsAPICodePack" target="_blank">Windows API SDK</a> in dem es einige Beispiele dazu gibt wie man die neuen Funktionen in Windows benutzt, darunter natürlich auch Glas.</p>
<p>Der Ansatz den Microsoft da aber nach ihrer eigenen Best Practise verwendet ist aber eher ernüchternd. Hier geht es nach dem Motto, platziert einfach keine Steuerelemente auf dem Glas! - Super nicht?</p>
<p>In dem einzigen Beispiel das Microsoft da aufführt wird eine Form gezeigt, dessen Rahmen in das Formular bis zum darauf liegendem Panel erweitert wurde, nicht wirklich spannend. Aber wenn ich so überlege, fällt mit spontan auch kein Windows Programm auf, bei dem irgendwelche Steuerelemente auf dem Glas liegen - kennt ihr welche? In dem meisten Programmen liegen fast nur Grafiken auf dem Glas oder so ähnliche Controls wie die im Windows Explorer.</p>
<p>Also sage ich es mal Microsofts Worten: lasst die Controls vom Glas weg oder benutzt WPF! <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier noch die Demo zu der Variante 1:<a href="http://blog.bigbasti.com/aero_controls" target="_blank"> Download [VS 2008 Projekt] </a></p>
<p>Zur zweiten Variante habe ich keine Demo gemacht, ihr könnt euch ja das Windows API SDK herunterladen und dort im Aero Ordner nachgucken.</p>
<p><a href="http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-4-formulare-ohne-border/" target="_self">&lt;&lt; Teil 4 des Tutorials</a></p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/Xd9JAPV2K1M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-5-der-letzte-versuch/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-5-der-letzte-versuch/</feedburner:origLink></item>
		<item>
		<title>Twitter? Ihhhhh…</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/7Ad7Jx5jENE/</link>
		<comments>http://blog.bigbasti.com/twitter-ihhhhh/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 13:21:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1152</guid>
		<description><![CDATA[Ach ja, ihr kennt es (zumindest wenn ihr bei Twitter se [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://server.bigbasti.com/uploads/uploads/27211419118456866.png" alt="" width="238" height="77" />Ach ja, ihr kennt es (zumindest wenn ihr bei Twitter seid), man spricht mit Kollegen und oder Bekannten die vielleicht nicht so <span style="text-decoration: line-through;">nerdig</span> internet versiert sind wie man selbst und erwähnt in einem Nebensatz Twitter. Ups, da ist es passiert...</p>
<p>Und schon gehts los, man bekommt einen mysteriösen Blick zugeworfen und wird von oben bis unten noch mal gemustert als ob man soeben den Holocaust geleugnet hat. - Nein, so schlimm ist es natürlich nicht - aber ein gewisses Lachen kann sich die andere Person dann doch nicht verkneifen.</p>
<blockquote><p>"Twitter? Das ist doch diese Seite wo alle drauf schreiben, was sie grade gegessen haben und ob sie grade Durchfall haben"</p></blockquote>
<p>Und meißt kommt dann auch noch sowas ähnliches hinterher:</p>
<blockquote><p>"Warum bist du da denn angemeldet? Die genzen Sachen gehen fremde  Leute doch nix an - also für mich wär das nichts!"</p></blockquote>
<p>Mit so ähnlichen Szenen werde ich monatlich ca. 2 - 3 mal konfrontiert, und ich habe blöderweise immer noch keinen Weg gefunden einem <span style="text-decoration: line-through;">ungläubigen</span> Gelegenheitssurfer den Sinn von Twitter kurz und überzeugend zu erläutern.</p>
<p>Es sind meist diese Leute, die möglichst keine privaten Informationen über sich im Internet verraten wollen aber fröhlich auf jeden "Like" bzw. "Gefällt mir" Button klicken und auf allen Plattformen alá Facebook und StudiVZ angemeldet sind und lauter Fotos von sich hochladen bei denen man total betrunken irgendwo in einen Busch kotzt.</p>
<p>"Das ist ja was ganz anderes" Kommt dann als Antwort wenn man diese Personen darauf hinweist. - Ja ne, is klar!</p>
<p>Leider ist das genau das Bild was Otto Normalbürger von Twitter im Kopf hat, wobei man fairer Weise sagen muss, dass dieses Bild auch nicht wirklich falsch ist - leider! Denn genauso hat Twitter angefangen, man hat stolz sein Frühstück fotografiert und es der Welt präsentiert. (<a href="http://twitpic.com/kujml" target="_blank">Arnold Schwarzenegger machts vor</a>)</p>
<p>Doch Twitter hat sich schon lange gewandelt, und ist zurzeit die am schnellsten Wachsende Suchmaschine der Welt. Nirgends findet man schneller aktuellere Informationen zu allen Themen. Die Menge ist hier der natürliche Filter, wenn es darum geht Wichtiges von Unwichtigem zu trennen und durch <a href="http://wiki.answers.com/Q/What_is_retweet" target="_blank">Retweets</a> die interessanten Dinge an die Oberfläche zu spülen.</p>
<p>Das sind dann einige der Argumente mit denen ich versuche einer Person Twitter zu erklären, doch diese Argumente ziehen nicht. "Ich habe meine Seiten wie Stern oder Heise auf denen ich mich informiere und die liefern mir die Infos auch schnell genug!"</p>
<p>Argh! Egal es ist ja nicht mein Job den <span style="text-decoration: line-through;">Eingeborenen</span> Leuten das große Internet zu erklären.</p>
<p>Für mich persönlich ist Twitter inzwischen zu dem wichtigsten Dienst mutiert. Es ist schon fast ein Reflex geworden die Twitter-App zu starten wenn man grade das Handy in der Hand hat um schnell mal zu schauen, was es so neues gibt.</p>
<p>Ich folge vielen Leuten, die in der selben Branche tätig sind wie ich und von denen ich schon viel gelernt habe oder durch ihre Tweets an viele interessante Dinge gekommen bin, genauso wie meine Follower durch mich. (Hoffe ich zumindest <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</p>
<p>Und ja, ab und zu rutscht mir auch der ein oder andere Tweet raus darüber <a href="http://twitpic.com/1i4oib" target="_blank">was ich gegessen habe</a>, man muss ja schließlich die Tradition beibehalten <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  - back to the roots!</p>
<p><strong>Wie schauts bei euch aus? Wie erklärt ihr euren Bekannten was Twitter ist und warum ihr <span style="text-decoration: line-through;">dieses Teufelszeug</span> es benutzt?</strong> Vielleicht habt ihr ja ein paar Tipps, sodass ich bei der nächsten Debatte deutlich gewinne!</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.13';
var flattr_uid = '14720';
var flattr_url = 'http://blog.bigbasti.com';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'BigBasti&#039;s Blog';
var flattr_dsc = 'About Me &amp; my Digital Lifestyle';
</script>
<script src="https://api.flattr.com/js/0.5.0/load.js?mode=auto" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/7Ad7Jx5jENE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/twitter-ihhhhh/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/twitter-ihhhhh/</feedburner:origLink></item>
		<item>
		<title>Goodbye VB.NET hallo C#</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/xu-MNPb-ZxQ/</link>
		<comments>http://blog.bigbasti.com/goodbye-vb-net-hallo-c/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 20:30:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1139</guid>
		<description><![CDATA[Es ist seltsam, wie man sich mit der Zeit entwickelt. V [...]]]></description>
			<content:encoded><![CDATA[<p>Es ist seltsam, wie man sich mit der Zeit entwickelt. Vielleicht ist es euch auch währen der letzten Beiträge auch aufgefallen. Nach fast einem Jahrzehnt bin ich nun von VB.NET auf C# umgestiegen, und möchte auch garnicht mehr zurück.</p>
<p>Der Umstieg ist bei mir aber nicht zufällig gekommen. Aktuell arbeite ich auch Beruflich immer öfter auch in Java Projekten mit und muss mich dann immer komplett umstellen was die Syntax angeht. Dies war immer besonders ärgerlich! Mit C# habe ich mich bis vor ein paar Monaten nie wirklich beschäftigt, ich wusste dass es existierte aber mehr auch nicht.</p>
<p>Die ersten Umstieggedanken kamen bei mir als ich Hilfe im Netz zu etwas komplexeren Themen gesucht habe. Da musste ich schnell feststellen, dass das eine C# Domäne war. Man findet nur wenig Support in VB.NET, obwohl es eigentlich die selbe Sprache ist.</p>
<p>Das Problem ist auch, dass VB eine Sprache ist, die damals für Anfänger entwickelt wurde und es DIE Sprache ist wenn es darum geht mit den Programmieren anzufangen. Was nichts schlimmes ist, aber dem entsprechend sind auch alle VB-Foren überfüllt mit Anfängern, die statt ein Buch zu lesen jede Kleinigkeit nachfragen und fertigen Code zum C&amp;P erwarten.</p>
<p>Wer ein Beispiel sucht sollte <a href="http://forum.vb-paradise.de/programmieren/hauptforum/18761-fachwoerter/" target="_blank">hier</a>, <a href="http://social.msdn.microsoft.com/Forums/de-DE/visualbasicde/thread/eef4a224-b29b-4e34-9e86-5369c1193fa2" target="_blank">hier</a> oder <a href="http://forum.vb-paradise.de/programmieren/hauptforum/18854-wie-log-ich-in-diese-seite-ein/" target="_blank">hier</a> mal gucken...</p>
<p>Aber das war nicht der Hauptgrund für mich zum Wechseln, wie gesagt bot es sich an, da ich öfters mal mit Java in Kontakt komme, aber auch ein weiterer wichtiger Punkt spielte eine große Rolle.</p>
<p><strong>Die Schreibarbeit</strong></p>
<p>Denn der Visual Basic Code ist sehr viel umfangreicher, da fast alles ausgeschrieben wird und somit fast richtige Sätze entstehen. Das ist für Anfänger gut, aber wenn man länger damit arbeitet dann macht diese enorme Tipperei einen wirklich fertig, das macht dann auch Visual Studios IntelliSense auch nur wenig erträglicher. Zumahl habe ich die Erfahrung gemacht, dass je anspruchsvoller ein Projekt mit der Zeit wird desto komplexer wird auch die Syntax von VB.</p>
<p>Diese einfache C-Ähnliche Syntax geht einfach viel schneller und angenehmer von den Händen. Jaja, natürlich ist das alles Geschmackssache, ich will hier ja auch niemanden überzeugen, sondern einfach nur meine Gedanken dazu schreiben.</p>
<p>Trotzdem will ich hier die Frage in den Raum stellen, welche der beiden Sprachen ihr lieber benutzt und was eure Argumente für oder gegen "eure" Sprache sind. Nebenbei habe ich hier rechts in der Seitenleiste eine kleine Umfrage gestartet, da könnt ihr ja mal mit abstimmen!</p>
<p><strong>Die Zukunft</strong></p>
<p>Vielleicht werde ich die Nächsten Tutorials auch Bi-Lingual verfassen, aber im Verlauf der Zeit werden wohl alle Beispiele hier in C# sein.</p>
<p>Übrigens: Im web gibt es viele Anbieter, die web basierte Übersetzungstools für VB.NET zu C# und umgekehrt anbieten. Diese wandeln den Code zu ca 90% zuverlässig in die jeweils andere Sprache um, es sind nur noch kleine kosmetische Eingriffe nötig. Ich benutze da gerne den Converter von <a href="http://www.developerfusion.com/tools/convert/csharp-to-vb/" target="_blank">Developerfusion</a></p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/xu-MNPb-ZxQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/goodbye-vb-net-hallo-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/goodbye-vb-net-hallo-c/</feedburner:origLink></item>
		<item>
		<title>Microsoft SQL CE: Blobs Speichern und auslesen</title>
		<link>http://feedproxy.google.com/~r/bigbasti/yEFJ/~3/b7I_QBNEAgU/</link>
		<comments>http://blog.bigbasti.com/microsoft-sql-ce-blobs-speichern-und-auslesen/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 14:11:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Datenbank]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1124</guid>
		<description><![CDATA[In diesem kleinem Tutorial möchte ich euch zeigen, wie [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://blog.bigbasti.com/uploads/sqlserver.png" alt="" width="150" height="94" />In diesem kleinem Tutorial möchte ich euch zeigen, wie man BLOBs (Binary Large Objects) in die Compact Edition vom Microsofts SQL Server speichern und wieder laden kann. Dies soll  eine Art Weiterführung von dem <a href="http://blog.bigbasti.com/microsoft-sql-server-compact-edition-eine-einfuehrung/" target="_blank">letzten Einstiegspost</a> sein. Ich kann euch aber nicht versprechen, dass noch weitere Beiträge zu dem Thema kommen werden.</p>
<p>Auch wen <a href="http://de.wikipedia.org/wiki/Relationale_Datenbank" target="_blank">Relationale Datenbanken</a> überwiegend dazu benutzt werden um Text-Basierte Informationen zu speichern, wie Benutzernamen, IP Adressen oder andere Texte, kommt es doch häufiger vor, dass man auch Dateien wie Bilder in eine Datenbank legen möchte. Dies ist zB. nützlich wenn man eine Benutzerdatenbank hat und zu jedem Benutzer ein Bild hinterlegen will.</p>
<p>Das Vorgehen an Sich ist dabei sehr ähnlich, ihr erstellt ein SqlCeCommand und fügt dem wie gewohnt einige Parameter hinzu:</p>
<pre>
<pre class="brush: csharp; ">

                using (SqlCeConnection con = new SqlCeConnection(conString)) {
                    con.Open();
                    using (SqlCeCommand com = new SqlCeCommand
                        (&quot;INSERT INTO cp_image (date, image) VALUES (@Date, @Filename)&quot;, con)) {

                        com.Parameters.AddWithValue(&quot;@Date&quot;, DateTime.Now.ToString());
                        com.Parameters.AddWithValue(&quot;@Filename&quot;,
                                System.IO.File.ReadAllBytes(filename)).SqlDbType = SqlDbType.Image;
                        com.ExecuteNonQuery();
                    }
                }
</pre>
</pre>
<p>Absolut nichts neues wie ihr sehen könnt, wir geben die Datei, die wir anhängen wollen einfach als byte-Array als Parameter mit.</p>
<p>Sehr wichtig ist hierbei folgende Stelle in Zeile 8:</p>
<pre>
<pre class="brush: csharp; ">

.SqlDbType = SqlDbType.Image;
</pre>
</pre>
<p><a href="http://blog.bigbasti.com/uploads/warning_64.png"><img class="alignleft size-full wp-image-1131" title="warning_64" src="http://blog.bigbasti.com/uploads/warning_64.png" alt="" width="64" height="64" /></a>Wenn ihr diese Information nicht mit angebt, werdet ihr Probleme bekommen, sobald ihr eine Datei in die Datenbank schreiben wollt die größer ist als 8 KB!!! Denn wenn man einen Parameter angibt ohne dessen Typ mit anzugeben versucht SQLCE den Typ selbst zu bestimmen und wählt dazu dann den Typ varbinary, dessen Größe auf 8000 Byte beschränkt ist!</p>
<p>Mit dem Ausführen des SqlCeCommands sollte die Datei bzw. das Bild in diesem Fall dann in eure Datenbank Datei wandern.</p>
<p>Das Auslesen der Datei aus der Datenbank gestaltet sich ebenfalls nicht kompliziert. Hier meine Funktion um ein Bild aus der Datenbank zu lesen:</p>
<pre>
<pre class="brush: csharp; ">

        public Image getImageFromDB(int id) {
            Image img;
            byte[] imgData = null;

            using (SqlCeConnection con = new SqlCeConnection(conString)) {
                con.Open();
                using (SqlCeCommand com = new SqlCeCommand
                    (&quot;SELECT image FROM cp_image WHERE id = &#039;&quot; + id.ToString() + &quot;&#039;&quot;, con)) {

                    using (SqlCeDataReader dr = com.ExecuteReader()) {
                        while (dr.Read()) {
                            imgData = (byte[])dr[&quot;image&quot;];
                        }
                    }
                }
            }

            if (imgData != null) {
                //Es wurde ein Bild geladen
                MemoryStream ms = new MemoryStream(imgData);
                img = Image.FromStream(ms);
                return img;
            }
            return null;
        }
</pre>
</pre>
<p>Dazu benutze ich einfach nur einen gewöhnlichen DataAdapter, mit dem ich aus der Spalte namens "image" die Bildinformationen auslese, diese müssen noch in ein byte-Array gecastet werden, da diese als Object geliefert werden.</p>
<p>Zum Schluss wird noch das Byte-Array in ein System.Drawing.Image verwandelt und zurückgegeben. Dies kann man dann zB. direkt in eine PictureBox laden.</p>
<p>Hier ist die Tabelle, die ich in diesem Beispiel benutzt habe:</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/used_table.jpg"><img class="aligncenter size-full wp-image-1136" title="used_table" src="http://blog.bigbasti.com/uploads/used_table.jpg" alt="" width="509" height="162" /></a><em>Bild 1: Tabelleninformationen</em></p>
<p>Wie ihr eine Verbindung zur Datenbank herstellt und normale Select- und Insert-Befehle benutzt könnt ihr im Ersten Teil nachlesen.</p>
<p><a href="http://blog.bigbasti.com/microsoft-sql-server-compact-edition-eine-einfuehrung/">&lt;&lt; Zu Teil 1</a></p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.13';
var flattr_uid = '14720';
var flattr_url = 'http://blog.bigbasti.com';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'BigBasti&#039;s Blog';
var flattr_dsc = 'About Me &amp; my Digital Lifestyle';
</script>
<script src="https://api.flattr.com/js/0.5.0/load.js?mode=auto" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><img src="http://feeds.feedburner.com/~r/bigbasti/yEFJ/~4/b7I_QBNEAgU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/microsoft-sql-ce-blobs-speichern-und-auslesen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.bigbasti.com/microsoft-sql-ce-blobs-speichern-und-auslesen/</feedburner:origLink></item>
	</channel>
</rss>
