tag:blogger.com,1999:blog-33907164559600415892024-03-08T22:37:31.744+01:00Mario SchneiderHilfreiche Tipps & Tricks rund um Windows ; Code-Snippets in C# (.NET) u.v.m.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.comBlogger28125tag:blogger.com,1999:blog-3390716455960041589.post-7951527647549474912009-10-27T18:24:00.021+01:002009-10-30T17:22:08.922+01:00Dot Net (C#): lokalisiertes PropertyGrid ; lokalisierte AttributeIn der heutigen Zeit wird eine Anwendung meistens für mehrere Sprachen realisiert. Mit Microsoft .NET ist es kein Problem, Windows-Anwendungen zu lokalisieren. Doch immer wieder kommt die Frage auf, wie man <strong>Attribute</strong>, insbesondere solche für das <strong>PropertyGrid (Description, DisplayText, Category)</strong>, lokalisieren kann.<br /><br />Da meine Internetrecherche zu diesem Thema kaum brauchbare Beispiele hervorbrachte, möchte ich an einem Minimalbeispiel darauf eingehen:<br /><br />Als erstes brauchen wir eine Klasse, die lokalisiert werden soll, nehmen wir in diesem Fall eine "Person":<br /><pre class="csharpcode" style="background: #f4f4ff; border: 1px dashed #aaa; margin: 10px; padding: 10px"><span class="kwrd">namespace</span> LocalizeableDescriptionPropertyGrid<br />{<br /> <span class="kwrd">public</span> <span class="kwrd">class</span> Person<br /> {<br /> <span class="rem">// Properties</span><br /> <span class="kwrd">public</span> String FirstName { get; set; }<br /> <span class="kwrd">public</span> String LastName { get; set; }<br /><br /> <span class="rem">// ctor</span><br /> <span class="kwrd">public</span> Person(<span class="kwrd">string</span> fName, <span class="kwrd">string</span> lName)<br /> {<br /> <span class="kwrd">this</span>.FirstName = fName;<br /> <span class="kwrd">this</span>.LastName = lName;<br /> }<br /> <br /> <span class="rem">// other methods ...</span><br /> }<br />}<br /></pre><br />Normalerweise würde man die Klasse nun wir folgt mit Attributen versehen:<br /><pre class="csharpcode" style="background: #f4f4ff; border: 1px dashed #aaa; margin: 10px; padding: 10px">[DescriptionAttribute(<span class="str">"Der Vorname dieser Person"</span>)]<br /><span class="kwrd">public</span> String FirstName { get; set; }<br /><br />[DescriptionAttribute(<span class="str">"Der Nachname dieser Person"</span>)]<br /><span class="kwrd">public</span> String LastName { get; set; }</pre><br />Diese Vorgehensweise hat jedoch den Nachteil, dass die Attribute nicht lokalisierbar sind. Leider gibts es in .NET keine Möglichkeit, solche Attribute problemlos zu lokalisieren, da deren Information von der Laufzeitumgebung einmal eingelesen wird (per Reflection) und danach nicht mehr aktualisiert. Mit einem kleinen Trick kann man jedoch zumindest dafür sorgen, dass genau in diesem Momemt die Attribute der Sprache angepasst werden. Dazu ist es als erstes notwendig, die lokalisierten Texte wie gewohnt in einer beliebigen <strong>Resource-Datei</strong> abzulegen.<br /><br /><div align="center"><img src=http://www.marioschneider-online.de/blog/localizableattributesscreen01.png /></div><br /><br />Als nächstes muss eine Klasse her, die es einem Attribut ermöglicht, seine Informationen aus einer Resource-Datei zu laden. Ich zeige das Verfahren am Beispiel des <strong>Description-Attributes</strong>, es kann alternativ mit dem Category- und DisplayText-Attribut verfahren werden:<br /><br />Lediglich ein privates Feld (oder Property) sowie das Überschreiben des Get-Property sind notwenidg.<br /><pre class="csharpcode" style="background: #f4f4ff; border: 1px dashed #aaa; margin: 10px; padding: 10px"><span class="kwrd">public</span> <span class="kwrd">class</span> LocalizedDescriptionAttribute : DescriptionAttribute<br />{<br /> <span class="rem">/// <summary></span><br /> <span class="rem">/// Contains the name of the resource-string</span><br /> <span class="rem">/// </summary></span><br /> <span class="kwrd">private</span> <span class="kwrd">string</span> rDescription;<br /><br /> <span class="rem">/// <summary></span><br /> <span class="rem">/// Creates a new LocalizedDescription Attribute instance</span><br /> <span class="rem">/// giving it the name of the resource-string</span><br /> <span class="rem">/// </summary></span><br /> <span class="rem">/// <param name="description"></param></span><br /> <span class="kwrd">public</span> LocalizedDescriptionAttribute(<span class="kwrd">string</span> description)<br /> {<br /> <span class="kwrd">this</span>.rDescription = description;<br /> }<br /><br /> <span class="rem">/// <summary></span><br /> <span class="rem">/// (Overridden) Get: fetching the description during runtime</span><br /> <span class="rem">/// from the Resources (with respect to the current culture)</span><br /> <span class="rem">/// </summary></span><br /> <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">string</span> Description<br /> {<br /> get<br /> {<br /> <span class="kwrd">return</span> Properties.Resources.ResourceManager.GetString(<br /> <span class="kwrd">this</span>.rDescription,<br /> Thread.CurrentThread.CurrentCulture<br /> );<br /> }<br /> }<br />}</pre><br />Als nächstes ist es notwendig, die Klasse Person abzuändern und das <strong>neue Attribut</strong> einzusetzen:<br /><pre class="csharpcode" style="background: #f4f4ff; border: 1px dashed #aaa; margin: 10px; padding: 10px"><span class="kwrd">namespace</span> LocalizeableDescriptionPropertyGrid<br />{<br /> <span class="kwrd">public</span> <span class="kwrd">class</span> Person<br /> {<br /> <span class="rem">// Properties</span><br /> [LocalizedDescriptionAttribute(<span class="str">"PersonFirstName"</span>)]<br /> <span class="kwrd">public</span> String FirstName { get; set; }<br /> [LocalizedDescriptionAttribute(<span class="str">"PersonLastName"</span>)]<br /> <span class="kwrd">public</span> String LastName { get; set; }<br /><br /> <span class="rem">// ctor</span><br /> <span class="kwrd">public</span> Person(<span class="kwrd">string</span> fName, <span class="kwrd">string</span> lName)<br /> {<br /> <span class="kwrd">this</span>.FirstName = fName;<br /> <span class="kwrd">this</span>.LastName = lName;<br /> }<br /> <br /> <span class="rem">// other methods ...</span><br /> }<br />}<br /></pre><br /><br />Eine fertige Klasse könnte wie folgt aussehen:<br /><!-- code formatted by http://manoli.net/csharpformat/ --><pre class="csharpcode" style="background: #f4f4ff; border: 1px dashed #aaa; margin: 10px; padding: 10px"><span class="kwrd">namespace</span> LocalizeableDescriptionPropertyGrid<br />{<br /> <span class="kwrd">public</span> <span class="kwrd">class</span> Person<br /> {<br /> <span class="rem">// Properties</span><br /> [LocalizedCategoryAttribute(<span class="str">"PersonCatData"</span>),<br /> LocalizedDescriptionAttribute(<span class="str">"PersonFirstNameDescription"</span>),<br /> LocalitedDisplayTextAttribute(<span class="str">"PersonFirstNameDisplayText"</span>)]<br /> <span class="kwrd">public</span> String FirstName { get; set; }<br /> <br /> [LocalizedCategoryAttribute(<span class="str">"PersonCatData"</span>),<br /> LocalizedDescriptionAttribute(<span class="str">"PersonLastNameDescription"</span>),<br /> LocalitedDisplayTextAttribute(<span class="str">"PersonLasttNameDisplayText"</span>)]<br /> <span class="kwrd">public</span> String LastName { get; set; }<br /> <br /> <span class="rem">// other properties</span><br /><br /> <span class="rem">// ctor</span><br /> <span class="kwrd">public</span> Person(<span class="kwrd">string</span> fName, <span class="kwrd">string</span> lName)<br /> {<br /> <span class="kwrd">this</span>.FirstName = fName;<br /> <span class="kwrd">this</span>.LastName = lName;<br /> }<br /> <br /> <span class="rem">// other methods ...</span><br /> }<br />}</pre><br /><br />Das gesamte Beispiel könnt ihr hier runterladen: <a href="http://www.marioschneider-online.de/blog/localizablepropgridcode.rar">localizablepropgridcode.rar</a> (14,6 KB)Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com1tag:blogger.com,1999:blog-3390716455960041589.post-55020074706758048692009-05-13T17:35:00.025+02:002009-07-19T14:18:55.012+02:00Understanding SSDs / which SSD to choose nowadaysSince december 2008 I'm using a SSD for my OS and the installed programs. I had to make a choice between the <u>OCZ Core v2 / Solid - series</u> <i>(MLC, JMicron-based)</i>, the <u>Patriot Warp v2</u> <i>(MLC, JMicron-based)</i> or the <u>Mtron Mobi 3500-series</u> <i>(SLC, proprietary development-chip)</i>. Because of better price per GB and availability I picked the <u>Patriot Warp v2</u>. Sadly I had to return it to the shop some days later because of terrible <b>stuttering/pause-problems</b>.<br /><br />Then I chose the <u>Mtron Mobi 3500-series (3525 32GB in fact)</u> and experienced some <b>very satisfying performance</b>. I'm using it for 5 months now and I'm still happy with my decision not to keep the Patriot Warp but switching to the Mtron Mobi. The diurnal performance of this drive is just astonishing in my book. Applications start in a fraction of time they did before (using a quite fast Samsung-HDD).<br /><br /><span style="color: #004080"><b>If you want to make your laptop/pc faster and are "still" using an HDD, all you have to do is to put any (good) SSD into it. This update is worth much more than adding more RAM, upgrading the CPU or anything else!!!</b></span><br /><br />So, it's been a while and some new SSDs are available down to the present day. OCZ launched their <u>Vertex</u> series (<u>Summit</u> comming soon), the Samsung <u>SLC-SSD</u> dropped in price, they launched the new <u>PB22-J</u> and a lot of other drives are pretty much available. So it's hard to select the right one if you want to have a good performing SSD for your OS and applications. Within the last days I read a lot of reviews concerning the <u>Intel X25-E</u> and the <u>OCZ Vertex</u>, two very attractive SSDs these days.<br /><br />There is one article that is definitely worth reading: At the <a href="http://www.anandtech.com" target="_blank">Anandtech-Website</a> you can find it: <b><a href="http://www.anandtech.com/storage/showdoc.aspx?i=3531" target="_blank">The SSD Anthology: Understanding SSDs and New Drives from OCZ</a></b>. This article starts with some facts about the stuttering/pause-problems (JMicron-based SSDs, esp. JMF602A/JMF602B) like I had with the Patriot Warp v2, explaines generally <a target="_blank" href="http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=3">why you should want an SSD</a>. Then it accurately describes <a target="_blank" href="http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=5">the anatomy of an SSD</a> <b>(very worth reading)</b>, it deals with the <a target="_blank" href="http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=8">performance degradation problem</a> <b>(also very worth reading!!!)</b>, describes how you can <a target="_blank" href="http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=11">restore the peak performance of your SSD</a> using secure erase-mechanism. Furthermore there is a <a target="_blank" href="http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=13">comparison of the <b>performances of new vs. used</b> drives</a>, a very juicy <a target="_blank" href="http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=18">story about the development of the OCZ Vertex</a> and finally a <a target="_blank" href="http://www.anandtech.com/storage/showdoc.aspx?i=3531&p=23">chunk of benchmark and real-world-usage results</a>.<br /><br />Unhappily this article does not include any words about my Mtron Mobi, but it explains a lot about SSDs itself, its architecture, its development during the last couple of month and has a clother look at the <b>OCZ Vertex and Intel X25-M</b>, two very interesting drives today.<br /><br />If you're planning to purchase a SSD and want to know why <span style="color: red"><b><u>not</u></b></span> to choose the OCZ Solid / Core, Patriot Warp and some other samples, you definitely have to read that article.<br /><br /><center><b><u>current prices of some SSDs:</u></b><br /><br /><img src="http://www.marioschneider-online.de/blog/ssd_prices_table.png"/><br /><i>(I picked ~60GB and 2,5" models, omitted old JMicron-based SSDs, sorted them by price/gb)</i><br /></center>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-74201857387510593572009-05-04T14:33:00.017+02:002009-05-28T13:06:48.567+02:008 GB Arbeitsspeicher unter Windows XP / Vista 32 Bit nutzen (Update 2)Jeder kennt das: Arbeitsspeicher kann man nie genug haben! Leider bieten Windows XP und Vista in der 32 Bit-Version lediglich eine Unterstützung für maximal 3,2 GB Arbeitsspeicher. Baut man nun 4, 6 oder 8 GB RAM ein, so stehen einem lediglich 3,2 GB zur Verfügung.<br /><br />Mit einem kleinen Trick kann man den restlichen RAM jedoch nutzen. Kürzlich bin ich auf folgenden Artikel aufmerksam geworden:<br /><br /><a href="http://www.tomshardware.com/de/foren/240612-26-vista-nutzen-disk" target="_blank">8GB unter Vista / XP x86 (32 Bit) nutzen - Dank RAM Disk</a><br /><br />Nach dieser Anleitung kann man von Windows XP / Vista 32-Bit nicht ansprechbaren RAM für eine RAM-Disk (RAM-Laufwerk) nutzen. Ich habe kürzlich weitere 4 GB zu meinen vorhandenen 2 GB DDR II - Speicher gesteckt und nutze nun die die verbleibenden 2,8 GB (6 - 3,2 = 2,8) für ein RAM-Laufwerk. Dort habe ich die <b>Auslagerungsdatei</b> von Windows, mein <b>Temp-Verzeichnis</b> sowie <b>portable Programme</b> und meinen <b>Webbrowser</b> untergebracht.<br /><br />Der <span style="font-weight:bold;">Vorteil</span> liegt auf der Hand: Von Windows "ausgelagerte" Daten bleiben im RAM, alle temporären Daten, der Browser-Verlauf/-Cache liegen im RAM. Das System ist dadurch deutlich schneller :)<br /><br /><hr><br /><u><b>Nachtrag:</b></u> vom 7.05.2009:<br /><br />Inzwischen habe ich meinen RAM von 6 auf 8 GB aufgestockt, da man mit den ca. 2,5 GB für die RAM-Disk nicht wirklich auskommt:<br />- Auslagerungsdatei: 1,2 GB<br />- Portable Anwendungen: 0,5 GB<br />- Webbrowser + Cache: 0,3 GB<br /><span style="color: red">- Temporäre Dateien: 0,5 GB</span><br /><br />Mit dem 8 GB-Ausbau habe ich nun 4,5 GB für die RAM-Disk, was sich wie folgt aufteilt:<br />- Auslagerungsdatei: 1,2 GB<br />- Portable Anwendungen: 0,5 GB<br />- Webbrowser + Cache: 0,3 GB<br /><span style="color: green">- Temporäre Dateien: <b>2,5</b> GB</span><br /><br /><br /><hr><br /><u><b>Nachtrag:</b></u> vom 18.05.2009:<br /><br />Wie das Leben so ist, gibt es zu jedem Vorteil auch immer mind. einen <span style="font-weight:bold;">Nachteil</span>. Sofern man mehr als nur die Auslagerungsdatei und temporäre Dateien auf dem RAM-Laufwerk hat, so muss dieses evtl. beim Beenden gespeichert und beim nächsten Booten neu geladen werden. Das kostet natürlich etwas Zeit, so dass der Boot-Vorgang minimal verlänger wird (Laden des Images), das Herunterfahren hingegen dauert spürbar länger (Speichern des Images auf Festplatte).<br /><br />Man muss sich also überlegen, ob man diesnn Nachteil in den Kauf nimmt. Ich persönlich kann damit aber sehr gut leben, der Performance-Vorsprung ist es mir Wert!<br /><br /><br /><hr><br /><u><b>Nachtrag:</b></u> vom 28.05.2009:<br /><br />Kurioserweise kann ich in meinem System die 8 GB RAM nicht zu 100% ausnutzen. Trage ich bei RAM-Disk in den Memory-Optionen die vom Bios gemeldet <span style="font-weight:bold;">8192</span> MB ein, so stürzt Windows beim nächsten Boot ab. Ich musste ein wenig experimentieren und bin nun mit folgenden Settings bei einem stabilen Betrieb angekommen:<br /><br />Installed (MB): 7890<br />Reserved (MB): 280<br />Direct address: disabled<br /><br />Daraus ergeben sich 4371 MB unmanaged memory, von denen ich 4300 für die RAM-Disk nutze.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-53455435320008870792009-03-08T15:24:00.006+01:002009-03-08T15:41:33.689+01:00Multi-display toolsBeim Arbeiten mit <b>mehreren Monitoren</b> fehlen insbesondere unter Windows XP Möglichkeiten, seine Fenster zu organisieren.<br /><br />Mit den Tools GridMove, UltraMon und ATI Tray Tools kann man seinen Desktop schnell um viele nützliche Funktionen erweitern. So lassen sich beispielsweise Fenster per Tastendruck auf einen anderen Monitor verschieben, an einem Rand oder einer vordefinierten Fläche auf einem Monitor ausrichten, einzelne Displays drehen (für Pivot-Funktionen) und vieles mehr.<br /><br />Hier die wichtigsten Funktionen der einzelnen Tools kurz vorgestellt:<br /><br /><b><u>UltraMon:</b></u><br /><ul><li>Monitore pixelgenau ausrichten</li><li>Erweiterung der Startleiste auf den zweitem Monitor</li><li>Verschieben von Fenstern auf andere Monitore per Shortcut</li><li>Starten von Tools auf bestimmten Monitoren / vordefinierten Positionen und Fenstergrößen</li><li>Desktopsymbole bzw. deren Position wieder herstellen, sollten diese sich verschoben haben</li><li>Monitore über Windows deaktivieren (Darstellung ausschalten)</li><li>unterschiedliche Wallpaper/Hintergründe für jeden Monitor einrichten</li></ul><u>Download:</u> <a title="Download: UltraMon @ realtimesoft.com" target="_blank" href="http://www.realtimesoft.com/de/ultramon/">www.realtimesoft.com/de/ultramon/</a><br /><br /><br /><b><u> ATI Tray Tools:</b></u><br /><ul><li>Setup der Monitore unter Windows</li><li>Drehen von einzelnen Monitoren</li><li>Getrennte Farbkorrekturen</li></ul><u>Download:</u> <a title="Download: ATI Tray Tools @ guru3d" target="_blank" href="http://www.guru3d.com/article/ati-tray-tools-/">www.guru3d.com/article/ati-tray-tools-/</a><br /><br /><br /><b><u>GridMove:</b></u><br /><ul><li>Ausrichten von Fenstern an Bildschirmrändern</li><li>Nebeneinander oder Übereinander ausrichten von Fenstern</li><li>Verschieben von Fenstern in vordefinierte "Flächen" auf Monitoren</li></ul><u>Download:</u> <a title="Download: GridMove @ jgpaiva.donationcoders.com" target="_blank" href="http://jgpaiva.donationcoders.com/gridmove.html">jgpaiva.donationcoders.com/gridmove.html</a>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-37056883064573733432009-02-27T00:51:00.016+01:002009-02-27T01:36:47.815+01:00Music Discovery Project 2009 - The Planets Reloaded - Paul van Dyk und das hr-Sinfonieorchester + Gäste2009 sollte es endlich wieder soweit sein: <b>Paul van Dyk</b> spielt ein erneutes Mal gemeinsam mit einem weltbekannten Orchester: Das <b>hr-Sinfonieorchester</b> unter seinem Chefdirigenten <b>Paavo Järvi</b> (zweifacher Grammy-Preisträger) spielte <b>Gustav Holsts "Die Planeten"</b>, das bereits bekannte Filmregisseure und diverse Rockbands faszinierte.<br /><br />Am Samstag, den 23. Mai 2009, war es soweit: Das Konzert wurde in der ausverkauften Jahrhunderthalle Frankfurt ausgetragen, wo zwei herausragende Musikwelten aufeinandertrafen: Klassig und Elektronik :)<br /><br />Musikalisch wurde das ganze in 2 Teile untergliedert: Als erstes spielte das hr-Sinfonieorchester "Die Planeten" (ca. 45 Minuten), anschließend trat Paul van Dyk samt <i>4-köpfiger Band (Schlagzeug: Flo Dauner [Die Fantastischen Vier], Gitarre: Bruce Gainsford [Vega 4], Percussion: Roland Peil, Keyboard: Ulf Kleiner)</i> sowie <i>4 Gesangpartnern (Johnny McDaid [Vega4], Josée Hurlock, Ryan Merchant, Jemma Endersby)</i> hinzu um seinen Teil zu spielen (ca. 55 Minuten). Diesen musikalischen Hochgenuss möchte ich euch natürlich nicht vorenthalten. Nach der Übertragung auf hr / youFM kann der Mitschnitt sowie weitere Informationen zu dem Event auf hr-online abgerufen werden (Links siehe unten).<br /><br /><b><u>Impressionen</u>:</b><div align="center"><table width="650"><tr><td><a title="Klick für Großansicht" target="_blank" href="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzExMSZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDI2OA__"><img width="250" src="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzExMSZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDI2OA__" /><br>Titelbild</a><br /></td><td><br /><a title="Klick für Großansicht" target="_blank" href="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzExNiZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDI4MA__"><img width="250" src="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzExNiZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDI4MA__" /><br>Das hr-Sinfonieorchester</a><br /></td></tr><br /><tr><td><br /><a title="Klick für Großansicht" target="_blank" href="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzExNSZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDI3Ng__"><img width="250" src="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzExNSZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDI3Ng__" /><br>Paavo Järvi,<br>Chefdirigent des hr-Sinfonieorchesters</a><br /></td><td><br /><a title="Klick für Großansicht" target="_blank" href="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzIyNiZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDM0Ng__"><img width="250" src="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzIyNiZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDM0Ng__" /><br>Gesangliche Unterstützung:<br>Josée Hurlock</a><br /></td></tr><br /><tr><td><br /><a title="Klick für Großansicht" target="_blank" href="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzIyNCZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDMzNg__"><img width="250" src="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzIyNCZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDMzNg__" /><br>Der Meister bei der Arbeit</a><br /></td><td><br /><a title="Klick für Großansicht" target="_blank" href="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzI4MCZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDQ4MA__"><img width="250" src="http://www.hr-online.de/servlet/de.hr.cms.servlet.IMS?enc=d3M9aHJteXNxbCZibG9iSWQ9OTYzMzI4MCZ3aWR0aD01ODUmaGVpZ2h0PTQzOSZpZD0zNjM3MDQ4MA__" /><br>Orchester + Band + Paul</a></td></tr></table></div><br /><br />Paul van Dyk spielte bereits 2005 mit dem Babelsberger Filmorchester die sogenannte "Orchestral Show - RBB Feinkost". Auch dieses Event war grandios inszeniert und absolut höhrenswert !!!<br /><br /><b><u>Links zum Thema</u>:</b><br /><ul><br /><li><a target="_blank" href="http://www.hr-online.de/website/rubriken/kultur/index.jsp?rubrik=35518&key=standard_document_36371594">Music Discovery Project 2009 – The Planets Reloaded - hr-online</a></li><li><a target="_blank" href="http://www.hr-online.de/website/rubriken/kultur/index.jsp?key=standard_document_36371594&jmpage=1&type=v&rubrik=35518&jm=4&mediakey=specials/standard/20090216_mdp_rso_neu2">Music Discovery Project 2009 – The Planets Reloaded -Teil 1: The Planets Reloaded – hr-Sinfonieorchester mit Paavo Järvi</a></li><li><a target="_blank" href="http://www.hr-online.de/website/rubriken/kultur/index.jsp?key=standard_document_36371594&jmpage=1&type=v&rubrik=35518&jm=5&mediakey=specials/standard/20090216_mdp_mit_dyk">Music Discovery Project 2009 – The Planets Reloaded -Teil 2: The Planets Reloaded – Remix mit Paul van Dyk</a></li><li><a target="_blank" href="http://www.hr-online.de/website/rubriken/kultur/index.jsp?rubrik=35518&key=standard_document_36371594&gallery=1&mMediaKey=mediathek_36370278&b=0">Fotoshow auf hr-online</a></li><li><a target="_blank" href="http://www.hr-online.de/website/derhr/home/presse_mappe_einzel.jsp?rubrik=4832&key=presse_lang_36341696">Pressebericht auf hr-online</a></li></ul>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-88857668498890075992009-02-13T00:18:00.010+01:002009-02-13T00:40:04.024+01:00Software-Portal software.marioschneider-online.deSeit Jahren findet ihr auf meiner <a title="weiter zu: www.marioschneider-online.de (neuer Tab)" target="_blank" href="http://www.marioschneider-online.de">privaten Webseite</a> jede Menge Programme, meist kleine Tools, die einem die Arbeit am PC erleichtern oder beim Programmieren unterstützen. Da ich für diese Programme gern eine zentrale Anlaufstelle einrichten wollte, ist vor kurz das Portal <a target="_blank" title="weiter zu: software.marioschneider-online.de (neuer Tab)" href="http://software.marioschneider-online.de">software.marioschneider-online.de</a> online gegangen. Dort findet ihr von nun an alle Informationen zu meinen Tools, incl. Versionsverlauf, Screenshots und den entsprechenden Download-Links.<br /><br />Tool-Liste (auszugsweise:)<br /><ul><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?Delphi%3A_CD-Manager" target="_blank">CD-Manager</a> (Delphi) - Verwaltung von CDs/DVDs für Spiele und Filme incl. Verleihliste</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?C%23%3A_File_Extractor" target="_blank">File Extractor</a> (C#) - Komfortables Entpacken mehrerer Rar-Archive, incl. Passwortselektor</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?C%23%3A_HTML_Map_Creator" target="_blank">HTML Map Creator</a> (C#), erzeugt HTML-Image-Maps (mehrere Links auf einem Bild)</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?C%23%3A_Icon_Viewer" target="_blank">Icon Viewer</a> - (C#) Navigator für Bilder und Icons (übersichtliche Darstellung von ico, gif, png, bmp etc.)</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?C%23%3A_Libra_XHTML_Editor" target="_blank">Libra XHTML-Editor</a> (C#) sehr komfortabler HTML-Editor mit grafischer (Block-)Darstellung von HTML-Elementen</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?Java%3A_Millhouse" target="_blank">Millhouse</a> (Java) Brettspiel Mühle inc. KI-Gegner, Netzwerkunterstützung und verschiedenen Skins</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?C%23%3A_Notizblock_.Net" target="_blank">Notizblock .Net</a> (C#) Programm zur übersichtlichen Verwaltung von beliebigen Notizen in mehreren Kategorien</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?C%23%3A_Passwort_Verwalter_Dot_Net" target="_blank">Passwort Verwalter Dot Net</a> (C#) Sehr komfortables Programm zur Verwaltung beliebiger sensibler Daten (Passwörter, Logins) incl. iTan-Listen u.v.m</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?C%23%3A_RegEx_Test" target="_blank">RegEx Test</a> (C#) Testen von regulären Ausdrücken cinl. Beispielen, Trefferanzeige, Gruppenanzeige etc.</li><li><a title="direkt zum Programm (neuer Tab)" href="http://software.marioschneider-online.de/?Delphi%3A_Text-Editor" target="_blank">Text-Editor</a> (Delphi) ermöglicht das Editieren von Texten nach vielen Kriterien</li></ul><br />Weiterhin sind auf der Website div. <a title="direkt zu: Code-Snippets (neuer Tab)" target="_blank" href="http://software.marioschneider-online.de/?Code-Snippets">Code-Snippets</a> sowie <a title="direkt zu: Beispielanwendungen (neuer Tab)" target="_blank" href="http://software.marioschneider-online.de/?Beispielanwendungen">Beispielanwendungen</a> zu div. Themen zu finden.<br /><br /><span style="font-size: 1.2em"><a target="_blank" href="http://software.marioschneider-online.de">software.marioschneider-online.de</a></span>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-49071745436675504212008-08-31T01:02:00.020+02:002008-08-31T01:34:08.615+02:00Windows: Dateien synchronisieren mit RoboCopyJeder kennt das: In der heutigen Zeit, in der (riesige) Festplatten verhältnismäßig billig sind, wird es immer schwieriger, wichtige Daten zu sichern. Die Rede ist von (automatischen) Backups.<br /><br />Seit Jahre verwende ich dafür das Programm <span style="font-weight:bold;">Total Commander</span>, dessen Synchronisationsfunktion wirklich sehr gut (d.h. sauber, schnell und zuverlässig) ist. Da ich mehrere Verzeichnisse synchronisieren muss (z.B. Eigene Dateien, Recovery-Ordner), muss ich jeweils das Quell- und Zielverzeichnis manuell auswählen, danach die Synchronisation starten usw.<br /><br />Das in Windows Vista integrierte Programm <span style="font-weight:bold;">RoboCopy</span>, welches mit den <span style="font-weight:bold;">Windows Server 2003 Resource Kit Tools</span> auch für andere Windows-Systeme erhältlich ist, bringt endlich eine Ablöse für das Problem.<br /><br />RoboCopy (Robust File Copy) ist ein Kommandozeilenprogramm, welches mit unzähligen Parametern genauestens konfiguriert werden kann. Es existiert auch eine grafische Oberfläche (von Microsoft) für das Programm: Robocopy GUI.<br /><br />Ich beziehe mich hier lediglich auf RoboCopy selbst. Dafür habe ich folgendes Script geschrieben. Startet man dieses Script, so werden 2 Verzeichnisse komplett synchronisiert (Mirror).<br /><br /><div class="mybordered"><pre>@echo off<br />echo Starte Sicherung...<br />set Quelle01="E:\Daten\Eigene Dateien"<br />set Ziel01="K:\Daten\Backups\Eigene Dateien"<br />set Quelle02="E:\Daten\Recovery"<br />set Ziel02="K:\Daten\Backups\Recovery"<br />set Logfile="c:\robo_log.txt"<br />c:<br />cd C:\Programme\Windows Resource Kits\Tools<br />echo.<br />echo Sicherung 1: Eigene Dateien<br />robocopy %Quelle01% %Ziel01% /MIR /R:10 /W:10 /V /XD ".svn"<br /> /XD "thumbs.db" /COPY:DAT /LOG:%Logfile% > NUL<br />echo Sicherung 1: Eigene Dateien - fertig<br />echo.<br />echo Sicherung 2: Recovery<br />robocopy %Quelle02% %Ziel02% /MIR /R:10 /W:10 /V /XD ".svn"<br /> /XD "thumbs.db" /COPY:DAT /LOG+:%Logfile% > NUL<br />echo Sicherung 2: Recovery - fertig<br />echo.<br />echo Sicherung abgeschlossen.<br />echo.<br />pause</pre></div><br /><br />Das Script im einzelnen, kurz erklärt:<br /><br />1. Anlegen von Variablen für die Quell- und Zielverzeichnisse sowie Log-Datei:<br /><div class="mybordered"><pre>set Quelle01="E:\Daten\Eigene Dateien"<br />set Ziel01="K:\Daten\Backups\Eigene Dateien"<br />set Quelle02="E:\Daten\Recovery"<br />set Ziel02="K:\Daten\Backups\Recovery"<br />set Logfile="c:\robo_log.txt"</pre></div><br />2. Navigation zum Verzeichnis, in dem sich robocopy.exe befindet (nicht nötig, sofern PATH-Variable von Windows angepasst):<br /><div class="mybordered"><pre>c:<br />cd C:\Programme\Windows Resource Kits\Tools</pre></div><br />3. Erstes Verzeichnis synchronisieren:<br /><div class="mybordered"><pre>robocopy %Quelle01% %Ziel01% /MIR /R:10 /W:10 /V /XD ".svn"<br /> /XD "thumbs.db" /COPY:DAT /LOG:%Logfile% > NUL</pre></div><br />4. Zweites Verzeichnis synchroniseren:<br /><div class="mybordered"><pre>robocopy %Quelle02% %Ziel02% /MIR /R:10 /W:10 /V /XD ".svn"<br /> /XD "thumbs.db" /COPY:DAT /LOG+:%Logfile% > NUL</pre></div><br /><br />Die Schalter kurz erklärt:<br /><div class="mybordered"><pre>/MIR - Mirror-Funktion (Löschen von Dat./Ordnern in Quelle im Ziel nachvollz.)<br />/R:10 /W:10 - [R] Mal erneut versuchen nach [W] Sekunden<br />/V - wortreiche Ausgabe<br />/XD ".svn" - Alle Verzeichnisse namens ".svn" nicht beachten<br />/XF "thumbs.db" - Alle Dateien namens "thumbs.db" nicht beachten<br />/COPY:DAT - Dateiinhalt, -Attribute und Zeitstempel kopieren<br />/LOG:%Logfile% - Logdatei erstellen (falls vorhanden: ersetzen)<br />/LOG+:%Logfile% - Logdatei erstellen (falls vorhanden: erweitern)<br />>> NUL - Bildschirmausgabe deaktivieren</pre></div><br /><br />Dieses Script kann als *.bat-Datei gespeichert werden und ist somit per Doppelklick ausführbar. Außerdem kann ein Windows-Task angelegt werden, um die Sicherung zu automatisieren.<br /><br /><div class="mybordered"><span style="text-decoration: underline">Weiterführende Links:</span><br /><ul><li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd" target="_blank">Download: Windows Server 2003 Resource Kit Tools</a></li><li><a href="http://en.wikipedia.org/wiki/Robocopy" target="_blank">Wikipedia: RoboCopy</a></li><li><a href="http://www.wintotal.de/Artikel/robocopy/robocopy.php" target="_blank">WinTotal-Artikel: Robocopy – Der Kopier-Gigant</a></li><li><a href="http://www.heise.de/software/download/special/backup_mit_robocopy/17_1" target="_blank">Heise-Artikel: Daten spiegeln mit Robocopy</a></li><li><a href="technet.microsoft.com/de-de/magazine/cc160891.aspx" target="_blank">Microsoft-Artikel: Robocopy GUI</a></li><li><a href="http://www.ghisler.com/deutsch.htm" target="_blank">Total Commander Website</a></li></ul></div>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com1tag:blogger.com,1999:blog-3390716455960041589.post-22264819549593628512008-07-31T21:22:00.002+02:002008-07-31T21:25:53.559+02:00Passwort Verwalter Dot Net - Version 1.2Der <span style="font-weight:bold;">Passwort Verwalter Dot Net</span> hat ein erneutes Update erhalten: <span style="font-weight:bold;">Version 1.2</span> bietet folgende neue Features:<br /><ul> <li>Bugfix: Aktivierung/Deaktivierung von Menüpunkten im Hauptmenü</li> <li>Bugfix: Programminterne Hilfe: Sprung zum jeweiligen Kapitel</li> <li>Bugfix: Suche: Markierung des Treffer-Feldes</li> <li>Bugfix: Verzögerung beim (1.) Anzeigen des Suchen-Dialogs</li> <li>Backupmanager hinzugefügt</li> <li>Datenfelder können nachträglich gelöscht werden (sofern keine Daten mehr in diesem Datenfeld vorhanden sind)</li> <li>Einträge können in andere Kategorien verschoben werden</li> <li>Feedbackdialog hinzugefügt</li> <li>Logindialog überarbeitet (Untersützung für Schlüsseldateien)</li> <li>Hauptfenster kann in der Größe (begrenzt) verändert werden</li> <li>Neues Tool "Notizblock" verfügbar</li> <li>Schlüsseldateien (Keyfiles) verfügbar (incl. 4 Sichermeitsmodi)</li> <li>Standard-Zufallspasswort kann konfiguriert werden</li> <li>Verwendete Datei kann per Drag & Drop in Start- sowie Loginform geändert werden</li> <li>Verzeichnis der aktuellen Datei kann im Explorer angezeigt werden (Haupfenster-Menüeintrag)</li></ul><br /><strong>Projekt-Homepage:</strong> <a target="_blank" href="http://www.pwvdotnet.org">www.pwvdotnet.org</a><br /><br /><strong>Direktdownload:</strong> <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1200_setup.exe">pwvdotnet_v1200_setup.exe</a> oder <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1200.zip">pwvdotnet_v1200.zip</a> (portable)Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-41923492563928961542008-07-30T20:50:00.004+02:002008-07-30T20:54:39.814+02:00Dot Net (C#): Screenshot von einem Control erzeugenFolgende zwei Methoden sind nötig, um einen Screenshot von einem Control zu erzeugen und diesen in eine Datei zu speichern:<br /><div class="mybordered"><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">static</span> Bitmap takeScreenshot(Control pControl)</pre><pre><span class="lnum"> 2: </span>{</pre><pre class="alt"><span class="lnum"> 3: </span> Bitmap bmp = <span class="kwrd">new</span> Bitmap(pControl.Width, pControl.Height);</pre><pre><span class="lnum"> 4: </span> pControl.DrawToBitmap(bmp, Rectangle.FromLTRB(0, 0, pControl.Width, pControl.Height));</pre><pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">return</span> bmp;</pre><pre><span class="lnum"> 6: </span>}</pre><pre class="alt"><span class="lnum"> 7: </span> </pre><pre><span class="lnum"> 8: </span><span class="kwrd">public</span> <span class="kwrd">static</span> Boolean saveScreenshotToFile(Control pControl, String pFilename)</pre><pre class="alt"><span class="lnum"> 9: </span>{</pre><pre><span class="lnum"> 10: </span> <span class="kwr">try</span></pre><pre class="alt"><span class="lnum"> 11: </span> {</pre><pre><span class="lnum"> 12: </span> takeScreenshot(pControl).Save(pFilename);</pre><pre class="alt"><span class="lnum"> 13: </span> <span class="kwrd">return</span> <span class="kwrd">true</span>;</pre><pre><span class="lnum"> 14: </span> }</pre><pre class="alt"><span class="lnum"> 15: </span> <span class="kwrd">catch</span> (Exception)</pre><pre><span class="lnum"> 16: </span> {</pre><pre class="alt"><span class="lnum"> 17: </span> <span class="kwrd">return</span> <span class="kwrd">false</span>;</pre><pre><span class="lnum"> 18: </span> }</pre><pre class="alt"><span class="lnum"> 19: </span>}</pre></div></div><br />Die erste Methode nimmt einen Screenshot auf und speichert diesen in einem Bitmap-Objekt. Die zweite Methode kann genutzt werden, um den Screenshot direkt in eine Datei zu speichern.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com1tag:blogger.com,1999:blog-3390716455960041589.post-22584723012285684252008-06-17T13:15:00.005+02:002008-06-17T13:21:34.629+02:00Dot Net (C#): Drag & DropDrop von Dateien / Ordnern:<br /><br />1. Vorbereitung:<br /><br />"AllowDrop"-Property setzen und 2 Events anmelden:<br /><br /><div class="mybordered"><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> MainForm()</pre><pre><span class="lnum"> 2: </span>{</pre><pre class="alt"><span class="lnum"> 3: </span> InitializeComponent();</pre><pre><span class="lnum"> 4: </span> <span class="kwrd">this</span>.textboxDir.AllowDrop = <span class="kwrd">true</span>;</pre><pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">this</span>.textboxDir.DragOver += <span class="kwrd">new</span> DragEventHandler(textboxDir_DragOver);</pre><pre><span class="lnum"> 6: </span> <span class="kwrd">this</span>.textboxDir.DragDrop += <span class="kwrd">new</span> DragEventHandler(textboxDir_DragDrop);</pre><pre class="alt"><span class="lnum"> 7: </span>}</pre></div></div><br /><br />2. Drag Over-Event:<br /><br />DataFormat überprüfen und DragDropEffects setzen:<br /><br /><div class="mybordered"><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">void</span> textboxDir_DragOver(<span class="kwrd">object</span> sender, DragEventArgs e)</pre><pre><span class="lnum"> 2: </span>{</pre><pre class="alt"><span class="lnum"> 3: </span> <span class="kwrd">if</span> (e.Data.GetDataPresent(DataFormats.FileDrop))</pre><pre><span class="lnum"> 4: </span> {</pre><pre class="alt"><span class="lnum"> 5: </span> e.Effect = DragDropEffects.Move;</pre><pre><span class="lnum"> 6: </span> }</pre><pre class="alt"><span class="lnum"> 7: </span>}</pre></div></div><br /><br />3. Drag-Drop-Event:<br /><br />Drop auswerten:<br /><br /><div class="mybordered"><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">void</span> textboxDir_DragDrop(<span class="kwrd">object</span> sender, DragEventArgs e)</pre><pre><span class="lnum"> 2: </span>{</pre><pre class="alt"><span class="lnum"> 3: </span> <span class="kwrd">if</span> (e.Effect == DragDropEffects.Move) <span class="rem">// if move</span></pre><pre><span class="lnum"> 4: </span> {</pre><pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">if</span> (e.Data.GetDataPresent(DataFormats.FileDrop)) <span class="rem">// if file drop</span></pre><pre><span class="lnum"> 6: </span> {</pre><pre class="alt"><span class="lnum"> 7: </span> <span class="kwrd">string</span>[] dirNames = (<span class="kwrd">string</span>[])e.Data.GetData(DataFormats.FileDrop);</pre><pre><span class="lnum"> 8: </span> <span class="kwrd">if</span> (dirNames.Length.Equals(1)) <span class="rem">// wenn genau eine datei</span></pre><pre class="alt"><span class="lnum"> 9: </span> {</pre><pre><span class="lnum"> 10: </span> <span class="kwrd">if</span> (MSUtils.FileUtil.dirExists(dirNames[0]))</pre><pre class="alt"><span class="lnum"> 11: </span> {</pre><pre><span class="lnum"> 12: </span> <span class="kwrd">this</span>.textboxDir.Text = dirNames[0];</pre><pre class="alt"><span class="lnum"> 13: </span> }</pre><pre><span class="lnum"> 14: </span> }</pre><pre class="alt"><span class="lnum"> 15: </span> }</pre><pre><span class="lnum"> 16: </span> }</pre><pre class="alt"><span class="lnum"> 17: </span>}</pre></div></div>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-22657010561775504432008-06-16T12:45:00.010+02:002008-06-16T13:13:41.509+02:00Opera 9.5 und öffentlicher ACID3-BuildDer <b>Opera-Browser</b> ist am <u>12.06.2008</u> in der <b>Version 9.5</b> erschienen. Diese Version bringt viele neue Features mit sich:<br /><ul><li>Extended-Validation-SSL-Zertifikate</li><li>Adressleiste mit besseren Vorschlägen für bereits besuchte Seiten</li><li>bessere Unterstützung von Web-Standards (JavaScript, CSS, SVG, MathML)</li><li>Opera-Link (Synchronisation von Bookmarks und Co.)</li><li>neues Skin (altes Skin aber noch verfügbar)</li><li>schnellerer Seitenaufbau</li><li>weiches Scrollen</li><li>neue Entwicklerwerkzeuge</li></ul>Opera 9.5 kann in mehr als 25 Sprachen hier heruntergeladen werden: <a target="_blank" href="http://www.opera.com/download/">http://www.opera.com/download/</a><br /><br /><center><a href="http://www.marioschneider-online.de/blog/opera95screenshot_thumb.png" target="_blank"><img src="http://www.marioschneider-online.de/blog/opera95screenshot_thumb.png" /></a></center><br /><br />Im ACID3-Test schafft diese Version ca. 85 Punkte. Ein öffentlicher Build, der <b>100 Punkte im ACID3-Test</b> schafft, ist hier zu finden: <a target="_blank" href="http://labs.opera.com/news/2008/03/28/">http://labs.opera.com/news/2008/03/28/</a><br /><br />Ich habe mich an einen kleinen <b>Browservergleich</b> gewagt, was die (Lade-)Geschwindigkeit angeht. Dabei habe ich Internet Explorer in den Versionen 6 sowie 7, Firefox in den Versionen 2.0 und 3.0 (RC3) sowie Opera in den Versionen 9.27 und 9.5 verwendet.<br /><br />Das Ergebnis:<br /><center> <table width="520"><tr><td><br /><a href="http://www.marioschneider-online.de/blog/speedtest_6browser_teil1.png" target="_blank"><img src="http://www.marioschneider-online.de/blog/speedtest_6browser_teil1_thumb.png" /></a></td></tr><tr><td><br /><a href="http://www.marioschneider-online.de/blog/speedtest_6browser_teil2.png" target="_blank"><img src="http://www.marioschneider-online.de/blog/speedtest_6browser_teil2_thumb.png" /></a></td></tr></table></center><br /><br />Dabei lädt Opera in der Version 9.5 die 8 ausgewählten Webseiten in 75 Sekunden (gegenüber 101s IE7 und 93s Firefox 3). Der Test berücksichtigt das Neuladen einer Webseite sowie das Laden derselben aus dem Cache. Dabei war Opera 9.5 in keinem einzigen Fall der langsamste Browser.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-21475908892107267962008-04-08T23:21:00.013+02:002008-07-30T20:55:13.536+02:00Dot Net (C#): Invoke()-Methode für MultiThread-Applikationen mit WindowsFormsUm ein <b>Control</b> auf einer WindowsForms von einem anderen <b>Thread</b> aus zu verändern, muss die <b>Invoke()-Methode</b> der Form oder des Controls verwendet werden. <u>Ein Control darf nur von dem Thread geändert werden, von dem es erzeugt wurde!</u><br /><br />Folgendes Minimal-Beispiel (<i>unvollständig</i>) zeigt einen Anwendungsfall, in dem ein Thread seinen Status an eine Form berichtet:<br /><br />Die Klasse <b>MathClass</b> erzeugt <b>Thread</b>-Objekte, deren Methode <b>CalcBackground()</b> in einem Thread ausgefürt wird.Aus dieser Methode heraus soll die GUI über den aktuellen <b>Thread-Status</b> informiert werden:<br /><div class="mybordered"><!-- code formatted by http://manoli.net/csharpformat/ --><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span> </pre><pre><span class="lnum"> 2: </span> <span class="kwrd">public</span> <span class="kwrd">class</span> MathClass</pre><pre class="alt"><span class="lnum"> 3: </span> {</pre><pre><span class="lnum"> 4: </span> </pre><pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">private</span> MainForm myForm;</pre><pre><span class="lnum"> 6: </span> <span class="kwrd">private</span> <span class="kwrd">int</span> iNumber;</pre><pre class="alt"><span class="lnum"> 7: </span> </pre><pre><span class="lnum"> 8: </span> <span class="kwrd">public</span> Thread Initialize(MainForm myform, <span class="kwrd">int</span> number)</pre><pre class="alt"><span class="lnum"> 9: </span> {</pre><pre><span class="lnum"> 10: </span> <span class="kwrd">this</span>.myForm = myform;</pre><pre class="alt"><span class="lnum"> 11: </span> <span class="kwrd">this</span>.iNumber = number;</pre><pre><span class="lnum"> 12: </span> <span class="kwrd">return</span> <span class="kwrd">new</span> Thread(<span class="kwrd">new</span> ThreadStart(<span class="kwrd">this</span>.CalcBackground));</pre><pre class="alt"><span class="lnum"> 13: </span> }</pre><pre><span class="lnum"> 14: </span> </pre><pre class="alt"><span class="lnum"> 15: </span> <span class="kwrd">delegate</span> <span class="kwrd">void</span> UpdateUI(<span class="kwrd">int</span> number, <span class="kwrd">int</span> state);</pre><pre><span class="lnum"> 16: </span> <span class="kwrd">delegate</span> <span class="kwrd">void</span> Finish(<span class="kwrd">int</span> number);</pre><pre class="alt"><span class="lnum"> 17: </span> </pre><pre><span class="lnum"> 18: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> CalcBackground()</pre><pre class="alt"><span class="lnum"> 19: </span> {</pre><pre><span class="lnum"> 20: </span> UpdateUI updateUI = <span class="kwrd">new</span> UpdateUI(<span class="kwrd">this</span>.myForm.updateUIProc);</pre><pre class="alt"><span class="lnum"> 21: </span> Finish finish = <span class="kwrd">new</span> Finish(<span class="kwrd">this</span>.myForm.FinishThread);</pre><pre><span class="lnum"> 22: </span> </pre><pre class="alt"><span class="lnum"> 23: </span> <span class="kwrd">try</span></pre><pre><span class="lnum"> 24: </span> {</pre><pre class="alt"><span class="lnum"> 25: </span> <span class="rem">// do something</span></pre><pre><span class="lnum"> 26: </span> <span class="rem">// ...</span></pre><pre class="alt"><span class="lnum"> 27: </span> <span class="rem">// report status to form:</span></pre><pre><span class="lnum"> 28: </span> <span class="kwrd">object</span>[] param = <span class="kwrd">new</span> <span class="kwrd">object</span>[2] { <span class="kwrd">this</span>.iNumber, i };</pre><pre class="alt"><span class="lnum"> 29: </span> myForm.Invoke(updateUI, param); <span class="rem">// call myForm.updateUIProc(iNumber, i)</span></pre><pre><span class="lnum"> 30: </span> }</pre><pre class="alt"><span class="lnum"> 31: </span> <span class="kwrd">catch</span> (ThreadAbortException)</pre><pre><span class="lnum"> 32: </span> {</pre><pre class="alt"><span class="lnum"> 33: </span> <span class="rem">// clean up</span></pre><pre><span class="lnum"> 34: </span> }</pre><pre class="alt"><span class="lnum"> 35: </span> <span class="kwrd">catch</span> (Exception)</pre><pre><span class="lnum"> 36: </span> {</pre><pre class="alt"><span class="lnum"> 37: </span> <span class="rem">// catch any other exception</span></pre><pre><span class="lnum"> 38: </span> }</pre><pre class="alt"><span class="lnum"> 39: </span> <span class="kwrd">finally</span></pre><pre><span class="lnum"> 40: </span> {</pre><pre class="alt"><span class="lnum"> 41: </span> <span class="kwrd">try</span></pre><pre><span class="lnum"> 42: </span> {</pre><pre class="alt"><span class="lnum"> 43: </span> <span class="rem">// call myForm.FinishThread(iNumber)</span></pre><pre><span class="lnum"> 44: </span> myForm.Invoke(finish, <span class="kwrd">new</span> <span class="kwrd">object</span>[] { <span class="kwrd">this</span>.iNumber }); </pre><pre class="alt"><span class="lnum"> 45: </span> }</pre><pre><span class="lnum"> 46: </span> <span class="kwrd">catch</span> (ObjectDisposedException e)</pre><pre class="alt"><span class="lnum"> 47: </span> {</pre><pre><span class="lnum"> 48: </span> }</pre><pre class="alt"><span class="lnum"> 49: </span> <span class="kwrd">catch</span> (Exception ee)</pre><pre><span class="lnum"> 50: </span> {</pre><pre class="alt"><span class="lnum"> 51: </span> }</pre><pre><span class="lnum"> 52: </span> }</pre><pre class="alt"><span class="lnum"> 53: </span> }</pre><pre><span class="lnum"> 54: </span> </pre><pre class="alt"><span class="lnum"> 55: </span> }</pre></div></div><br />Die Mainform erzeugt in der Methode startThreads() zwei neue Threads. Die Methoden <b>updateUIProc()</b> sowie <b>FinishThread()</b> werden per Invoke()-Methode von Thread aus gestartet und laufen selbst <u>im Thread der Mainform</u>:<br /><div class="mybordered"><!-- code formatted by http://manoli.net/csharpformat/ --><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span> <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> MainForm : Form</pre><pre><span class="lnum"> 2: </span> {</pre><pre class="alt"><span class="lnum"> 3: </span> </pre><pre><span class="lnum"> 4: </span> <span class="kwrd">public</span> MainForm()</pre><pre class="alt"><span class="lnum"> 5: </span> {</pre><pre><span class="lnum"> 6: </span> InitializeComponent();</pre><pre class="alt"><span class="lnum"> 7: </span> }</pre><pre><span class="lnum"> 8: </span> </pre><pre class="alt"><span class="lnum"> 9: </span> <span class="kwrd">private</span> <span class="kwrd">void</span> Form1_FormClosing(<span class="kwrd">object</span> sender, FormClosingEventArgs e)</pre><pre><span class="lnum"> 10: </span> {</pre><pre class="alt"><span class="lnum"> 11: </span> <span class="rem">// kill threads before form closes</span></pre><pre><span class="lnum"> 12: </span> <span class="kwrd">if</span> (anyThreadAlive)</pre><pre class="alt"><span class="lnum"> 13: </span> {</pre><pre><span class="lnum"> 14: </span> killThreads();</pre><pre class="alt"><span class="lnum"> 15: </span> }</pre><pre><span class="lnum"> 16: </span> }</pre><pre class="alt"><span class="lnum"> 17: </span> </pre><pre><span class="lnum"> 18: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> updateUIProc(<span class="kwrd">int</span> number, <span class="kwrd">int</span> val)</pre><pre class="alt"><span class="lnum"> 19: </span> {</pre><pre><span class="lnum"> 20: </span> <span class="kwrd">this</span>.textBox1.AppendText(</pre><pre class="alt"><span class="lnum"> 21: </span> <span class="kwrd">string</span>.Format(<span class="str">"thread {0} has done {1} % of its job"</span>, number, val));</pre><pre><span class="lnum"> 22: </span> }</pre><pre class="alt"><span class="lnum"> 23: </span> </pre><pre><span class="lnum"> 24: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> FinishThread(<span class="kwrd">int</span> number)</pre><pre class="alt"><span class="lnum"> 25: </span> {</pre><pre><span class="lnum"> 26: </span> <span class="kwrd">this</span>.textBox1.AppendText(</pre><pre class="alt"><span class="lnum"> 27: </span> <span class="kwrd">string</span>.Format(<span class="str">"thread {0} has finished"</span>, number));</pre><pre><span class="lnum"> 28: </span> }</pre><pre class="alt"><span class="lnum"> 29: </span> </pre><pre><span class="lnum"> 30: </span> <span class="kwrd">private</span> <span class="kwrd">void</span> startThreads()</pre><pre class="alt"><span class="lnum"> 31: </span> {</pre><pre><span class="lnum"> 32: </span> Thread th1 = <span class="kwrd">new</span> MathClass().Initialize(<span class="kwrd">this</span>, 0);</pre><pre class="alt"><span class="lnum"> 33: </span> Thread th2 = <span class="kwrd">new</span> MathClass().Initialize(<span class="kwrd">this</span>, 1);</pre><pre><span class="lnum"> 34: </span> th1.Start();</pre><pre class="alt"><span class="lnum"> 35: </span> th2.Start();</pre><pre><span class="lnum"> 36: </span> }</pre><pre class="alt"><span class="lnum"> 37: </span> }</pre></div></div><br />Es ist nicht erlaubt, das Control <b>Mainform.textBox1</b> direkt aus dem Thread zu verändern.<u><b>Ein Control darf nur von dem Thread verändert werden, von dem es erstellt wurde.</b></u>Um trotzdem ein Control aus einem Thread heraus zu verändern, benutzt man die Methode <b>Invoke()</b> und übergibt dieser ein <b>delegate</b> (Funktionszeiger) sowie ein Parameterarray. Die eigentliche Methode (z.B. updateUIProc() oder FinishThread()) läuft anschließend (in diesem Fall) im Thread der MainForm. Dies hat ebenfalls zur Folge, dass keine der beiden Funktionen parallel mehrmals ausgeführt werden kann.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-24538365202552992672008-04-03T12:15:00.003+02:002008-07-30T20:55:27.218+02:00Dot Net (C#): SearchOption.AllDirectories für GetDirectories()Die Methode <b>GetDirectories()</b> der Klasse <u>DirectoryInfo</u> liefert alle zu einem Suchpattern passenden Verzeichnisse. Dabei liefert der Aufruf<br /><div class="mybordered"><pre class="csharpcode">dir.GetDirectories(<span class="str">"Release*"</span>)</pre></div><br />beispielsweise alle Verzeichnisse, die mit "<i>Release</i>" beginnen. Um dies für alle Unterverzeichnisse nicht rekursiv programmieren zu müssen, gibt es die Möglichkeit, die GetDirectoties()-Methode mit einem weiteren Parameter zu füttern:<br /><br /><div class="mybordered"><pre class="csharpcode">dir.GetDirectories(<span class="str">"Release*"</span>, SearchOption.AllDirectories)</pre></div><br />Bei diesem Aufruf werden automatisch alle Unterverzeichnisse abgesucht. Dies erspart einem das rekursive Aufrufen von Methoden, was den Code wesentlich kürzer macht.<br /><br />Genauso verhält es sich mit der Methode <b>GetFiles()</b>.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-17268633474446956662008-04-03T00:47:00.010+02:002008-04-03T01:42:52.320+02:00Visual Studio: Methoden nachträglich generierenSeit dem <b>Visual Studio 2008</b> kann man Methoden nachträglich automatisch generieren lassen. Nehmen wir an, wir wollen (später) die folgende Methode generieren:<br /><div class="mybordered"><pre class="csharpcode">processDir(listFiles, <span class="kwrd">this</span>._strPath, pattern);</pre></div><br />Nun schreibt man diese Methode einfach als Aufruf hin, obwohl diese noch nicht existiert. Ein anschließender Rechtsklick auf den Methodennamen sowie ein Klick auf den Eintrag "Generate Method Stub" erzeugt die angegebene Methode incl. der vorgegebenen Signatur in der aktuellen Klasse.<br /><br /><center><table width="450"><tr><td><div class="mybordered"><a href="http://www.marioschneider-online.de/blog/vs08_generate-method-stub.png" target="_blank"><img src="http://www.marioschneider-online.de/blog/vs08_generate-method-stub_thumb.png" /></a><br /><i>Anklicken für Vollansicht</i></div></td></tr></table></center><br />Es wird folgende Methode generiert:<br /><div class="mybordered"><pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">void</span> processDir(List<<span class="kwrd">string</span>> listFiles, <span class="kwrd">string</span> p, <span class="kwrd">string</span> pattern)<br />{<br /> <span class="kwrd">throw</span> <span class="kwrd">new</span> NotImplementedException();<br />}</pre></div><br />Die erzeugte Methode ist <b>private</b>, evtl. <u>Rückgabewerte</u> werden ebenfalls angelegt.<br /><br />Dies ermöglicht einem, den Code für einen Anwendungsfall vollständig zu schreiben, ohne zwischendurch wegen anderen Methoden, die man später implementieren will, unterbrochen zu werden.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-37810142421953430522008-03-27T16:19:00.003+01:002008-03-27T16:27:27.444+01:00Race Driver Grid - Ingame VideoZum kommenden Rennspiel "Race Driver Grid" gibt es neben dem offiziellen (Render-)Trailer nun endlich einen "actual gameplay footage" mit Ingame-Szenen:<br /><center> <table width="520"> <tr> <td> <a href="http://www.gametrailers.com/player/32013.html" target="_blank"> <img srC="http://www.marioschneider-online.de/blog/race_driver_grid/grid_smashing_trailer_thumb.png" /> <br /> actual gameplay footage (ingame-graphics) </a> </td> <td> <a href="http://www.gametrailers.com/player/30610.html" target="_blank"> <img srC="http://www.marioschneider-online.de/blog/race_driver_grid/grid_world_trailer_thumb.png" /> <br /> world trailer (rendered) </a> </td> </tr> </table></center><br />Projekt-Homepage: <a href="http://www.codemasters.de/grid" target="_blank">www.codemasters.de/grid</a>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-91666730905752707202008-03-12T23:15:00.003+01:002008-03-14T13:42:46.151+01:00Passwort Verwalter Dot Net - Version 1.1.3Der <span style="font-weight:bold;">Passwort Verwalter Dot Net</span> hat ein erneutes Update erhalten: <span style="font-weight:bold;">Version 1.1.3</span> bietet folgende neue Features:<br /><ul> <li>FTP-Download:</li> <ul> <li>Änderungsdatum der Datei korrigiert</li> <li>Zugriffsdatum der Datei korrigiert</li> <li>Erstellungsdatum der Datei korrigiert</li> </ul> <li>HTML-Export:</li> <ul> <li>Nachricht "Bitte warten" wird angezeigt, während der Report generiert wird</li> <li>Statistikberechnung wird nur noch für ausgewählte Kategorien durchgeführt</li> </ul> <li>Markierung von Eingabefeldern (gelbe Hervorhebung) kann deaktiviert werden</li> <li>neue Engine zur Berechnung der Passwort-Sicherheit</li> <li>neue Engine zur Erzeugung von Passwörtern</li> <li>neuer Evaluierungs-Dailog für Passwörter</li> <li>Passwort Generierung: Eigenschaften des Passworts per Kontextmenü wählbar (Länge, Zahlen, Sonderzeichen)</li> <li>Statistik: "Bitte warten" Nachricht wird angezeigt, während die Statistik berechnet wird</li> <li>Statistik und HTML-Export zeigen 3-spaltige Passwort-Sicherheit (Punkte, Prozent, Wort) an</li></ul><br /><strong>Projekt-Homepage:</strong> <a target="_blank" href="http://pwvdotnet.6x.to">http://pwvdotnet.6x.to</a><br /><br /><strong>Direktdownload:</strong> <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1130_setup.exe">pwvdotnet_v1130_setup.exe</a> oder <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1130.zip">pwvdotnet_v1130.zip</a>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-72001284051920741972008-03-12T23:11:00.004+01:002008-03-12T23:22:26.227+01:00Worldshift - Screenshots und Open BetaZum Echtzeit-Strategie Worldshift, das voraussichtlich Ende 2008 erscheint, sind zahlreiche Screenshots sowie eine offene Beta erscheinen. Mit einem kostenlosen Account bei Fileplanet (oder 3DGames) kann man sich den Beta-Client herunterladen. Anschließend sind 2 Update-Versionen nötig, die das Spiel selbst beim Starten nachlädt. Es wird ebenfalls ein (kostenloser) GameSpy-Account benötigt.<br /><br />Der kostenlose Beta-Client steht bei <a target="_blank" href="http://www.fileplanet.com/promotions/worldshift">FilePlanet zum Download</a> bereit<br /><br />Screenshots:<br /><center><table width="520"><tr><td><a target="_blank" href="http://www.worldshift-game.com/images/gallery/XRSLTB/ws_2.jpg"><img src="http://www.marioschneider-online.de/blog/worldshift/ws_2.jpg" /></a></td><td><a target="_blank" href="http://www.worldshift-game.com/images/gallery/XRSLTB/wsoctober7.jpg"><img src="http://www.marioschneider-online.de/blog/worldshift/wsoctober7.jpg" /></a></td></tr><tr><td><a target="_blank" href="http://www.worldshift-game.com/images/gallery/XRSLTB/wsoctober2.JPG"><img src="http://www.marioschneider-online.de/blog/worldshift/wsoctober2.jpg" /></a></td><td><a target="_blank" href="http://www.worldshift-game.com/images/gallery/XRSLTB/worldshift-shot37.jpg"><img src="http://www.marioschneider-online.de/blog/worldshift/worldshift-shot37.jpg" /></a></td></tr><tr><td colspan="2">Anklicken zum Vergrößern</td></tr></table></center><br />Informationen sowie weitere Screenshots findet ihr auf <a target="_blank" href="http://worldshift-game.com/">worldshift-game.com</a> bzw. <a target="_blank" href="http://www.worldshift.de/">worldshift.de</a>.Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-28750807296306109562008-03-12T22:53:00.008+01:002008-03-12T23:22:38.387+01:00lolcats - lol cats ;)watch, make and save "lolcats" at <a target="_blank" href="http://icanhascheezburger.com/">icanhascheezburger.com</a>:<br /><br /><center><table width="670"><tr><td><a target="_blank" href="http://icanhascheezburger.files.wordpress.com/2007/12/funny-pictures-kitten-printer.jpg"><img src="http://www.marioschneider-online.de/blog/lolcats/funny-pictures-kitten-printer.jpg" /></a></td><td><a target="_blank" href="http://icanhascheezburger.files.wordpress.com/2007/12/funny-picture-goodbye-cruel-world.jpg"><img src="http://www.marioschneider-online.de/blog/lolcats/funny-picture-goodbye-cruel-world.jpg" /></a></td></tr><tr><td><a target="_blank" href="http://icanhascheezburger.files.wordpress.com/2007/12/funny-pictures-no-shoes-cat.jpg"><img src="http://www.marioschneider-online.de/blog/lolcats/funny-pictures-no-shoes-cat.jpg" /></a></td><td><a target="_blank" href="http://icanhascheezburger.files.wordpress.com/2008/03/funny-pictures-cat-plays-with-icicles.jpg"><img src="http://www.marioschneider-online.de/blog/lolcats/funny-pictures-cat-plays-with-icicles.jpg" /></a></td></tr><tr><td colspan="2"><center>click to enlarge</center></td></table></center>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-32857034122812011082008-02-28T13:11:00.006+01:002008-03-01T14:07:06.356+01:00Passwort Verwalter Dot Net - Version 1.1.2Der <span style="font-weight:bold;">Passwort Verwalter Dot Net</span> hat ein erneutes Update erhalten: <span style="font-weight:bold;">Version 1.1.2</span> bietet folgende neue Features:<br /><ul><li>Datensatz kann einzeln als Textdatei extrahiert werden</li><li>"Daten speichern"-Button im Hauptfenster ermöglicht nun ebenfalls das Verwerfen der Änderungen</li><li>Eingabefelder werden dezent gelb hervorgehoben</li><li>FTP-Zugriff:</li><ul><li>Aktivierung und Deaktivierung des automatischen Uploads von der Toolbar aus</li><li>Fortschrittsanzeige für FTP-Upload und -Download</li><li>Programm beendet sich, wenn bei der heruntergeladenen Datei das Passwort geändert wurde<li></ul><li>horizontale Scrollbar für Eintragsliste</li><li>sicherer Passwort-Eingabe-Dialog für Schutz vor Keyloggern</li><li>Hilfe-Fenster kann minimiert und maximiert werden</li><li>HTML-Export: zu exportierende Kategorien auswählbar</li><li>HTML-Export: Zeichen "<", ">" und "&" werden nun korrekt dargestellt</li><li>Kompaktansicht hinzugefügt (Minimierung der Ansicht auf das Datenfeld)</li><ul><li>enthält nur relevante Datenfelder</li><li>kann in einer beliebigen Bildschirmecke positioniert werden</li><li>kann mit der Maus verschoben werden</li></ul><li>TAN-Verwaltung:</li><ul><li>TAN-Listen sind alphabetisch sortiert</li><li>es kann nur noch eine TAN-Nummer gleichzeitig selektiert werden</li><li>Upload der Datei erfolgt nicht mehr, wenn die Änderung verworfen werden</li></ul></ul><br /><strong>Projekt-Homepage:</strong> <a target="_blank" href="http://pwvdotnet.6x.to">http://pwvdotnet.6x.to</a><br /><br /><strong>Direktdownload:</strong> <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1120_setup.exe">pwvdotnet_v1120_setup.exe</a> oder <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1120.zip">pwvdotnet_v1120.zip</a>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-64546175332755532472008-02-27T20:08:00.009+01:002008-07-30T20:55:44.314+02:00Dot Net (C#): List.ForEach() MethodeVerwenden der ForEach()-Methode einer Generic-List:<br /><br /><div class="mybordered"><pre class="csharpcode"><span class="kwrd">static</span> <span class="kwrd">void</span> Main()<br /> {<br /> List<String> names = <span class="kwrd">new</span> List<String>();<br /> names.Add(<span class="str">"Bruce"</span>);<br /> names.Add(<span class="str">"Alfred"</span>);<br /> names.Add(<span class="str">"Tim"</span>);<br /> names.Add(<span class="str">"Richard"</span>);<br /><br /> <span class="rem">// Display the contents of the list using the Print method.</span><br /> names.ForEach(Print);<br /><br /> <span class="rem">// The following demonstrates the anonymous method feature of C#</span><br /> <span class="rem">// to display the contents of the list to the console.</span><br /> names.ForEach(<span class="kwrd">delegate</span>(String name)<br /> {<br /> Console.WriteLine(name);<br /> });<br /> }<br /><br /> <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Print(<span class="kwrd">string</span> s)<br /> {<br /> Console.WriteLine(s);<br /> }</pre></div><br /><br />Generisch als Erweiterungsmethode für IEnumerable<T>:<br /><div class="mybordered"><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">class</span> IEnumerableExtension<br />{<br /> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintItem<T>(<span class="kwrd">this</span> T item)<br /> {<br /> Console.WriteLine(item.ToString());<br /> }<br /><br /> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintAllItems<T>(<span class="kwrd">this</span> IEnumerable<T> enumerable)<br /> {<br /> <span class="kwrd">foreach</span> (T item <span class="kwrd">in</span> enumerable)<br /> {<br /> PrintItem(item);<br /> }<br /> }<br />}</pre></div>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com3tag:blogger.com,1999:blog-3390716455960041589.post-31359440012304203922008-02-19T21:24:00.002+01:002008-02-19T21:26:14.534+01:00C# Code für HTML formatierenManoli.net bietet eine einfache Oberfläche, um beliebigen C#-Code für die Verwendung in HTML (also Blogs, Webseiten etc.) zu formatieren:<br /><br /><a href="http://www.manoli.net/csharpformat/" target="_blank">www.manoli.net/csharpformat/</a>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-77876153446757327462008-02-07T16:43:00.001+01:002008-02-07T16:59:49.601+01:00Passwort Verwalter Dot Net - Version 1.1.1Der <strong>Passwort Verwalter Dot Net</strong> hat ein erneutes Update erhalten:<strong> Version 1.1.1</strong> bietet folgende neue Features:<br /><ul><li>TAN-Verwaltung incl. <strong>iTAN</strong>-Verfahren</li><li>Export der Datei ins <strong>HTML</strong>-Format</li><li>Programm ist <strong>Freeware</strong> (kostenlos)</li></ul><br /><strong>Screenshots:</strong><center><table width="550"><tr><td>Hauptfenster:<br /><a target="_blank" href="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_haupt.png"><img src="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_haupt_tn.png" /></a></td><td><br />Kategorie erstellen<br />(völlig freie Konfiguration):<br /><a target="_blank" href="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_category.png"><img src="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_category_tn.png" /></a></td></tr><tr><td><br />iTAN-Verwaltung:<br /><a target="_blank" href="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_tan.png"><img src="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_tan_tn.png" /></a></td><td><br />Statistik:<br /><a target="_blank" href="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_stat.png"><img src="http://www.icswin2k.de/pwvdotnet/cms/images/screenshots/scr_stat_tn.png" /></a><br /></td></tr></table><br /><span style="font-size: 0.9em">(Klick auf ein Bild, um es zu vergrößern)</span></center><br /><br />Weitere Features des Passwort Verwalter Dot Net:<br /><ul><li>Gruppierung der Einträge in <b>frei konfigurierbare</b> Kategorien </li><li><b>256 Bit AES-Verschlüsselung</b> für eine hohe Sicherheit der Daten</li><li>Sortieren nach Name, Zeitpunkt "hinzugefügt" oder Zeitpunkt "letzte Änderung"</li><li>Enthält einen <b>Passwortgenerator</b> zur Erstellung sicherer Passwörter auf Knopfdruck</li><li>Benutzer bestimmt, welche Daten sensibel sind und nicht als Klartext angezeigt werden</li><li>Anzeige sensibler Daten als Klartext per Tastenkombination oder Klick jederzeit möglich</li><li>Schelles Kopieren von Benutzernamen, Passwörtern etc. in die <b>Zwischenablage</b></li><li>Automatisches Löschen sensibler Daten aus der Zwischenablage nach 5-20 Sekunden</li><li>Detailinformationen über <b>Passwortsicherheit</b>(Sicherheitslevel, Verbesserungsvorschläge)</li><li>Anzeige der Sicherheitsstufen von Passwörtern (incl. Verbesserungsvorschlägen)</li><li>Ausführliche <b>Statistik</b> (Anzahl der Passwörteraller Kategorien, Sicherheitseinstufung von Passwörtern)</li><li>Komfortable <b>Updatefunktionalität</b> (auf Wunsch automatisch bei jedem Programmstart)</li><li><b>FTP-Upload und -Download</b> zum Abgleich der Daten auf mehreren Rechnern</li><li>Minimierung des Programms in den <b>Systemtray</b> oder Taskleiste</li><li>Komfortable <b>Suchfunktion mit Ergebnis-Hervorhebung</b></li></ul><br /><br /><strong>Projekt-Homepage:</strong> <a target="_blank" href="http://pwvdotnet.6x.to">http://pwvdotnet.6x.to</a><br /><br /><strong>Direktdownload:</strong> <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1110_setup.exe">pwvdotnet_v1110_setup.exe</a> oder <a href="http://www.icswin2k.de/pwvdotnet/cms/downloads/pwvdotnet_v1110.zip">pwvdotnet_v1110.zip</a>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com1tag:blogger.com,1999:blog-3390716455960041589.post-51268747707814832352008-02-04T18:29:00.001+01:002008-07-30T20:55:56.395+02:00Dot Net (C#): Serialisieren (binär)Serialisierung von Objekten in C# (binär):<br /><br />Namespace: <span style="font-weight:bold;">System.Runtime.Serialization.Formatters.Binary</span><br /><div class="mybordered"><pre class="csharpcode"><span class="rem">/* zwei Objekt der zu serilisierenden Klasse anlegen */</span><br />objectKlasse object1b = <span class="kwrd">new</span> objectKlasse(10, <span class="str">"Hallo"</span>);<br />objectKlasse object2b = <span class="kwrd">new</span> objectKlasse(11, <span class="str">"Welt"</span>);<br /><br /><span class="rem">/* binary formatter anlegen */</span><br />BinaryFormatter binForm = <span class="kwrd">new</span> BinaryFormatter();<br /><br /><span class="rem">/* beide Objekte serialisiert nach C:\text.txt schreiben */</span><br /><span class="kwrd">using</span> (FileStream fs = <span class="kwrd">new</span> FileStream(<span class="str">"C:\\test.txt"</span>, FileMode.Create))<br />{<br /> binForm.Serialize(fs, object1b);<br /> binForm.Serialize(fs, object2b);<br />}<br /><br /><span class="rem">/* zwei neue Objekte anlegen */</span><br />objectKlasse object11b = <span class="kwrd">null</span>;<br />objectKlasse object22b = <span class="kwrd">null</span>;<br /><br /><span class="rem">/* beide Objekte deserialisieren */</span><br /><span class="kwrd">using</span> (FileStream fs = <span class="kwrd">new</span> FileStream(<span class="str">"C:\\test.txt"</span>, FileMode.Open))<br />{<br /> object11b = (objectKlasse)binForm.Deserialize(fs);<br /> object22b = (objectKlasse)binForm.Deserialize(fs);<br />}<br /><br /><span class="rem">/* deserialisierte Objektdaten ausgeben */</span><br />Console.WriteLine(<span class="str">"Zahl: {0} , Wort: {1}"</span>, object11b.integer1, object11b.string1);<br />Console.WriteLine(<span class="str">"Zahl: {0} , Wort: {1}"</span>, object22b.integer1, object22b.string1);<br /></pre></div><br />Alternativ:<br />XML-Serialisierung mit <span style="font-weight:bold;">SoapFormatter</span> aus dem Namespace System.Runtime.Serialization.Formatters.SoapMario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-3530238596116196582008-01-21T20:21:00.000+01:002008-01-21T23:03:47.057+01:00Windows-Tasten auf dem NotebookFür einige Anwendungsfälle ist es sehr praktisch, die Windows-Tasten auf einem Notebook benutzen zu können. Viele Notebooks haben diese Tasten aus platzgründen nicht, mit einigen Tricks lassen sie sich aber leicht auf andere Tasten legen oder per Tastenkombination verwenden.<br /><br /><strong>1. Tastenkombinationen:</strong><br /><div class="mybordered"><strong>[STRG]</strong> + <strong>[ESC]</strong> = linke Windows-Taste<br /><strong>[SHIFT]</strong> + <strong>[F10]</strong> = rechte Windows-Taste</div><br /><br /><strong>2. Tool Remap Key verwenden</strong><br /><div class="mybordered">Remapkey ist ein kleines Tool, das unter allen Windows-Versionen (ab NT-Basis) läuft und ein einfaches remappen der Tastatur erlaubt. In diesem Fall ist die rechte Windows-Taste über die rechte Steuerungs-Taste erreichbar.<br /><strong>Download:</strong> <a href="http://www.marioschneider-online.de/blog/remapkey.rar">remapkey.rar</a><br /><strong>Screenshot:</strong><br /> <a target="_blank" href="http://www.marioschneider-online.de/blog/remapkey_screenshot.png"><img src="http://www.marioschneider-online.de/blog/t_remapkey_screenshot.png"></a></div><br /><br /><strong>3. Tool SharpKeys</strong><br /><div class="mybordered">Sharpkeys ermöglicht es, unabhängig vom Tastaturlayouts, die Tastencodes zu ändern. Somit lassen sich sogar Sondertasten (Mediatasten, Zusatztasten, Kopieren, ...) auf real vorhandene Tasten umleiten.<br /><strong>Webseite:</strong> <a target="_blank" href="http://www.randyrants.com/sharpkeys/">www.randyrants.com/sharpkeys/</a><br /><strong>Screenshots:</strong><br /> <a target="_blank" href="http://www.marioschneider-online.de/blog/sharpkeys_1.png"><img src="http://www.marioschneider-online.de/blog/t_sharpkeys_1.png"></a> <a target="_blank" href="http://www.marioschneider-online.de/blog/sharpkeys_2.png"><img src="http://www.marioschneider-online.de/blog/t_sharpkeys_2.png"></a></div>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0tag:blogger.com,1999:blog-3390716455960041589.post-14590619541644908872008-01-21T20:15:00.001+01:002008-07-30T20:56:02.576+02:00Dot Net (C#): Dauer ermitteln mit StopwatchDie Klasse <span style="font-weight:bold;">Stopwatch</span> aus dem Namespace <span style="font-weight:bold;">System.Diagnostics</span> ermöglicht es, Zeiten genau zu stoppen:<br /><div class="mybordered"><pre class="csharpcode">Stopwatch sw = <span class="kwrd">new</span> Stopwatch();<br />sw.Start();<br /><span class="rem">/* do your work */</span><br />sw.Stop();<br /><span class="kwrd">this</span>.labelTime.Text =<br /> <span class="str">"ElapsedTicks: "</span> + sw.ElapsedTicks.ToString() +<br /> <span class="str">"\nElapsedMilliseconds :"</span> + sw.ElapsedMilliseconds.ToString() +<br /> <span class="str">"\nElapsed(TimeSpan) :"</span> + sw.Elapsed.ToString();</pre></div>Mario Schneiderhttp://www.blogger.com/profile/12223246174022743152noreply@blogger.com0