<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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"
	>

<channel>
	<title>Sternico: Inside</title>
	<atom:link href="http://blog.sternico.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sternico.de</link>
	<description>Sternico Blog</description>
	<pubDate>Sat, 06 Feb 2010 09:03:15 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Workshop UserControls Part 3: Events im Griff – Mouse- und Focus-Events sinnvoll implementiert</title>
		<link>http://blog.sternico.de/2009/08/workshop-usercontrols-part-3-events-im-griff-%e2%80%93-mouse-und-focus-events-sinnvoll-implementiert/</link>
		<comments>http://blog.sternico.de/2009/08/workshop-usercontrols-part-3-events-im-griff-%e2%80%93-mouse-und-focus-events-sinnvoll-implementiert/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 09:46:31 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<category><![CDATA[Workshops]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=93</guid>
		<description><![CDATA[Im dritten Teil werde ich noch tiefer auf Events eingehen. Dabei stehen die Mouse- und Focus-Events im Vordergrund, da diese Events sich zunächst nicht wie erwartet verhalten. Dabei können die hier vorgestellten Verfahren aber auch auf andere Events übertragen werden. Als praktisches Beispiel wird das UserControl &#8220;SomeButton&#8221; aus den vorherigen Artikeln um ein Highlighting bei [...]]]></description>
			<content:encoded><![CDATA[<p>Im dritten Teil werde ich noch tiefer auf Events eingehen. Dabei stehen die Mouse- und Focus-Events im Vordergrund, da diese Events sich zunächst nicht wie erwartet verhalten. Dabei können die hier vorgestellten Verfahren aber auch auf andere Events übertragen werden. Als praktisches Beispiel wird das UserControl &#8220;SomeButton&#8221; aus den vorherigen Artikeln um ein Highlighting bei Mausberührung und Fokuserhalt erweitert.<span id="more-93"></span></p>
<p><strong>Ein echtes Highlight&#8230;</strong><br />
Das Highlighting das in diesem Artikel realisiert werden soll, hebt unser UserControl bei Mausberührung und Fokuserhalt hervor:</p>
<p><img src="http://blog.sternico.de/wp-content/uploads/2009/08/button_with_highlight.png" alt="" title="Das UserConrol mit Highlighting" width="268" height="250" class="alignnone size-medium wp-image-91" /></p>
<p>Um dies zu realisieren werden im folgenden zunächst die Mouse-Events behandelt.</p>
<p><strong>Mouse-Events</strong><br />
Unser Usercontrol hat bereits Mouse-Events, die es von der Klasse ContainerControl geerbt hat. Diese beziehen sich jedoch nur auf die Fläche des Controls, die nicht durch untergeordnete Controls belegt ist. In unserem Beispiel erhalten wir kein MouseMove-Event, wenn sich die Maus über den farbigen Panels befindet. Um dieses Verhalten zu erreichen, müssen von allen untergeordneten Controls die gewünschten Events eingesammelt und auf unser Control übertragen werden. Dies geschieht, in dem im Eventhandler die zugehörige Funktion (gleicher Name wie Event, nur mit „On“) aufgerufen wird:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">Public</span> panel1_MouseMove<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">Object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
    OnMouseMove<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Sonderfall MouseLeave und MouseEnter</strong><br />
Nicht ganz unproblematisch sind hierbei jedoch die MouseLeave und MouseEnter Events. Dadurch dass sich die untergeordneten Controls innerhalb unseres UserControls befinden, führt eine Mausbewegung von z.B. dem Panel ausgehend hin zu unbelegtem Bereich im Control zu einer Folge von MouseLeave- und MouseEnter-Events, obwohl die Maus nie unser UserControl verlassen hat.</p>
<p><strong>Focus-Behandlung</strong><br />
Auch bei der Behandlung der Focus-Events kann es zu unerwünschten Effekten kommen. Ein nicht ganz einfacher Fall ist z.B. wenn das Contrrol untergeordnete Controls besitzt, die selbst einen Focus erhalten können, wie z.B. Textboxen.  Erhält diese den Focus, so verliert das UserControl selbst den Fokus, obwohl sich dieser ja noch innerhalb des Controls befindet (nur eben auf einem untergeordneten Control). Um dieses Problem zu vermeiden, sollte für alle untergeordneten UserControls die Eigenschaft „enabled“ auf false gesetzt werden, wenn diese keine Interaktion mit dem User durchführen müssen.</p>
<p><strong>Praktisches Beispiel</strong><br />
An Hand von dem schon in den vorherigen Artikeln vorgestelltem UserControl soll nun die vorgestellte Problematik veranschaulicht werden.  Damit man auch was sieht, wird dazu zunächst eine Eigenschaft „Highlighted“ zugefügt, die die Schrift auf „Fett“ stellt. Zusätzlich erhält die Property ein Browsable-Attribut mit dem Parameter false, so dass die Property nicht im Visual Studio Designer angezeigt wird.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #FF0000;">bool</span> highlight <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
&nbsp;
<span style="color: #000000;">&#91;</span>Browsable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">false</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> Highlight
<span style="color: #000000;">&#123;</span>
    get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> highlight<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
    set <span style="color: #000000;">&#123;</span>
        highlight <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Font</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Font<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Font</span>,highlight<span style="color: #008000;">?</span>FontStyle.<span style="color: #0000FF;">Bold</span><span style="color: #008000;">:</span>FontStyle.<span style="color: #0000FF;">Regular</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Diese Eigenschaft soll nun automatisch gesetzt werden, wenn die Maus über unser UserControl bewegt wird oder wenn das Control den Fokus erhält. Dazu werden zunächst im Designer die Events MouseEnter, MouseLeave, Enter und Leave aboniert und wie folgt implementiert:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">void</span> RegisterEvents<span style="color: #000000;">&#40;</span>Control parent<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Control child <span style="color: #0600FF;">in</span> parent.<span style="color: #0000FF;">Controls</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        child.<span style="color: #0000FF;">Click</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">EventHandler</span><span style="color: #000000;">&#40;</span>child_Click<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        child.<span style="color: #0000FF;">MouseMove</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> MouseEventHandler<span style="color: #000000;">&#40;</span>child_MouseMove<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        child.<span style="color: #0000FF;">MouseEnter</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>child_MouseEnter<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        child.<span style="color: #0000FF;">MouseLeave</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>child_MouseLeave<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        RegisterEvents<span style="color: #000000;">&#40;</span>child<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> child_MouseLeave<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    OnMouseLeave<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> child_MouseEnter<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    OnMouseEnter<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> child_MouseMove<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, MouseEventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    OnMouseMove<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> child_Click<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, <span style="color: #000000;">System</span>.<span style="color: #0000FF;">EventArgs</span> e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    OnClick<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Beim Ausführen des Codes wird deutlich, dass die Events nur auf die Hintergrundfläche des Controls reagieren. Bewegt man die Maus in den Grenzbereich zum farbigen Rechteck, kommt es sogar zu einem sehr unschönen Flimmern.</p>
<p><strong>MouseEnter und MouseLeave: Auf richtige Verschaltung kommt es an</strong><br />
Wie schon erwähnt wird für die MouseEnter und MouseLeave Events eine Sonderbehandlung benötigt. Diese wird durch ein Überschreiben der OnMouseEnter und OnMouseLeave Methoden realisiert. In diesen muss eine Zustandsvariable eingeführt und die Mausposition muss ausgewertet werden.  In der Zustandsvariablen  wird gespeichert, ob sich die Maus bereits innerhalb des Controls befindet. In diesem Fall wird kein neuer MouseEnter-Event ausgelöst.  Beim MouseLeave wird die Mausposition überprüft. Nur wenn sich die Maus tatsächlich außerhalb des Controls befindet, wird der MouseLeave Event ausgeführt:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #008080; font-style: italic;">// This flag indicates if the mouse was inside the control</span>
<span style="color: #FF0000;">bool</span> inside <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnMouseEnter<span style="color: #000000;">&#40;</span>EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// Check if mouse was already in control. </span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>inside<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        inside <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnMouseEnter</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnMouseLeave<span style="color: #000000;">&#40;</span>EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// Check mouse coordinates</span>
    Point mouseCoordinates <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Parent</span>.<span style="color: #0000FF;">PointToClient</span><span style="color: #000000;">&#40;</span>MousePosition<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// Call base method only if mouse really left control</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Bounds</span>.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span>mouseCoordinates<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        inside <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnMouseLeave</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Zu guter Letzt</strong><br />
Mit dem dritten Teil endet mein Workshop über Usercontrols zunächst. Das heißt aber nicht, dass ich nicht noch mehr coole Ideen und Tricks zum Thema UserControls habe. Die verrate ich aber nur, wenn ich auch mal nen Kommentar zu meinen Workshops bekomme <img src='http://blog.sternico.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Also haut in die Tasten und schreibt was Ihr denkt oder zu was Ihr gerne noch mehr lesen würdet.</p>
<p>So, und wie immer gibt es an dieser Stelle das komplette Projekt zum Download:</p>
<p><a href='http://blog.sternico.de/wp-content/uploads/2009/08/UserControlWorkshopPart3.zip'>Visual Studio Pojekt &#8220;UserControlworkShopPart2&#8243;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/08/workshop-usercontrols-part-3-events-im-griff-%e2%80%93-mouse-und-focus-events-sinnvoll-implementiert/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Meine drei Top Entwicklungstools</title>
		<link>http://blog.sternico.de/2009/06/meine-drei-top-entwicklungstools/</link>
		<comments>http://blog.sternico.de/2009/06/meine-drei-top-entwicklungstools/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 21:50:05 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=92</guid>
		<description><![CDATA[Mit diesem Blog-Artikel schließe ich mich der MSDN-Blogparade an und möchte ich die drei von mir am meisten genutzten Entwicklungswerkzeuge vorstellen:
MS Visual Studio 2008
MS SQL Server / SQL Server Management Studio
Red Gate .Net Reflector

MS Visual Studio 2008
MS Visual Studio ist defacto die Standard-Entwicklungsumgebung zur Realisierung von Windows Anwendungen.
Ich benutze das Visual Studio schon seit der [...]]]></description>
			<content:encoded><![CDATA[<p>Mit diesem Blog-Artikel schließe ich mich der <a href="http://blogs.msdn.com/softwarehersteller/archive/2009/05/06/msdn-blog-parade-was-sind-ihre-lieblings-entwickler-tools-mitmachen-und-gewinnen.aspx" target="_blank">MSDN-Blogparade</a> an und möchte ich die drei von mir am meisten genutzten Entwicklungswerkzeuge vorstellen:</p>
<li>MS Visual Studio 2008</li>
<li>MS SQL Server / SQL Server Management Studio</li>
<li>Red Gate .Net Reflector</li>
<p><span id="more-92"></span></p>
<p><strong>MS Visual Studio 2008</strong><br />
MS Visual Studio ist defacto die Standard-Entwicklungsumgebung zur Realisierung von Windows Anwendungen.<br />
Ich benutze das Visual Studio schon seit der Version 2003 und bin sehr zufrieden mit den Möglichkeiten, die einem geboten werden. Ich habe viel Java programmiert und mich dadurch sehr schnell in C# zurecht gefunden. Die Unterstützung durch die Visual Studio IDE ist sehr umfassend und z.B. der Designer für Windows Anwendungen ermöglicht es einem, ansprechende Oberflächen zusammen zu klicken und einfache Datenbankanbindungen zu realisieren. Mehr zu Fakten und zur Geschichte des Visual Studios kann z.B. bei Wikipedia nach gelesen werden: <a href="http://de.wikipedia.org/wiki/Microsoft_Visual_Studio#Version_.NET" target="_blank">Microsoft Visual Studio</a><br />
Seit geraumer Zeit bietet Microsoft auch kostenlose Varianten des Visual Studios an, die &#8220;Express&#8221;-Editionen. Für alle, die nur Windows Anwendungen oder Webanwendungen realisieren wollen genügt diese völlig. Mit dieser Version dürfen sogar kommerzielle Projekte realisert werden. Die Professional Variante bietet darüber hinaus einen größeren Funktionsumfang und ermöglicht es beispielsweise auch, Anwendungen für Windows Mobile Geräte zu schreiben.<br />
Wer das Visual Studio also noch nicht kennt, sollte sich einfach mal die Expressversion herunterladen und ausprobieren:<br />
<a href="http://www.microsoft.com/germany/Express/" target="_blank">Microsoft Visual Studio 2008 Express Editions</a></p>
<p><strong>MS SQL Server / MS SQL Server Management Studio</strong><br />
Der MS SQL Server ist eine relationale Datenbank die sich - Hersteller-bedingt - optimal in die Microsoft Windows Landschaft integriert. Mehr zum MS SQL Server kann z.B. direkt bei <a href="http://www.microsoft.com/sql" target="_blank">Microsoft</a> oder auch bei <a href="http://de.wikipedia.org/wiki/Microsoft_SQL_Server" target="_blank">Wikipedia</a> nachgelesen werden.<br />
Das Microsoft SQL Server Management Studio wird zusammen mit dem MS SQL Server ausgeliefert. Es ist das Zentrale Werkzeug zur Verwaltung des SQL Servers und zur Entwicklung und zum Test von Sql-Abfragen (Queries). Man kann es von der MS SQL-Server Installations-DVD aus auf dem Entwicklungsrechner installieren. Die älteren Versionen (bsp. 2003) basierten auf die Windows MMC. Ab Version 2005 basiert das SQL Server Management Studio auf die Umgebung des Visual Studios.<br />
Auch vom SQL Server und vom SQL Server Management Studio kann eine Express Version bezogen werden:<br />
<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=de&amp;FamilyID=58ce885d-508b-45c8-9fd3-118edd8e6fff" target="_blank">Downloaddetails: Microsoft SQL Server Management Studio Express</a><br />
<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796&amp;displaylang=de target=">Downloaddetails: Microsoft SQL Server Management Studio Express</a></p>
<p><strong>Red Gate .Net Reflector</strong><br />
Jeder der Programme auf Basis des Microsoft .Net Frameworks realisiert sollte sich bewußt sein, dass sein Programm-Code in <a href="http://de.wikipedia.org/wiki/Common_Language_Infrastructure" target="_blank">CLI-Code</a> übersetzt wird, was neben vielen Vorteilen auch wieder den Nachteil hat, dass der Code sehr leicht decompiliert werden kann. Wie einfach das geht, kann jeder mit dem Tool <a href="http://www.red-gate.com/products/reflector/index.htm" target="_blank">&#8220;.Net Reflector&#8221;</a> ausprobieren, das kostenlos von Red Gate bezogen werden kann. Dieses Tool ist einer der mächtigsten <a href="http://de.wikipedia.org/wiki/Decompiler" target="_blank">Decompiler</a> für .Net Dieses Tool stellt damit ein absolutes Must-Have für .Net Entwickler dar, wobei natürlich beachtet werden muß, dass das Decompileren vieler Programme in deren Nutzungsbedingungen ausgenommen ist. Diese Einschränkung ist jedoch nicht uneingeschränkt gültig, wie z.B. <a href="http://de.wikipedia.org/wiki/Reverse_Engineering" target="_blank">hier</a> bei Wikipedia erläutert wird. Bleibt also nur die Schlussfolgerung zu ziehen, dass wer seinen Quellcode wirkungsvoll schützen möchte auf <a href="http://de.wikipedia.org/wiki/Obfuscator">Obfuscator</a> wie z.B. den im Visual Studio enthaltenen &#8220;Dotfuscator Community Edition&#8221; zurückgreifen sollte.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/06/meine-drei-top-entwicklungstools/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Workshop UserControls Part 2: Bedienung bitte! - Über Click, KeyPress und Mnemonics</title>
		<link>http://blog.sternico.de/2009/05/workshop-usercontrols-part-2-bedienung-bitte-uber-click-keypress-und-mnemonics/</link>
		<comments>http://blog.sternico.de/2009/05/workshop-usercontrols-part-2-bedienung-bitte-uber-click-keypress-und-mnemonics/#comments</comments>
		<pubDate>Sun, 24 May 2009 17:43:02 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<category><![CDATA[Workshops]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=90</guid>
		<description><![CDATA[Im zweiten Teil meines kleinen Workshops möchte ich auf Events, speziell auf den Click-Event eingehen. Was auf den ersten Blick recht einfach anmutet, erfordert doch einen gewissen Aufwand, wenn eine konsistente Bedienung inklusive der Unterstützung von Tastatur-Events und Mnemonics (&#38;-Shortcuts) erreicht werden soll.
Der Click-Event
Damit sich unsere Schaltfläche aus Teil 1 des Workshops auch tatsächlich als [...]]]></description>
			<content:encoded><![CDATA[<p>Im zweiten Teil meines kleinen Workshops möchte ich auf Events, speziell auf den Click-Event eingehen. Was auf den ersten Blick recht einfach anmutet, erfordert doch einen gewissen Aufwand, wenn eine konsistente Bedienung inklusive der Unterstützung von Tastatur-Events und Mnemonics (&amp;-Shortcuts) erreicht werden soll.<span id="more-90"></span></p>
<p><strong>Der Click-Event</strong><br />
Damit sich unsere Schaltfläche aus <a href="http://blog.sternico.de/2009/05/workshop-usercontrols-part-1-getting-started/">Teil 1 des Workshops</a> auch tatsächlich als Schaltfläche verhält, wird eine sinnvolle Implementierung des Click-Events benötigt. Wie jedes Control besitzt die Klasse UserControl bereits einen ClickEvent. Dieser wird jedoch nur ausgelöst, wenn auch tatsächlich auf das UserControl geklickt wird. Wird stattdessen z.B. auf das Label in dem UserControl geklickt, wird der Click-Event nicht ausgelöst.</p>
<p>Folglich müssen wir von allen Untergeordneten Controls den ClickEvent abonieren und mit diesem ein Click Auslösen, was ein Eventsammler für uns erledigt.</p>
<p><strong>Eventsammler</strong><br />
Über eine rekursive Methode wird der Click-Event aller untergeordneten Controls aboniert:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> SomeButton<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    InitializeComponent<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    RegisterEvents<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> RegisterEvents<span style="color: #000000;">&#40;</span>Control parent<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Control child <span style="color: #0600FF;">in</span> parent.<span style="color: #0000FF;">Controls</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        child.<span style="color: #0000FF;">Click</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">EventHandler</span><span style="color: #000000;">&#40;</span>child_Click<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        RegisterEvents<span style="color: #000000;">&#40;</span>child<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Abfeuern des ClickEvents</strong><br />
Nun bleibt die Frage, wie wir selbst den Click Event unseres Controls auslösen können. Der erste Ansatz, den Event mit &#8220;override&#8221; zu überschreiben schlägt fehl, da der Event nicht als &#8220;virtual&#8221; definiert ist. Nun könnte man versucht sein, den Event einfach auszublenden und den neuen Event wie folgt zu definieren:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #008000;">new</span> <span style="color: #0600FF;">event</span> EventHandler Click<span style="color: #008000;">;</span></pre></div></div>

<p>Hiervon sei aber dringend abzuraten!!! Wird unsere Componente nämlich als Componente betrachtet und auf sie der Click Event registriert (z.B. so wie wir es in der Methode &#8220;RegisterEvents&#8221; gemacht haben ), so wird nicht der neue, sondern der Event der Basisklasse abonniert. Also gilt: <strong>NEVER DO THAT!</strong></p>
<p>Stattdessen ist auf die Methode base.OnClick(EventArgs e) zurück zugreifen. Diese Methode löst den Click-Event aus:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">void</span> child_Click<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, <span style="color: #000000;">System</span>.<span style="color: #0000FF;">EventArgs</span> e<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnClick</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Click als Standard</strong><br />
Ein kleines Detail fehlt dem Click-Event noch; damit dieser standardmäßig angelegt wird, wenn im Designer auf unser Control ein Doppelclick ausgeführt wird, müssen wir unere Class UserControl mit dem Attribut [DefaultEvent(&#8221;Click&#8221;)] versehen.</p>
<p>Schon hat sich unser Control in einen funktionierenden Button  verwandelt. Wobei die Button-Funktionalität noch nicht volständig gegeben ist. Unser Button reagiert nicht auf Tastatureingabe.</p>
<p><strong>Tastatureingabe</strong><br />
Um auf Tastatureingabe zu reagieren, ist es nicht nötig, von allen untergeordneten Controls das KeyDown-Event zu abonieren, da ein KeyDown nur von einem Control ausgelöst werden kann, dass den EingabeFocus hat. Folglich reicht es, für unser UserControll selbst den KeyDown-Event zu abonieren. Dies kann z.B. über die Design-Ansicht gemacht werden (Properties-Fenster auf Events umschalten und dort ein Doppelklick auf KeyDown) oder natürlich auch als Code im Konstruktor der Klasse. </p>
<p>In der KeyDown-Eventmethode wird nun einfach überprüft, ob der Benutzer Space oder Enter gedrückt hat und entsprechend ein Click-event ausgelöst:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> SomeButton_KeyDown<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, KeyEventArgs e<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">KeyCode</span> <span style="color: #008000;">==</span> Keys.<span style="color: #0000FF;">Space</span> <span style="color: #008000;">||</span> e.<span style="color: #0000FF;">KeyCode</span> <span style="color: #008000;">==</span> Keys.<span style="color: #0000FF;">Enter</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnClick</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Nun können Per Tab-Taste die Buttons ausgewählt und mit Space oder Enter bestätigt werden. Der einzige Hacken ist nur, dass der Benutzer nicht erkennen kann, welcher Button gerade den Focus hat. Dieses Problem wird in Teil 3 dieses Workshops angesprochen.</p>
<p><strong>Mnemonics</strong><br />
Der Begriff Mnemonic bedeutet &#8220;Gedächtnisstütze&#8221; vom griechischen mnēmoniká &#8220;Gedächtnis&#8221;. Im Context Windows Applikation steht er für die Sortcuts, die bei Betätigung der ALT-Taste in Form eines unterstrichenen Buchstabens angezeigt werden. Dieser Buchstabe wird vom Entwickler festgelegt, in dem ihm ein &amp; vorangestellt wird. Das &amp; erscheint nicht auf dem Button. (Soll dagegen Tatsächlich ein &amp; auf dem Button stehen, so müssen zwei &amp; angegeben werden.) </p>
<p><img src="http://blog.sternico.de/wp-content/uploads/2009/05/usercontrolwithmnemonics.png" alt="" title="Das UserConrol mit Mnemonics" width="268" height="244" class="alignnone size-medium wp-image-91" /></p>
<p>Wenn wir nun wollen, dass unser UserControl auf ein Mnemonic reagiert, reicht es aber leider nicht, in die Text-Property ein &#038; einzufügen. Der nachfolgende Buchstabe wird zwar unterstrichen, sobald man die ALT-Taste drückt, ein Click wird jedoch nicht ausgelöst.<br />
Der Trick besteht nun darin, dass die Methode &#8220;ProcessMnemonic&#8221; überschrieben werden muss. Diese Methode wird aufgerufen, wenn der Benutzer eine mögliche Tastenkombination gedrückt hat. Der statischen methode Control.isMnemotic() wird der Wert der Text-Property unseres Controls übergeben und es wird ausgewertet, ob diese Tatsächlich der Mnemonic dieses Controls war. Bei positiver Rückgabe ein Click ausgelöst.</p>
<p>Implementiert wird dies wie folgt:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> ProcessMnemonic<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">char</span> charCode<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Control.<span style="color: #0000FF;">IsMnemonic</span><span style="color: #000000;">&#40;</span>charCode, <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Text</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnClick</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> EventArgs<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">else</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">ProcessMnemonic</span><span style="color: #000000;">&#40;</span>charCode<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Zu guter Letzt</strong><br />
Hier endet nun auch der zweite Teil des UserControl-Workshops. Im <a href="http://blog.sternico.de/2009/08/workshop-usercontrols-part-3-events-im-griff-%e2%80%93-mouse-und-focus-events-sinnvoll-implementiert/">dritten Teil</a> werde ich noch tiefer auf Events eingehen, insbesondere werde ich die MouseEnter, MouseLeave und die Focus Events behandeln, so dass sich unser Control noch intuitiver verhält.</p>
<p>Wie immer gibt es an dieser Stelle das komplette Projekt zum Download:</p>
<p><a href='http://blog.sternico.de/wp-content/uploads/2009/05/usercontrolworkshoppart2.zip'>Visual Studio Pojekt &#8220;UserControlworkShopPart2&#8243;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/05/workshop-usercontrols-part-2-bedienung-bitte-uber-click-keypress-und-mnemonics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Workshop UserControls Part 1: Getting Started</title>
		<link>http://blog.sternico.de/2009/05/workshop-usercontrols-part-1-getting-started/</link>
		<comments>http://blog.sternico.de/2009/05/workshop-usercontrols-part-1-getting-started/#comments</comments>
		<pubDate>Sun, 10 May 2009 17:11:51 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<category><![CDATA[Workshops]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=85</guid>
		<description><![CDATA[In letzter Zeit habe ich des öfteren UserControls implementiert. Da es dabei doch einige Tricks und Kniffe gibt, die ich zum einen Teil selbst herausgefunden und zum anderen Teil aus diversen Quellen zusammengesucht habe, möchte ich diese in Form eines kleinen Workshops an dieser Stelle zusammenfassen.
Anhand einfacher Beispiele wird in die Thematik eingeführt und z.B. [...]]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit habe ich des öfteren UserControls implementiert. Da es dabei doch einige Tricks und Kniffe gibt, die ich zum einen Teil selbst herausgefunden und zum anderen Teil aus diversen Quellen zusammengesucht habe, möchte ich diese in Form eines kleinen Workshops an dieser Stelle zusammenfassen.<br />
Anhand einfacher Beispiele wird in die Thematik eingeführt und z.B. auf die Verwendung von Properties und Events in UserControls eingegangen. Im ersten Teil wird neben den Basics insbesondere die Text-Property erläutert, die auf den ersten Blick doch sehr widerspenstig anmutet.<span id="more-85"></span></p>
<p><strong>Was sind UserControls?</strong><br />
UserControls können mit dem Visual Studio sehr bequem aus bestehenden Controls zusammen gestellt werden. Das resultierende UserControl kann genauso wie ein bestehendes Control im Visual Studio verwendet werden. Durch Properties wird das Control dabei bequem parametrierbar.<br />
In dem folgenden Beispiel wird eine Schaltfläche mit individuellem Design realisiert:</p>
<p><img src="http://blog.sternico.de/wp-content/uploads/2009/05/usercontrol.png" alt="" title="usercontrol" width="128" height="43" class="alignnone size-full wp-image-86" /></p>
<p><strong>Ein UserControl anlegen…</strong><br />
… ist nicht wirklich schwer. Als erstes wird ein Projekt im Visual Studio benötigt. Im einfachsten Fall ist dies eine Windows-Anwendung die (CamelCase lässt grüßen) z.B. „UserControlWorkshopPart1“ heißen könnte. </p>
<p>Folgende Schritte sind nun nötig:</p>
<ol>
<li>Dem Projekt wird ein neues UserControl „SomeButton“ zugefügt.</li>
<li>Die Hintergrundfarbe wird auf weiß gesetzt und ein Panel und ein Label werden hinzugefügt.</li>
<li>Das Panel bekommt einen roten Hintergrund und für die Schattierungen werden zwei weitere Panels mit einem etwas dunkleren Rot zugefügt.</li>
<li>Die neuen Panels werden im ersten Panel angedockt: das eine unten, das andere rechts. Das Panel rechts bekommt die Breite 2 und das Panel unten die Höhe 2.</li>
<li>Das erste Panel bekommt die Größe 20&#215;20 und wird ganz an den linken Rand gesetzt.</li>
<li>Das Label bekommt den Text „Some Text“</li>
</ol>
<p>Anschließend wird das Projekt einmal kompiliert.</p>
<p><strong>Ready To Go: das UserControl einsetzten</strong><br />
Bisher haben wir das UserControl ja nur in der Design-Sicht verwendet. Nach dem Kompilieren unseres Projektes steht es uns in der Toolbar zur Verfügung und wartet nur darauf, auf ein Formular gezogen zu werden:</p>
<p><img src="http://blog.sternico.de/wp-content/uploads/2009/05/usercontrolonform.png" alt="" title="Das UserControl im Einsatz" width="268" height="244" class="alignnone size-full wp-image-87" /></p>
<p>Wie bei jedem normalen Control können nun über den Designer bequem z.B. Größe oder die Schriftart ändern, was sich interessanterweise auch auf die untergeordneten Controls und somit auch unser Label sofort durchschlägt. Im Folgenden wird gezeigt, wie neue Eigenschaften deklariert werden können, wodurch das Control noch flexibler wird.</p>
<p><strong>Das Control über Properties parametrieren</strong><br />
Als einfaches Beispiel soll zunächst die Farbe des Rechtecks einstellbar sein. Dazu wird in der Code-Ansicht des UserControls die Property „BoxColor“ definiert, in deren Set-Methode einfach die BackColor-Eigenschaft des ersten Panels durchgereicht wird. Um das ganze noch spannender zu machen, erhalten das zweite und das dritte Panel zugleich eine leicht dunklere Variante der ausgewählten Farbe:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Drawing</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Windows.Forms</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> UserControlWorkshopPart1 <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> partial <span style="color: #FF0000;">class</span> SomeButton <span style="color: #008000;">:</span> UserControl <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> SomeButton<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            InitializeComponent<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #FF0000;">byte</span> makeDarker<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">byte</span> input<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span>input<span style="color: #008000;">*</span><span style="color: #FF0000;">0.7</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> Color BoxColor <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>panel1.<span style="color: #0000FF;">BackColor</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            set <span style="color: #000000;">&#123;</span>
                panel1.<span style="color: #0000FF;">BackColor</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
                Color darkerColor <span style="color: #008000;">=</span> Color.<span style="color: #0000FF;">FromArgb</span><span style="color: #000000;">&#40;</span>makeDarker<span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">R</span><span style="color: #000000;">&#41;</span>, makeDarker<span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">G</span><span style="color: #000000;">&#41;</span>, makeDarker<span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">B</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                panel3.<span style="color: #0000FF;">BackColor</span> <span style="color: #008000;">=</span> darkerColor<span style="color: #008000;">;</span>
                panel2.<span style="color: #0000FF;">BackColor</span> <span style="color: #008000;">=</span> darkerColor<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Nach dem erneuten kompilieren können wir nun über den Designer bequem etwas Farbe in unser Form bringen:</p>
<p><img src="http://blog.sternico.de/wp-content/uploads/2009/05/usercontrolonformcolor.png" alt="" title="Das ganze in Farbe und bunt..." width="268" height="244" class="alignnone size-full wp-image-88" /></p>
<p><strong>Nicht ganz ohne: die Text-Property</strong><br />
Jetzt fehlt nur noch eine Möglichkeit, den Text des Controls zu ändern.<br />
Analog zum vorherigen Beispiel liegt folgender Code nahe:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Text <span style="color: #000000;">&#123;</span>
    get <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>label1.<span style="color: #0000FF;">Text</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
    set <span style="color: #000000;">&#123;</span>
        label1.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Beim kompilieren erhalten wir nun die Warnung „&#8217;UserControlWorkshopPart1.SomeButton.Text&#8217; hides inherited member &#8216;System.Windows.Forms.UserControl.Text&#8217;. To make the current member override that implementation, add the override keyword…”</p>
<p>Die Meldung besagt, dass UserControl bereits eine Property Text besitzt. Da diese jedoch auf das Label umgeleitet werden soll, deklarieren wir die Property mit dem override-Schlüsselwort:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">string</span> Text <span style="color: #000000;">&#123;</span>
    get <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>label1.<span style="color: #0000FF;">Text</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
    set <span style="color: #000000;">&#123;</span>
        label1.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Nach einem erneuten Kompilieren ist die Warnung weg. Jedoch erscheint die Property Text nicht in dem Properties-Fenster. Die Erklärung hierfür ist, dass die Text-Property eines UserControls per Default im Designer ausgeblendet wurde. Dies muss über Member-Attribute wieder rückgängig gemacht werden. Folgende 3 Attribute sollten gesetzt werden:</p>
<p><i>Browsable(true):</i><br />
Hierdurch erscheint die Property im Designer</p>
<p><i>DesignerSerializationVisibility(DesignerSerializationVisibility.Visible):</i><br />
Ist dieses Attribut nicht gesetzt, vergisst der Designer den eingestellten Wert beim schließen des Formulares sofort wieder.</p>
<p><i>Localizable(true):</i><br />
Durch dieses Attribut wird es möglich, die Text-Property für verschiedene Sprachen zu lokalisieren.</p>
<p>Mit diesen drei Attributen sieht die Text-Property nun wiefolgt aus:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #000000;">&#91;</span>DesignerSerializationVisibility<span style="color: #000000;">&#40;</span>DesignerSerializationVisibility.<span style="color: #0000FF;">Visible</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #000000;">&#91;</span>Browsable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #000000;">&#91;</span>Localizable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">string</span> Text <span style="color: #000000;">&#123;</span>
    get <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>label1.<span style="color: #0000FF;">Text</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
    set <span style="color: #000000;">&#123;</span>
        label1.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Zum kompilieren wird noch eine zusätzliche Using-Anweisung benötigt:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System.ComponentModel</span><span style="color: #008000;">;</span></pre></div></div>

<p><strong>Zu guter Letzt</strong><br />
Das war auch schon der erste Teil des UserControl-Workshops. Im <a href="http://blog.sternico.de/2009/05/workshop-usercontrols-part-2-bedienung-bitte-uber-click-keypress-und-mnemonics/" alt="Workshop UserControls Part 2: Bedienung bitte! - Über Click, KeyPress und Mnemonics">zweiten Teil</a> werde ich näher auf  Events eingehen, insbesondere den Click Event, damit sich unser Control auch wie ein ordentlicher Button verhält.</p>
<p>Wie immer gibt es an dieser Stelle das komplette Projekt zum Download:</p>
<p><a href='http://blog.sternico.de/wp-content/uploads/2009/05/usercontrolworkshoppart1.zip'>Visual Studio Pojekt &#8220;UserControlworkShopPart1&#8243;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/05/workshop-usercontrols-part-1-getting-started/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Wenn F6 versagt</title>
		<link>http://blog.sternico.de/2009/04/wenn-f6-versagt%e2%80%a6/</link>
		<comments>http://blog.sternico.de/2009/04/wenn-f6-versagt%e2%80%a6/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 19:34:36 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=84</guid>
		<description><![CDATA[Normalerweise wird durch Druck auf F6 im Visual Studio ein Build ausgelöst. Löst F6 kein Build aus und verhalten sich auch andere Tastaturkürzel komisch, ist das Visual Studio falsch konfiguriert. Dieser schon fast rekordverdächtig kurze Blog-Eintrag zeigt die korrekte Einstellung.
Die richtige Einstellung&#8230;
Die Einstellung, nach der ich lange gesucht habe und die mir auch Google nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Normalerweise wird durch Druck auf F6 im Visual Studio ein Build ausgelöst. Löst F6 kein Build aus und verhalten sich auch andere Tastaturkürzel komisch, ist das Visual Studio falsch konfiguriert. Dieser schon fast rekordverdächtig kurze Blog-Eintrag zeigt die korrekte Einstellung.<span id="more-84"></span></p>
<p><strong>Die richtige Einstellung&#8230;</strong><br />
Die Einstellung, nach der ich lange gesucht habe und die mir auch Google nicht verraten konnte ist die Folgende:<br />
Im Menü &#8220;Tools&#8221; => &#8220;Options&#8221; auswählen. Im Options-Dialog nun  &#8220;Enviroment&#8221; => &#8220;Keyboard&#8221; auswählen und &#8220;Apply the following additional keyboard mapping scheme&#8221; auf &#8220;Visual C#&#8221; stellen. Schon ist die Welt wieder in Ordnung <img src='http://blog.sternico.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Noch ein Tip</strong><br />
Wo wir schon mal hier sind, gleich noch ein Tipp, wo man hinschauen sollte: &#8220;Enviroment&#8221; => &#8220;International Settings&#8221;. Steht hier eine andere Sprache, als die in der man das Visual Studio installiert hat oder sogar &#8220;Same as Microsoft Windows&#8221; kann dies zu fast schon babylonischer Sprachverwirrung führen  (Passiert z.B. wenn man auf einem deutschen WinXP ein englisches Visual Studio 2005 und anschließend ein deutsches SQL Server Management Studio installiert&#8230;). <img src='http://blog.sternico.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> Also, hier immer die tatsächlich installierte Sprache einstellen&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/04/wenn-f6-versagt%e2%80%a6/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ErrorProviderButtonDisabler - Gibt Fehleingaben keine Chance</title>
		<link>http://blog.sternico.de/2009/02/errorproviderbuttondisabler-gibt-fehleingaben-keine-chance/</link>
		<comments>http://blog.sternico.de/2009/02/errorproviderbuttondisabler-gibt-fehleingaben-keine-chance/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 19:20:57 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=80</guid>
		<description><![CDATA[Eine sehr prakische Komponente in .Net ist der ErrorProvider. Mit ihm kann z.B. in einem Dialog eine interaktive Fehlermeldung angezeigt werden, wenn in einem Feld eine ungültige Eingabe gemacht wurde. Nun ist es naheliegend, den Benutzer zu hindern, einen Dialog mit ungültiger Eingabe zu schließen. Dazu habe ich im Rahmen der Entwicklung des BookInventorisers die Komponente &#8220;ErrorProviderButtonDisabler&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Eine sehr prakische Komponente in .Net ist der ErrorProvider. Mit ihm kann z.B. in einem Dialog eine interaktive Fehlermeldung angezeigt werden, wenn in einem Feld eine ungültige Eingabe gemacht wurde. Nun ist es naheliegend, den Benutzer zu hindern, einen Dialog mit ungültiger Eingabe zu schließen. Dazu habe ich im Rahmen der Entwicklung des <a href="http://blog.sternico.de/2009/01/book-inventoriser-eine-kleine-studie/">BookInventorisers</a> die Komponente &#8220;ErrorProviderButtonDisabler&#8221; realisiert.<span id="more-80"></span></p>
<p><strong>Die Idee</strong><br />
Die Klasse &#8220;ErrorProviderButtonDisabler&#8221; erweitert die Klasse &#8220;ErrorProvider&#8221; und kann folglich auch genauso verwendet werden. Zusätzlich hat sie noch die Eigenschaft &#8220;DefaultButton&#8221;. Dieser Eigenschaft wird der OK-Button des Dialoges zugewiesen. Sobald nun ein Fehler im ErrorProvider anliegt, wird der OK-Button disabled, so dass der Benutzer den Dialog nicht mit OK verlassen kann. Liegen keine Fehler an, sind folglich alle Felder korrekt gefüllt und der OK-Button wird wieder freigegeben. Natürlich kann der Benutzer den Dialog jederzeit über Cancel verlassen, auch wenn eine ungültige Eingabe vorliegt.</p>
<p><a href='http://blog.sternico.de/wp-content/uploads/2009/02/errorproviderbuttondisabler.png' target="_blank"><img src="http://blog.sternico.de/wp-content/uploads/2009/02/errorproviderbuttondisabler-300x156.png" alt="" title="errorproviderbuttondisabler" width="300" height="156" class="alignnone size-medium wp-image-81" /></a></p>
<p><strong>Der Code</strong><br />
Die Realisierung ist sehr einfach, weswegen ich sie hier an einem Stück aufliste:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Windows.Forms</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Drawing</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> BookInventoriser <span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
    <span style="color: #008080; font-style: italic;">/// Behaves like a normal ErrorProvider but in addition controls a Button, which will only be enabled if no Error occures.</span>
    <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
    <span style="color: #000000;">&#91;</span>ToolboxBitmap<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>ErrorProvider<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ErrorProviderButtonDisabler<span style="color: #008000;">:</span> ErrorProvider <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> Button acceptButton<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> Button AcceptButton <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> acceptButton<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
            set <span style="color: #000000;">&#123;</span> acceptButton <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> Hashtable errors <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Hashtable<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #008000;">new</span> <span style="color: #0600FF;">void</span> SetError<span style="color: #000000;">&#40;</span>Control control, <span style="color: #FF0000;">string</span> value<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">SetError</span><span style="color: #000000;">&#40;</span>control, value<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>value <span style="color: #008000;">!=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
                errors<span style="color: #000000;">&#91;</span>control<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">else</span> <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">try</span> <span style="color: #000000;">&#123;</span>
                    errors.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span>control<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>AcceptButton<span style="color: #008000;">!=</span><span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>errors.<span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
                    AcceptButton.<span style="color: #0000FF;">Enabled</span> <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">else</span> <span style="color: #000000;">&#123;</span>
                    AcceptButton.<span style="color: #0000FF;">Enabled</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/02/errorproviderbuttondisabler-gibt-fehleingaben-keine-chance/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tooltip-Alternative: der HelpExtender</title>
		<link>http://blog.sternico.de/2009/02/tooltip-alternative-der-helpextender/</link>
		<comments>http://blog.sternico.de/2009/02/tooltip-alternative-der-helpextender/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 22:04:28 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=77</guid>
		<description><![CDATA[Als Alternative zu Tooltips habe ich einen &#8220;HelpExtender&#8221; programmiert, der einen Hilfetext bereitstellt, wenn der Benutzer mit der Maus über ein Control geht oder dieses den Fokus erhält. Dabei ist der HelpExtender genauso bequem zu benutzen und unterstützt sogar mehrere Sprachen.
Die Idee
Mein Ziel war es, eine Komponente zu realisieren, die sich im Visual Studio genauso [...]]]></description>
			<content:encoded><![CDATA[<p>Als Alternative zu Tooltips habe ich einen &#8220;HelpExtender&#8221; programmiert, der einen Hilfetext bereitstellt, wenn der Benutzer mit der Maus über ein Control geht oder dieses den Fokus erhält. Dabei ist der HelpExtender genauso bequem zu benutzen und unterstützt sogar mehrere Sprachen.<span id="more-77"></span></p>
<p><strong>Die Idee</strong><br />
Mein Ziel war es, eine Komponente zu realisieren, die sich im Visual Studio genauso wie ein Tooltip benutzen läßt. Im Gegensatz zum Tooltip sollte die Komponente aber keinen Text direkt anzeigen, sondern über einen Event die Hilfetexte bereit stellen. So kann der Text an einer beliebigen Stelle ausgegeben werden, z.B. in einer Textbox oder in der Statusleiste.</p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/02/helpextender.png" target="_blank"><img class="alignnone size-medium wp-image-73" title="HelpExtender" src="http://blog.sternico.de/wp-content/uploads/2009/02/helpextender-300x220.png" alt="" width="300" height="220" /></a></p>
<p><strong>Das Interface IExtenderProvider</strong><br />
Die Klasse Tooltip erweitert andere Controls um eine Eigenschaft &#8220;ToolTip&#8221;, über die sich der ToolTip -Text festlegen läßt. Genauso soll sich auch der HelpExtender verhalten. Dies geschieht über das Interface &#8220;IExtenderProvider&#8221;. Die Eigenschaft, die bereitgestellt werden soll, wird durch das Attribut &#8220;ProvideProperty&#8221; angegeben. Damit ergibt sich für den HelpExtender folgende Deklaration:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #000000;">&#91;</span>ProvideProperty<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;HelpText&quot;</span>, <span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Control<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>, ToolboxItemFilter<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;System.Windows.Forms&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> HelpExtender <span style="color: #008000;">:</span> Component, IExtenderProvider <span style="color: #000000;">&#123;</span>
  ...
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Die Eigenschaft HelpText</strong><br />
Für die Eigenschaft HelpText muß nun noch eine Set und eine Get Methode geschrieben werden. In der Set-Methode wird zum einen der Helptext in der Hash-Table &#8220;helpTexts&#8221; gespeichert und zum anderen werden die Events MouseEnter, MouseLeave, GotFocus und LostFocus registriert. Hierdurch wird der HelpExtender beanachrichtigt, wenn der Benutzer mit der Maus über eins der verwalteten Controls geht oder dieses den Focus erhält:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> SetHelpText<span style="color: #000000;">&#40;</span>Control control, <span style="color: #FF0000;">string</span> caption<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>caption <span style="color: #008000;">!=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    helpTexts<span style="color: #000000;">&#91;</span>control<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> caption<span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">MouseEnter</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_MouseEnter<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">MouseLeave</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_MouseLeave<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">GotFocus</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_GotFocus<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">LostFocus</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_LostFocus<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">else</span> <span style="color: #000000;">&#123;</span>
    helpTexts<span style="color: #000000;">&#91;</span>control<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">MouseEnter</span> <span style="color: #008000;">-=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_MouseEnter<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">MouseLeave</span> <span style="color: #008000;">-=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_MouseLeave<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">GotFocus</span> <span style="color: #008000;">-=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_GotFocus<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    control.<span style="color: #0000FF;">LostFocus</span> <span style="color: #008000;">-=</span> <span style="color: #008000;">new</span> EventHandler<span style="color: #000000;">&#40;</span>control_LostFocus<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Die Get-Methode sucht zu dem übergebenen Control den passenden Text:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #000000;">&#91;</span>DefaultValue<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span>, Editor<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0&quot;</span>, <span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>UITypeEditor<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>, Localizable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> GetHelpText<span style="color: #000000;">&#40;</span>Control control<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>control <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">Empty</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>helpTexts<span style="color: #000000;">&#91;</span>control<span style="color: #000000;">&#93;</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span>helpTexts<span style="color: #000000;">&#91;</span>control<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
  <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Event-Verarbeitung</strong><br />
Nun wird noch ein Event samt passender Argumente und EventHandler benötigt, der über einen Hilfetext benachrichtig:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">delegate</span> <span style="color: #0600FF;">void</span> HelpTextEventHandler<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, HelpTextEventArgs args<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> HelpTextEventArgs <span style="color: #008000;">:</span> EventArgs <span style="color: #000000;">&#123;</span>
  <span style="color: #FF0000;">string</span> helpText<span style="color: #008000;">;</span>
  <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> HelpText <span style="color: #000000;">&#123;</span>
    get <span style="color: #000000;">&#123;</span>
      <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>helpText<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
&nbsp;
  <span style="color: #0600FF;">public</span> HelpTextEventArgs<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> helpText<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">helpText</span> <span style="color: #008000;">=</span> helpText<span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">event</span> HelpTextEventHandler HelpTextAvailable<span style="color: #008000;">;</span></pre></div></div>

<p>In der Eventbehandlung wird nun der HelpTextAvailable Event über die Methoden &#8220;provideHelpText&#8221; und &#8220;ClearHelpText&#8221; ausgelöst:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> provideHelpText<span style="color: #000000;">&#40;</span>Control control<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  <span style="color: #FF0000;">string</span> text <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span>helpTexts<span style="color: #000000;">&#91;</span>control<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>text <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> text <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>HelpTextAvailable <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    HelpTextAvailable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>, <span style="color: #008000;">new</span> HelpTextEventArgs<span style="color: #000000;">&#40;</span>text<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> clearHelpText<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>HelpTextAvailable <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    HelpTextAvailable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>, <span style="color: #008000;">new</span> HelpTextEventArgs<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> control_GotFocus<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  provideHelpText<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>Control<span style="color: #000000;">&#41;</span>sender<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> control_MouseLeave<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  clearHelpText<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> control_MouseEnter<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  provideHelpText<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>Control<span style="color: #000000;">&#41;</span>sender<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">void</span> control_LostFocus<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  clearHelpText<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Das Ergebnis</strong><br />
Mit der so entstandenen Komponente lassen sich auf einfache und komfortable Weise Hilfetexte für Oberflächen realisieren. Auch die Lokalisierung stellt kein Problem dar. Zur Benutzung muß die Komponente einfach nur auf das gewünschte Form gezogen werden und die Hilfe-Texte müssen definiert werden. Durch einen Doppelklick auf den HelpExtender gelangt man zu dem Event, der ausgelöst wird, wenn ein Hilfetext bereit steht. Durch eine einfache Anweisung kann dieser z.B. auf ein StatusLabel übertragen werden:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> helpExtender1_HelpTextAvailable<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, HelpTextEventArgs args<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">toolStripStatusLabelHelp</span>.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> args.<span style="color: #0000FF;">HelpText</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Hier noch einmal ein Screenshot aus dem Beispielprojekt sowie der komplette Sourcecode zum Download:</p>
<p><img class="alignnone size-medium wp-image-73" title="HelpExtender Demo" src="http://blog.sternico.de/wp-content/uploads/2009/02/helpextender2.png" alt="" width="300" height="183" /></p>
<p>Das Projekt steht hier zum Download bereit:</p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/02/helpextender.zip">Beispielprojekt &#8220;HelpExtender&#8221;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/02/tooltip-alternative-der-helpextender/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DTV-Channels komfortabel verwalten</title>
		<link>http://blog.sternico.de/2009/01/dtv-channels-komfortabel-verwalten/</link>
		<comments>http://blog.sternico.de/2009/01/dtv-channels-komfortabel-verwalten/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 21:16:21 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[Mediaplayer]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=70</guid>
		<description><![CDATA[Ich habe mich geärgert, dass in der Oberfläche des fantec MM-HDRTV (der wiederum baugleich mit dem Emtec Movie Qube Q800 ist) die Sender nur sehr umständlich zu bearbeiten sind. Daher habe ich mir ein kleines Windows-Programm geschrieben, um die Sender komfortabel zu verwalten.  In der aktuellen Version können Sender gelöscht, verschoben und umbenannt werden.  Zudem kann [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe mich geärgert, dass in der Oberfläche des fantec MM-HDRTV (der wiederum baugleich mit dem Emtec Movie Qube Q800 ist) die Sender nur sehr umständlich zu bearbeiten sind. Daher habe ich mir ein kleines Windows-Programm geschrieben, um die Sender komfortabel zu verwalten.  In der aktuellen Version können Sender gelöscht, verschoben und umbenannt werden.  Zudem kann die Datei mit den Sendern auf dem PC gespeichert werden.<br />
UPDATE: Die neue Version 1.2 unterstützt nun auch die aktuellste Firmware-Version und beherrscht Copy &#038; Paste.<br />
<span id="more-70"></span></p>
<p><fieldset><span style="color: #ff0000;"><strong>Vorab ein Hinweis:</strong></span> Alle Information in diesem Artikel sind ohne Garantie. Es ist nicht auszuschließen, dass durch unsachgemäße Veränderungen von Dateien das Gerät vollständig zerstört wird. Auch übernehme ich keine Garantie dafür, dass mit dem von mir erstellte Programm &#8220;DTV-Channel-Manager&#8221; erstellte Dateien in jedem Fall fehlerfrei von dem Gerät angenommen werden. Für die hier beschriebenen Modifikationen sind Linux-Grundkenntnisse empfohlen!<br />
</fieldset></p>
<p><strong>Die dtv_channel.txt-Datei</strong></p>
<p>Die Liste der Sender wird in einer Datei mit dem Namen dtv_channel.txt gespeichert, die sich in dem Pfad /usr/local/etc/dvdplayer befindet. Leider trügt die Endung txt, es handelt sich um eine Binärdatei.</p>
<p>Der einfachste Weg, die Datei zu erhalten, ist sie auf den Samba-Bereich der Platte zu kopieren. Dazu muss zunächst eine Telnet-Verbindung zu dem Gerät hergestellt werden.  Dies geht entweder mit dem Befehl &#8220;Telnet &lt;IP-Adresse&gt;&#8221; oder komfortabel über das Tool <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" target="_blank">Putty</a>, das ich nur empfehlen kann. Als Login ist &#8221;root&#8221; einzugeben, das Passwort lautet &#8220;MeLE&#8221;.</p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/01/telnet.png"><img class="alignnone size-medium wp-image-73" title="telnet" src="http://blog.sternico.de/wp-content/uploads/2009/01/telnet-300x186.png" alt="" width="300" height="186" /></a></p>
<p>Mit dem folgenden Befehl wird die Datei kopiert:</p>
<p>cp /usr/local/etc/dvdplayer/dtv_channel.txt /var/hdd/volumes/HDD1/</p>
<p>Die Datei kann nun von Windows aus zugegriffen und bearbeitet werden. Da es sich aber leider eben nicht um eine echte Text-Datei handelt, gestaltet sich das Bearbeiten zunächst als schwierig.</p>
<p>Die Datei ist wie folgt aufgebaut:</p>
<ul>
<li>Header: 4 Byte, je nach Firmware z.B. 0xFF000004 oder 0xFF000005 </li>
<li>Anzahl der Sender: 4 Byte Integer</li>
<li>Sender: 544 Byte (576 Byte in der neusten Firmware)</li>
<li>CRC32: 4 Byte</li>
</ul>
<p>Die Sender selbst sind wiederum so aufgebaut:</p>
<ul>
<li>Index des Senders: 4 Byte</li>
<li>Länge des Titels: 4 Byte</li>
<li>Der Titel (Nullterminiert): X Byte</li>
<li>Sonstige Daten (noch keine Details bekannt)</li>
</ul>
<p>Das Umsortieren und Löschen ist nun trivial. Für das Umbenennen muss der Name als nullterminierter String geschrieben werden (UTF-8) sowie die Länge korrekt eingetragen werden.</p>
<p>Anschließend muss der CRC32 neu berechnet werden. Hierbei ist zu beachten, dass die Bit-Reihenfolge vom höchstwertigsten zu niederwertigsten erfolgt und der Startcode 0xFFFFFFFF lautet. Details zum CRC32 finden sich bei <a href="http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung" target="_blank">Wikipedia</a>.</p>
<p><strong>Das Programm &#8220;DTV Channel Manager&#8221;</strong></p>
<p>Hier nun das Programm zur Bearbeitung der DTV-Channels:</p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/01/dtvmanager.png"><img class="alignnone size-medium wp-image-71" title="dtvmanager" src="http://blog.sternico.de/wp-content/uploads/2009/01/dtvmanager-300x207.png" alt="" width="300" height="207" /></a></p>
<p>Über diesen Dialog wird die Datei geöffnet:</p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/01/dtvmanager2.png"><img class="alignnone size-medium wp-image-72" title="dtvmanager2" src="http://blog.sternico.de/wp-content/uploads/2009/01/dtvmanager2-300x135.png" alt="" width="300" height="135" /></a></p>
<p>Der Download des DTV Channel Managers befindet sich am Ende dieses Artikels.</p>
<p><strong>Speichern und aktivieren der aktualisierten Senderliste</strong></p>
<p>Die neue Datei muss nun wieder auf das Gerät geschrieben werden.  Hierzu kann z. B. die Datei auf der Samba-Partition geschrieben werden und mit dem folgenden Befehl zurück kopiert werden:</p>
<p>cp /var/hdd/volumes/HDD1/dtv_channel.txt /usr/local/etc/dvdplayer/</p>
<p>Damit die Box die Datei übernimmt, muss die Anwendung &#8220;DVDPlayer&#8221; neu gestartet werden. Dies kann entweder durch einen kompletten Neustart der Box oder durch den folgenden Befehl im Telnet erfolgen:</p>
<p>kill $(pidof DvdPlayer)</p>
<p><strong>Noch mehr Komfort: schreiben der Datei über Web</strong></p>
<p>Da es natürlich sehr umständlich ist, die Datei immer hin- und herzukopieren, habe ich auf der Box ein Webserver gestartet und zwei cgi-Scripte geschrieben, um auf die Datei zu zugreifen. Diese Dateien habe ich in der Samba-Partition in dem Ordner www/cgi-bin abgelegt und mit chmod 755 die Rechte für die Datei eingestellt. Natürlich können die Dateien auch in anderen Partitionen abgelegt werden.<br />
Um auf der Box ein Webinterface zu starten, habe ich die Datei /etc/inetd.conf in das Verzeichnis /usr/local/etc kopiert und wie auf dem Screenshot zu sehen ist angepasst.</p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/01/inetd.png"><img class="alignnone size-medium wp-image-74" title="inetd" src="http://blog.sternico.de/wp-content/uploads/2009/01/inetd-300x186.png" alt="" width="300" height="186" /></a></p>
<p>Um den inetd-Dämonen nun mit der Konfigurationsdatei als Parameter beim starten des Gerätes auszuführen, wird in die Datei /usr/local/rcS folgende Zeile angefügt:</p>
<p>inetd /usr/local/etc/inetd.conf</p>
<p>Wird nun die Datei dtv_channel.cgi aufgerufen, so gibt sie einfach den Inhalt der Datei /usr/local/etc/dvdplayer/dtv_channel.txt zurück. Somit kann die Senderliste von dem Gerät gelesen werden. Um nun eine geänderte Senderliste an das Gerät zu schicken, muss auf die URL einfach ein POST angewendet werden. Die übermittelten Daten werden dann direkt auf das Gerät in die /usr/local/etc/dvdplayer/dtv_channel.txt geschrieben.<br />
Die zweite Datei heißt restart.cgi und übernimmt den Neustart der DVDPlayer-Anwendung. Sie führt einfach den oben beschriebenen Kill-Befehl aus.</p>
<p>Sind diese beiden CGI-Scripte installiert, so kann die Senderliste mit dem DTV-Channel-Manager auch direkt bearbeitet werden.</p>
<p><strong>Downloads</strong></p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/01/dtvchannelmanager.1.2.zip">» DTV Channel Manager (UPDATE v1.2)</a></p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/01/cgi-scripts.zip">» CGI-Scripte</a></p>
<p><strong>Ausblick</strong></p>
<p>Das Gerät bietet noch eine Menge weitere spannende Optionen. Insbesondere das Webinterface ist ausbaufähig. Anregungen (z.B. als Kommentar) werden gerne angenommen. Mehr dazu werde ich in kommenden Artikeln veröffentlichen. <img src='http://blog.sternico.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>UPDATE</strong></p>
<p>Die Header der dtv_channel.txt scheinen nicht bei allen Firmware-Versionen gleich zu sein. Auch die Länge der Channel-Entries ist in der neusten Firmware 576 statt 544 byte. In der neuen Version (1.1, Download s. oben) des DTV Channel Managers wird die Länge nun dynamisch berechnet, somit müßte diese auch mit der neuen Firmware funktionieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/01/dtv-channels-komfortabel-verwalten/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Book Inventoriser - eine kleine Studie</title>
		<link>http://blog.sternico.de/2009/01/book-inventoriser-eine-kleine-studie/</link>
		<comments>http://blog.sternico.de/2009/01/book-inventoriser-eine-kleine-studie/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 20:40:28 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[.NET Themen]]></category>

		<category><![CDATA[ClickOnce]]></category>

		<category><![CDATA[Software Entwicklung]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=24</guid>
		<description><![CDATA[Mehr als Übung für verschiedene Programmiertechniken und Funktionen ist das Programm &#8220;Book Inventoriser&#8221;, ein Buch Inventar Programm mit ISBN Barcodescanner-Unterstützung, entstanden. Da es mittlerweile einen recht ordentlichen Funktionsumfang aufweist, möchte ich es an dieser Stelle vorstellen.

Der aktuelle Funktionsumfang des Book Inventorisers

Erfassung von Büchern anhand der ISBN
Unterstützung von Barcodescannern
Nachschlagen der Buchdetails im Internet
Verwaltung der Standorte
Export der Bücherliste in [...]]]></description>
			<content:encoded><![CDATA[<p>Mehr als Übung für verschiedene Programmiertechniken und Funktionen ist das Programm &#8220;Book Inventoriser&#8221;, ein Buch Inventar Programm mit ISBN Barcodescanner-Unterstützung, entstanden. Da es mittlerweile einen recht ordentlichen Funktionsumfang aufweist, möchte ich es an dieser Stelle vorstellen.<br />
<span id="more-24"></span></p>
<p><strong>Der aktuelle Funktionsumfang des Book Inventorisers</strong></p>
<ul>
<li>Erfassung von Büchern anhand der ISBN</li>
<li>Unterstützung von Barcodescannern</li>
<li>Nachschlagen der Buchdetails im Internet</li>
<li>Verwaltung der Standorte</li>
<li>Export der Bücherliste in CSV</li>
<li>Mehrsprachigkeit: Deutsch/Englisch</li>
<li>Installation per Click-Once ohne das Adminrechte benötigt werden</li>
</ul>
<p>Für den Anfang stelle ich hier zunächst das Setup zur Verfügung. Das gesamte Projekt kommt nach und nach, bevor ich es veröffentliche möchte ich an der einen oder anderen Stelle noch ein wenig Feinschliff vornehmen und einzelne sehr interessante Aspekte herausarbeiten.</p>
<p><a href="http://blog.sternico.de/wp-content/uploads/2009/01/bookinventoriser.png"><img class="alignnone size-medium wp-image-69" title="bookinventoriser" src="http://blog.sternico.de/wp-content/uploads/2009/01/bookinventoriser-300x212.png" alt="Book Inventoriser" width="300" height="212" /></a></p>
<p>Das Programm kann lizenzfrei benutzt werden. Für die Funktion und Verfügbarkeit besteht jedoch seitens der Sternico keine Garantie.</p>
<p><strong>Installations-URL:</strong><br />
<a href="http://download.sternico.de/deployment/applications/BookInventoriser/publish.htm" target="_blank">» Book Inventoriser</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2009/01/book-inventoriser-eine-kleine-studie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>In Access verknüpfte Tabellen lokal kopieren</title>
		<link>http://blog.sternico.de/2008/09/in-access-verknupfte-tabellen-lokal-kopieren/</link>
		<comments>http://blog.sternico.de/2008/09/in-access-verknupfte-tabellen-lokal-kopieren/#comments</comments>
		<pubDate>Sat, 20 Sep 2008 19:56:09 +0000</pubDate>
		<dc:creator>Werner Mager</dc:creator>
		
		<category><![CDATA[Software Entwicklung]]></category>

		<category><![CDATA[VBA / Microsoft Office]]></category>

		<guid isPermaLink="false">http://blog.sternico.de/?p=66</guid>
		<description><![CDATA[Häufig wird Access auf Grund der komfortablen Oberfläche als Frontend für Server basierte Datenbanken (z.B. MS SLQL, MySQl oder Oracle) genommen. Die Tabellen sind dabei nicht direkt in Access gespeichert sondern lediglich verknüpft. Der einzige Nachteil dabei ist, dass man mit dem Frontend die Daten nun nicht so einfach mitnehmen kann. In diesem Artikel wird [...]]]></description>
			<content:encoded><![CDATA[<p>Häufig wird Access auf Grund der komfortablen Oberfläche als Frontend für Server basierte Datenbanken (z.B. MS SLQL, MySQl oder Oracle) genommen. Die Tabellen sind dabei nicht direkt in Access gespeichert sondern lediglich verknüpft. Der einzige Nachteil dabei ist, dass man mit dem Frontend die Daten nun nicht so einfach mitnehmen kann. In diesem Artikel wird eine VBA Funktion vorgestellt, die es mit einem einzigen Befehl ermöglicht, die verknüpften Tabellen in lokale Tabellen zu verwandeln.<span id="more-66"></span></p>
<p><strong>Lokale Tabellen finden</strong></p>
<p>Sämtliche Tabellen sind in Access über das Objekt TabelDefs zugreifbar. Über eine einfache Foreach-Schleife können diese durchlaufen werden:</p>

<div class="wp_syntax"><div class="code"><pre class="vb">  <span style="color: #b1b100;">Dim</span> td <span style="color: #b1b100;">As</span> TableDef
  <span style="color: #b1b100;">For</span> Each td In CurrentDb.<span style="color: #66cc66;">TableDefs</span>
    ...
  <span style="color: #b1b100;">Next</span></pre></div></div>

<p>Handelt es sich bei der Tabelle um eine verknüpfte Tabelle, so ist die String-Eigenschaft Connect der zugehörigen Tabellendefinition gesetzt. Folglich können verknüpfte Tabellen daran erkannt werden, dass Connect nicht leer ist. Beim Durchlaufen fällt zudem auf, dass es Tabellen gibt, die ~ im Namen beinhalten. Diese sind Access-Interne Tabellen und werden von uns einfach ignoriert. Durch die folgende Schleife sammeln wir alle verlinkten Tabellen in einer Collection:</p>

<div class="wp_syntax"><div class="code"><pre class="vb">  <span style="color: #b1b100;">Dim</span> locals <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">New</span> Collection
 
  <span style="color: #808080;">' Verlinkte Tabellen suchen</span>
  <span style="color: #b1b100;">Dim</span> td <span style="color: #b1b100;">As</span> TableDef
  <span style="color: #b1b100;">For</span> Each td In CurrentDb.<span style="color: #66cc66;">TableDefs</span>
    <span style="color: #b1b100;">If</span> <span style="color: #b1b100;">Not</span> td.<span style="color: #66cc66;">Connect</span> = <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #b1b100;">Then</span>
      <span style="color: #b1b100;">If</span> <span style="color: #b1b100;">InStr</span><span style="color: #66cc66;">&#40;</span>td.<span style="color: #b1b100;">Name</span>, <span style="color: #ff0000;">&quot;~&quot;</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #b1b100;">Then</span>
        locals.<span style="color: #66cc66;">Add</span> td.<span style="color: #b1b100;">Name</span>
      <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
    <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
  <span style="color: #b1b100;">Next</span></pre></div></div>

<p><strong>Eine verknüpfte Tabelle in eine lokale Tabelle umwandeln</strong></p>
<p>Um die verknüpfte Tabelle TabelleA samt Daten in eine lokale Tabelle TabelleB zu kopieren, verwenden wir den folgenden SQL-Befehl:</p>

<div class="wp_syntax"><div class="code"><pre class="sql">  <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#91;</span>TabelleA<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.*</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #66cc66;">&#91;</span>TabelleB<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>TabelleA<span style="color: #66cc66;">&#93;</span>;</pre></div></div>

<p>Da wir die verknüpfte Tabelle ja durch die Lokale ersetzen wollen, müssen wir die verknüpfte Tabelle zuerst mit einem neuen Namen kopieren, dann die verknüpfte Tabelle löschen und schließlich der neuen Tabelle wieder den ursprünglichen Namen geben. Dies geschieht mit den folgenden 3 Zeilen:</p>

<div class="wp_syntax"><div class="code"><pre class="vb">    DoCmd.<span style="color: #66cc66;">RunSQL</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SELECT [&quot;</span> &amp; Table &amp; <span style="color: #ff0000;">&quot;].* INTO [local_&quot;</span> &amp; Table &amp; <span style="color: #ff0000;">&quot;] FROM [&quot;</span> &amp; Table &amp; <span style="color: #ff0000;">&quot;];&quot;</span><span style="color: #66cc66;">&#41;</span>
    DoCmd.<span style="color: #66cc66;">DeleteObject</span> acTable, Table
    DoCmd.<span style="color: #66cc66;">Rename</span> Table, acTable, <span style="color: #ff0000;">&quot;local_&quot;</span> &amp; Table</pre></div></div>

<p><strong>Die Funktion makeTablesLocal</strong></p>
<p>Die beschriebenen Schritte werden nun in einer Funktion zusammengefaßt, die z.B. über die Direkteingabe aufgerufen werden kann:</p>

<div class="wp_syntax"><div class="code"><pre class="vb"><span style="color: #b1b100;">Function</span> makeTablesLocal<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
 
  DoCmd.<span style="color: #66cc66;">SetWarnings</span> <span style="color: #b1b100;">False</span>
  <span style="color: #b1b100;">Dim</span> locals <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">New</span> Collection
 
  <span style="color: #808080;">' Verlinkte Tabellen suchen</span>
  <span style="color: #b1b100;">Dim</span> td <span style="color: #b1b100;">As</span> TableDef
  <span style="color: #b1b100;">For</span> Each td In CurrentDb.<span style="color: #66cc66;">TableDefs</span>
    <span style="color: #b1b100;">If</span> <span style="color: #b1b100;">Not</span> td.<span style="color: #66cc66;">Connect</span> = <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #b1b100;">Then</span>
      <span style="color: #b1b100;">If</span> <span style="color: #b1b100;">InStr</span><span style="color: #66cc66;">&#40;</span>td.<span style="color: #b1b100;">Name</span>, <span style="color: #ff0000;">&quot;~&quot;</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #cc66cc;">0</span> <span style="color: #b1b100;">Then</span>
        locals.<span style="color: #66cc66;">Add</span> td.<span style="color: #b1b100;">Name</span>
      <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
    <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
  <span style="color: #b1b100;">Next</span>
 
  <span style="color: #808080;">' Tabellen umwandeln</span>
  <span style="color: #b1b100;">For</span> Each Table In locals
    Debug.<span style="color: #b1b100;">Print</span> <span style="color: #ff0000;">&quot;Kopiere &quot;</span> &amp; Table &amp; <span style="color: #ff0000;">&quot;...&quot;</span>
    DoCmd.<span style="color: #66cc66;">RunSQL</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SELECT [&quot;</span> &amp; Table &amp; <span style="color: #ff0000;">&quot;].* INTO [local_&quot;</span> &amp; Table &amp; <span style="color: #ff0000;">&quot;] FROM [&quot;</span> &amp; Table &amp; <span style="color: #ff0000;">&quot;];&quot;</span><span style="color: #66cc66;">&#41;</span>
    DoCmd.<span style="color: #66cc66;">DeleteObject</span> acTable, Table
    DoCmd.<span style="color: #66cc66;">Rename</span> Table, acTable, <span style="color: #ff0000;">&quot;local_&quot;</span> &amp; Table
  <span style="color: #b1b100;">Next</span>
<span style="color: #b1b100;">End</span> <span style="color: #b1b100;">Function</span></pre></div></div>

<p>Und wie immer gibt es hier noch den gesamten Code zum Download: </p>
<p><a href='http://blog.sternico.de/wp-content/uploads/2008/09/tabletools.bas' target='_blank'>Modul TableTools</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sternico.de/2008/09/in-access-verknupfte-tabellen-lokal-kopieren/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
