Dienstag, 27. Oktober 2009

Dot Net (C#): lokalisiertes PropertyGrid ; lokalisierte Attribute

In 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 Attribute, insbesondere solche für das PropertyGrid (Description, DisplayText, Category), lokalisieren kann.

Da meine Internetrecherche zu diesem Thema kaum brauchbare Beispiele hervorbrachte, möchte ich an einem Minimalbeispiel darauf eingehen:

Als erstes brauchen wir eine Klasse, die lokalisiert werden soll, nehmen wir in diesem Fall eine "Person":

namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
public String FirstName { get; set; }
public String LastName { get; set; }

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}

Normalerweise würde man die Klasse nun wir folgt mit Attributen versehen:
[DescriptionAttribute("Der Vorname dieser Person")]
public String FirstName { get; set; }

[DescriptionAttribute("Der Nachname dieser Person")]
public String LastName { get; set; }

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 Resource-Datei abzulegen.



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 Description-Attributes, es kann alternativ mit dem Category- und DisplayText-Attribut verfahren werden:

Lediglich ein privates Feld (oder Property) sowie das Überschreiben des Get-Property sind notwenidg.
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
/// <summary>
/// Contains the name of the resource-string
/// </summary>
private string rDescription;

/// <summary>
/// Creates a new LocalizedDescription Attribute instance
/// giving it the name of the resource-string
/// </summary>
/// <param name="description"></param>
public LocalizedDescriptionAttribute(string description)
{
this.rDescription = description;
}

/// <summary>
/// (Overridden) Get: fetching the description during runtime
/// from the Resources (with respect to the current culture)
/// </summary>
public override string Description
{
get
{
return Properties.Resources.ResourceManager.GetString(
this.rDescription,
Thread.CurrentThread.CurrentCulture
);
}
}
}

Als nächstes ist es notwendig, die Klasse Person abzuändern und das neue Attribut einzusetzen:
namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
[LocalizedDescriptionAttribute("PersonFirstName")]
public String FirstName { get; set; }
[LocalizedDescriptionAttribute("PersonLastName")]
public String LastName { get; set; }

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}


Eine fertige Klasse könnte wie folgt aussehen:
namespace LocalizeableDescriptionPropertyGrid
{
public class Person
{
// Properties
[LocalizedCategoryAttribute("PersonCatData"),
LocalizedDescriptionAttribute("PersonFirstNameDescription"),
LocalitedDisplayTextAttribute("PersonFirstNameDisplayText")]
public String FirstName { get; set; }

[LocalizedCategoryAttribute("PersonCatData"),
LocalizedDescriptionAttribute("PersonLastNameDescription"),
LocalitedDisplayTextAttribute("PersonLasttNameDisplayText")]
public String LastName { get; set; }

// other properties

// ctor
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

// other methods ...
}
}


Das gesamte Beispiel könnt ihr hier runterladen: localizablepropgridcode.rar (14,6 KB)

Mittwoch, 13. Mai 2009

Understanding SSDs / which SSD to choose nowadays

Since december 2008 I'm using a SSD for my OS and the installed programs. I had to make a choice between the OCZ Core v2 / Solid - series (MLC, JMicron-based), the Patriot Warp v2 (MLC, JMicron-based) or the Mtron Mobi 3500-series (SLC, proprietary development-chip). Because of better price per GB and availability I picked the Patriot Warp v2. Sadly I had to return it to the shop some days later because of terrible stuttering/pause-problems.

Then I chose the Mtron Mobi 3500-series (3525 32GB in fact) and experienced some very satisfying performance. 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).

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

So, it's been a while and some new SSDs are available down to the present day. OCZ launched their Vertex series (Summit comming soon), the Samsung SLC-SSD dropped in price, they launched the new PB22-J 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 Intel X25-E and the OCZ Vertex, two very attractive SSDs these days.

There is one article that is definitely worth reading: At the Anandtech-Website you can find it: The SSD Anthology: Understanding SSDs and New Drives from OCZ. 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 why you should want an SSD. Then it accurately describes the anatomy of an SSD (very worth reading), it deals with the performance degradation problem (also very worth reading!!!), describes how you can restore the peak performance of your SSD using secure erase-mechanism. Furthermore there is a comparison of the performances of new vs. used drives, a very juicy story about the development of the OCZ Vertex and finally a chunk of benchmark and real-world-usage results.

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 OCZ Vertex and Intel X25-M, two very interesting drives today.

If you're planning to purchase a SSD and want to know why not to choose the OCZ Solid / Core, Patriot Warp and some other samples, you definitely have to read that article.

current prices of some SSDs:


(I picked ~60GB and 2,5" models, omitted old JMicron-based SSDs, sorted them by price/gb)

Montag, 4. Mai 2009

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

Mit einem kleinen Trick kann man den restlichen RAM jedoch nutzen. Kürzlich bin ich auf folgenden Artikel aufmerksam geworden:

8GB unter Vista / XP x86 (32 Bit) nutzen - Dank RAM Disk

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 Auslagerungsdatei von Windows, mein Temp-Verzeichnis sowie portable Programme und meinen Webbrowser untergebracht.

Der Vorteil 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 :)



Nachtrag: vom 7.05.2009:

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:
- Auslagerungsdatei: 1,2 GB
- Portable Anwendungen: 0,5 GB
- Webbrowser + Cache: 0,3 GB
- Temporäre Dateien: 0,5 GB

Mit dem 8 GB-Ausbau habe ich nun 4,5 GB für die RAM-Disk, was sich wie folgt aufteilt:
- Auslagerungsdatei: 1,2 GB
- Portable Anwendungen: 0,5 GB
- Webbrowser + Cache: 0,3 GB
- Temporäre Dateien: 2,5 GB




Nachtrag: vom 18.05.2009:

Wie das Leben so ist, gibt es zu jedem Vorteil auch immer mind. einen Nachteil. 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).

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!




Nachtrag: vom 28.05.2009:

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 8192 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:

Installed (MB): 7890
Reserved (MB): 280
Direct address: disabled

Daraus ergeben sich 4371 MB unmanaged memory, von denen ich 4300 für die RAM-Disk nutze.

Sonntag, 8. März 2009

Multi-display tools

Beim Arbeiten mit mehreren Monitoren fehlen insbesondere unter Windows XP Möglichkeiten, seine Fenster zu organisieren.

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.

Hier die wichtigsten Funktionen der einzelnen Tools kurz vorgestellt:

UltraMon:

  • Monitore pixelgenau ausrichten
  • Erweiterung der Startleiste auf den zweitem Monitor
  • Verschieben von Fenstern auf andere Monitore per Shortcut
  • Starten von Tools auf bestimmten Monitoren / vordefinierten Positionen und Fenstergrößen
  • Desktopsymbole bzw. deren Position wieder herstellen, sollten diese sich verschoben haben
  • Monitore über Windows deaktivieren (Darstellung ausschalten)
  • unterschiedliche Wallpaper/Hintergründe für jeden Monitor einrichten
Download: www.realtimesoft.com/de/ultramon/


ATI Tray Tools:
  • Setup der Monitore unter Windows
  • Drehen von einzelnen Monitoren
  • Getrennte Farbkorrekturen
Download: www.guru3d.com/article/ati-tray-tools-/


GridMove:
  • Ausrichten von Fenstern an Bildschirmrändern
  • Nebeneinander oder Übereinander ausrichten von Fenstern
  • Verschieben von Fenstern in vordefinierte "Flächen" auf Monitoren
Download: jgpaiva.donationcoders.com/gridmove.html

Freitag, 27. Februar 2009

Music Discovery Project 2009 - The Planets Reloaded - Paul van Dyk und das hr-Sinfonieorchester + Gäste

2009 sollte es endlich wieder soweit sein: Paul van Dyk spielt ein erneutes Mal gemeinsam mit einem weltbekannten Orchester: Das hr-Sinfonieorchester unter seinem Chefdirigenten Paavo Järvi (zweifacher Grammy-Preisträger) spielte Gustav Holsts "Die Planeten", das bereits bekannte Filmregisseure und diverse Rockbands faszinierte.

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 :)

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 4-köpfiger Band (Schlagzeug: Flo Dauner [Die Fantastischen Vier], Gitarre: Bruce Gainsford [Vega 4], Percussion: Roland Peil, Keyboard: Ulf Kleiner) sowie 4 Gesangpartnern (Johnny McDaid [Vega4], Josée Hurlock, Ryan Merchant, Jemma Endersby) 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).

Impressionen:



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

Links zum Thema:

Freitag, 13. Februar 2009

Software-Portal software.marioschneider-online.de

Seit Jahren findet ihr auf meiner privaten Webseite 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 software.marioschneider-online.de online gegangen. Dort findet ihr von nun an alle Informationen zu meinen Tools, incl. Versionsverlauf, Screenshots und den entsprechenden Download-Links.

Tool-Liste (auszugsweise:)

  • CD-Manager (Delphi) - Verwaltung von CDs/DVDs für Spiele und Filme incl. Verleihliste
  • File Extractor (C#) - Komfortables Entpacken mehrerer Rar-Archive, incl. Passwortselektor
  • HTML Map Creator (C#), erzeugt HTML-Image-Maps (mehrere Links auf einem Bild)
  • Icon Viewer - (C#) Navigator für Bilder und Icons (übersichtliche Darstellung von ico, gif, png, bmp etc.)
  • Libra XHTML-Editor (C#) sehr komfortabler HTML-Editor mit grafischer (Block-)Darstellung von HTML-Elementen
  • Millhouse (Java) Brettspiel Mühle inc. KI-Gegner, Netzwerkunterstützung und verschiedenen Skins
  • Notizblock .Net (C#) Programm zur übersichtlichen Verwaltung von beliebigen Notizen in mehreren Kategorien
  • Passwort Verwalter Dot Net (C#) Sehr komfortables Programm zur Verwaltung beliebiger sensibler Daten (Passwörter, Logins) incl. iTan-Listen u.v.m
  • RegEx Test (C#) Testen von regulären Ausdrücken cinl. Beispielen, Trefferanzeige, Gruppenanzeige etc.
  • Text-Editor (Delphi) ermöglicht das Editieren von Texten nach vielen Kriterien

Weiterhin sind auf der Website div. Code-Snippets sowie Beispielanwendungen zu div. Themen zu finden.

software.marioschneider-online.de

Sonntag, 31. August 2008

Windows: Dateien synchronisieren mit RoboCopy

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

Seit Jahre verwende ich dafür das Programm Total Commander, 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.

Das in Windows Vista integrierte Programm RoboCopy, welches mit den Windows Server 2003 Resource Kit Tools auch für andere Windows-Systeme erhältlich ist, bringt endlich eine Ablöse für das Problem.

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.

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

@echo off
echo Starte Sicherung...
set Quelle01="E:\Daten\Eigene Dateien"
set Ziel01="K:\Daten\Backups\Eigene Dateien"
set Quelle02="E:\Daten\Recovery"
set Ziel02="K:\Daten\Backups\Recovery"
set Logfile="c:\robo_log.txt"
c:
cd C:\Programme\Windows Resource Kits\Tools
echo.
echo Sicherung 1: Eigene Dateien
robocopy %Quelle01% %Ziel01% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG:%Logfile% > NUL
echo Sicherung 1: Eigene Dateien - fertig
echo.
echo Sicherung 2: Recovery
robocopy %Quelle02% %Ziel02% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG+:%Logfile% > NUL
echo Sicherung 2: Recovery - fertig
echo.
echo Sicherung abgeschlossen.
echo.
pause


Das Script im einzelnen, kurz erklärt:

1. Anlegen von Variablen für die Quell- und Zielverzeichnisse sowie Log-Datei:
set Quelle01="E:\Daten\Eigene Dateien"
set Ziel01="K:\Daten\Backups\Eigene Dateien"
set Quelle02="E:\Daten\Recovery"
set Ziel02="K:\Daten\Backups\Recovery"
set Logfile="c:\robo_log.txt"

2. Navigation zum Verzeichnis, in dem sich robocopy.exe befindet (nicht nötig, sofern PATH-Variable von Windows angepasst):
c:
cd C:\Programme\Windows Resource Kits\Tools

3. Erstes Verzeichnis synchronisieren:
robocopy %Quelle01% %Ziel01% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG:%Logfile% > NUL

4. Zweites Verzeichnis synchroniseren:
robocopy %Quelle02% %Ziel02% /MIR /R:10 /W:10 /V /XD ".svn"
/XD "thumbs.db" /COPY:DAT /LOG+:%Logfile% > NUL


Die Schalter kurz erklärt:
/MIR            - Mirror-Funktion (Löschen von Dat./Ordnern in Quelle im Ziel nachvollz.)
/R:10 /W:10 - [R] Mal erneut versuchen nach [W] Sekunden
/V - wortreiche Ausgabe
/XD ".svn" - Alle Verzeichnisse namens ".svn" nicht beachten
/XF "thumbs.db" - Alle Dateien namens "thumbs.db" nicht beachten
/COPY:DAT - Dateiinhalt, -Attribute und Zeitstempel kopieren
/LOG:%Logfile% - Logdatei erstellen (falls vorhanden: ersetzen)
/LOG+:%Logfile% - Logdatei erstellen (falls vorhanden: erweitern)
>> NUL - Bildschirmausgabe deaktivieren


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.

Donnerstag, 31. Juli 2008

Passwort Verwalter Dot Net - Version 1.2

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.2 bietet folgende neue Features:

  • Bugfix: Aktivierung/Deaktivierung von Menüpunkten im Hauptmenü
  • Bugfix: Programminterne Hilfe: Sprung zum jeweiligen Kapitel
  • Bugfix: Suche: Markierung des Treffer-Feldes
  • Bugfix: Verzögerung beim (1.) Anzeigen des Suchen-Dialogs
  • Backupmanager hinzugefügt
  • Datenfelder können nachträglich gelöscht werden (sofern keine Daten mehr in diesem Datenfeld vorhanden sind)
  • Einträge können in andere Kategorien verschoben werden
  • Feedbackdialog hinzugefügt
  • Logindialog überarbeitet (Untersützung für Schlüsseldateien)
  • Hauptfenster kann in der Größe (begrenzt) verändert werden
  • Neues Tool "Notizblock" verfügbar
  • Schlüsseldateien (Keyfiles) verfügbar (incl. 4 Sichermeitsmodi)
  • Standard-Zufallspasswort kann konfiguriert werden
  • Verwendete Datei kann per Drag & Drop in Start- sowie Loginform geändert werden
  • Verzeichnis der aktuellen Datei kann im Explorer angezeigt werden (Haupfenster-Menüeintrag)

Projekt-Homepage: www.pwvdotnet.org

Direktdownload: pwvdotnet_v1200_setup.exe oder pwvdotnet_v1200.zip (portable)

Mittwoch, 30. Juli 2008

Dot Net (C#): Screenshot von einem Control erzeugen

Folgende zwei Methoden sind nötig, um einen Screenshot von einem Control zu erzeugen und diesen in eine Datei zu speichern:

   1:  public static Bitmap takeScreenshot(Control pControl)
   2:  {
   3:      Bitmap bmp = new Bitmap(pControl.Width, pControl.Height);
   4:      pControl.DrawToBitmap(bmp, Rectangle.FromLTRB(0, 0, pControl.Width, pControl.Height));
   5:      return bmp;
   6:  }
   7:   
   8:  public static Boolean saveScreenshotToFile(Control pControl, String pFilename)
   9:  {
  10:      try
  11:      {
  12:          takeScreenshot(pControl).Save(pFilename);
  13:          return true;
  14:      }
  15:      catch (Exception)
  16:      {
  17:          return false;
  18:      }
  19:  }

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.

Dienstag, 17. Juni 2008

Dot Net (C#): Drag & Drop

Drop von Dateien / Ordnern:

1. Vorbereitung:

"AllowDrop"-Property setzen und 2 Events anmelden:

   1:  public MainForm()
   2:  {
   3:      InitializeComponent();
   4:      this.textboxDir.AllowDrop = true;
   5:      this.textboxDir.DragOver += new DragEventHandler(textboxDir_DragOver);
   6:      this.textboxDir.DragDrop += new DragEventHandler(textboxDir_DragDrop);
   7:  }


2. Drag Over-Event:

DataFormat überprüfen und DragDropEffects setzen:

   1:  void textboxDir_DragOver(object sender, DragEventArgs e)
   2:  {
   3:      if (e.Data.GetDataPresent(DataFormats.FileDrop))
   4:      {
   5:          e.Effect = DragDropEffects.Move;
   6:      }
   7:  }


3. Drag-Drop-Event:

Drop auswerten:

   1:  void textboxDir_DragDrop(object sender, DragEventArgs e)
   2:  {
   3:      if (e.Effect == DragDropEffects.Move) // if move
   4:      {
   5:          if (e.Data.GetDataPresent(DataFormats.FileDrop)) // if file drop
   6:          {
   7:              string[] dirNames = (string[])e.Data.GetData(DataFormats.FileDrop);
   8:              if (dirNames.Length.Equals(1)) // wenn genau eine datei
   9:              {
  10:                  if (MSUtils.FileUtil.dirExists(dirNames[0]))
  11:                  {
  12:                      this.textboxDir.Text = dirNames[0];
  13:                  }
  14:              }
  15:          }
  16:      }
  17:  }

Montag, 16. Juni 2008

Opera 9.5 und öffentlicher ACID3-Build

Der Opera-Browser ist am 12.06.2008 in der Version 9.5 erschienen. Diese Version bringt viele neue Features mit sich:

  • Extended-Validation-SSL-Zertifikate
  • Adressleiste mit besseren Vorschlägen für bereits besuchte Seiten
  • bessere Unterstützung von Web-Standards (JavaScript, CSS, SVG, MathML)
  • Opera-Link (Synchronisation von Bookmarks und Co.)
  • neues Skin (altes Skin aber noch verfügbar)
  • schnellerer Seitenaufbau
  • weiches Scrollen
  • neue Entwicklerwerkzeuge
Opera 9.5 kann in mehr als 25 Sprachen hier heruntergeladen werden: http://www.opera.com/download/



Im ACID3-Test schafft diese Version ca. 85 Punkte. Ein öffentlicher Build, der 100 Punkte im ACID3-Test schafft, ist hier zu finden: http://labs.opera.com/news/2008/03/28/

Ich habe mich an einen kleinen Browservergleich 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.

Das Ergebnis:




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.

Dienstag, 8. April 2008

Dot Net (C#): Invoke()-Methode für MultiThread-Applikationen mit WindowsForms

Um ein Control auf einer WindowsForms von einem anderen Thread aus zu verändern, muss die Invoke()-Methode der Form oder des Controls verwendet werden. Ein Control darf nur von dem Thread geändert werden, von dem es erzeugt wurde!

Folgendes Minimal-Beispiel (unvollständig) zeigt einen Anwendungsfall, in dem ein Thread seinen Status an eine Form berichtet:

Die Klasse MathClass erzeugt Thread-Objekte, deren Methode CalcBackground() in einem Thread ausgefürt wird.Aus dieser Methode heraus soll die GUI über den aktuellen Thread-Status informiert werden:

   1:   
   2:      public class MathClass
   3:      {
   4:   
   5:          private MainForm myForm;
   6:          private int iNumber;
   7:   
   8:          public Thread Initialize(MainForm myform, int number)
   9:          {
  10:              this.myForm = myform;
  11:              this.iNumber = number;
  12:              return new Thread(new ThreadStart(this.CalcBackground));
  13:          }
  14:   
  15:          delegate void UpdateUI(int number, int state);
  16:          delegate void Finish(int number);
  17:   
  18:          public void CalcBackground()
  19:          {
  20:              UpdateUI updateUI = new UpdateUI(this.myForm.updateUIProc);
  21:              Finish finish = new Finish(this.myForm.FinishThread);
  22:   
  23:              try
  24:              {
  25:                  // do something
  26:                  // ...
  27:                  // report status to form:
  28:                  object[] param = new object[2] { this.iNumber, i };
  29:                  myForm.Invoke(updateUI, param); // call myForm.updateUIProc(iNumber, i)
  30:              }
  31:              catch (ThreadAbortException)
  32:              {
  33:                  // clean up
  34:              }
  35:              catch (Exception)
  36:              {
  37:                  // catch any other exception
  38:              }
  39:              finally
  40:              {
  41:                  try
  42:                  {
  43:                      // call myForm.FinishThread(iNumber)
  44:                      myForm.Invoke(finish, new object[] { this.iNumber }); 
  45:                  }
  46:                  catch (ObjectDisposedException e)
  47:                  {
  48:                  }
  49:                  catch (Exception ee)
  50:                  {
  51:                  }
  52:              }
  53:          }
  54:   
  55:      }

Die Mainform erzeugt in der Methode startThreads() zwei neue Threads. Die Methoden updateUIProc() sowie FinishThread() werden per Invoke()-Methode von Thread aus gestartet und laufen selbst im Thread der Mainform:
   1:      public partial class MainForm : Form
   2:      {
   3:   
   4:          public MainForm()
   5:          {
   6:              InitializeComponent();
   7:          }
   8:   
   9:          private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  10:          {
  11:              // kill threads before form closes
  12:              if (anyThreadAlive)
  13:              {
  14:                  killThreads();
  15:              }
  16:          }
  17:   
  18:          public void updateUIProc(int number, int val)
  19:          {
  20:              this.textBox1.AppendText(
  21:                  string.Format("thread {0} has done {1} % of its job", number, val));
  22:          }
  23:   
  24:          public void FinishThread(int number)
  25:          {
  26:              this.textBox1.AppendText(
  27:                  string.Format("thread {0} has finished", number));
  28:          }
  29:   
  30:          private void startThreads()
  31:          {
  32:              Thread th1 = new MathClass().Initialize(this, 0);
  33:              Thread th2 = new MathClass().Initialize(this, 1);
  34:              th1.Start();
  35:              th2.Start();
  36:          }
  37:      }

Es ist nicht erlaubt, das Control Mainform.textBox1 direkt aus dem Thread zu verändern.Ein Control darf nur von dem Thread verändert werden, von dem es erstellt wurde.Um trotzdem ein Control aus einem Thread heraus zu verändern, benutzt man die Methode Invoke() und übergibt dieser ein delegate (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.

Donnerstag, 3. April 2008

Dot Net (C#): SearchOption.AllDirectories für GetDirectories()

Die Methode GetDirectories() der Klasse DirectoryInfo liefert alle zu einem Suchpattern passenden Verzeichnisse. Dabei liefert der Aufruf

dir.GetDirectories("Release*")

beispielsweise alle Verzeichnisse, die mit "Release" 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:

dir.GetDirectories("Release*", SearchOption.AllDirectories)

Bei diesem Aufruf werden automatisch alle Unterverzeichnisse abgesucht. Dies erspart einem das rekursive Aufrufen von Methoden, was den Code wesentlich kürzer macht.

Genauso verhält es sich mit der Methode GetFiles().

Visual Studio: Methoden nachträglich generieren

Seit dem Visual Studio 2008 kann man Methoden nachträglich automatisch generieren lassen. Nehmen wir an, wir wollen (später) die folgende Methode generieren:

processDir(listFiles, this._strPath, pattern);

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.


Anklicken für Vollansicht

Es wird folgende Methode generiert:
private void processDir(List<string> listFiles, string p, string pattern)
{
throw new NotImplementedException();
}

Die erzeugte Methode ist private, evtl. Rückgabewerte werden ebenfalls angelegt.

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.

Donnerstag, 27. März 2008

Race Driver Grid - Ingame Video

Zum kommenden Rennspiel "Race Driver Grid" gibt es neben dem offiziellen (Render-)Trailer nun endlich einen "actual gameplay footage" mit Ingame-Szenen:


actual gameplay footage (ingame-graphics)

world trailer (rendered)

Projekt-Homepage: www.codemasters.de/grid

Mittwoch, 12. März 2008

Passwort Verwalter Dot Net - Version 1.1.3

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.3 bietet folgende neue Features:

  • FTP-Download:
    • Änderungsdatum der Datei korrigiert
    • Zugriffsdatum der Datei korrigiert
    • Erstellungsdatum der Datei korrigiert
  • HTML-Export:
    • Nachricht "Bitte warten" wird angezeigt, während der Report generiert wird
    • Statistikberechnung wird nur noch für ausgewählte Kategorien durchgeführt
  • Markierung von Eingabefeldern (gelbe Hervorhebung) kann deaktiviert werden
  • neue Engine zur Berechnung der Passwort-Sicherheit
  • neue Engine zur Erzeugung von Passwörtern
  • neuer Evaluierungs-Dailog für Passwörter
  • Passwort Generierung: Eigenschaften des Passworts per Kontextmenü wählbar (Länge, Zahlen, Sonderzeichen)
  • Statistik: "Bitte warten" Nachricht wird angezeigt, während die Statistik berechnet wird
  • Statistik und HTML-Export zeigen 3-spaltige Passwort-Sicherheit (Punkte, Prozent, Wort) an

Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1130_setup.exe oder pwvdotnet_v1130.zip

Worldshift - Screenshots und Open Beta

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

Der kostenlose Beta-Client steht bei FilePlanet zum Download bereit

Screenshots:

Anklicken zum Vergrößern

Informationen sowie weitere Screenshots findet ihr auf worldshift-game.com bzw. worldshift.de.

lolcats - lol cats ;)

watch, make and save "lolcats" at icanhascheezburger.com:

click to enlarge

Donnerstag, 28. Februar 2008

Passwort Verwalter Dot Net - Version 1.1.2

Der Passwort Verwalter Dot Net hat ein erneutes Update erhalten: Version 1.1.2 bietet folgende neue Features:

  • Datensatz kann einzeln als Textdatei extrahiert werden
  • "Daten speichern"-Button im Hauptfenster ermöglicht nun ebenfalls das Verwerfen der Änderungen
  • Eingabefelder werden dezent gelb hervorgehoben
  • FTP-Zugriff:
    • Aktivierung und Deaktivierung des automatischen Uploads von der Toolbar aus
    • Fortschrittsanzeige für FTP-Upload und -Download
    • Programm beendet sich, wenn bei der heruntergeladenen Datei das Passwort geändert wurde
  • horizontale Scrollbar für Eintragsliste
  • sicherer Passwort-Eingabe-Dialog für Schutz vor Keyloggern
  • Hilfe-Fenster kann minimiert und maximiert werden
  • HTML-Export: zu exportierende Kategorien auswählbar
  • HTML-Export: Zeichen "<", ">" und "&" werden nun korrekt dargestellt
  • Kompaktansicht hinzugefügt (Minimierung der Ansicht auf das Datenfeld)
    • enthält nur relevante Datenfelder
    • kann in einer beliebigen Bildschirmecke positioniert werden
    • kann mit der Maus verschoben werden
  • TAN-Verwaltung:
    • TAN-Listen sind alphabetisch sortiert
    • es kann nur noch eine TAN-Nummer gleichzeitig selektiert werden
    • Upload der Datei erfolgt nicht mehr, wenn die Änderung verworfen werden

Projekt-Homepage: http://pwvdotnet.6x.to

Direktdownload: pwvdotnet_v1120_setup.exe oder pwvdotnet_v1120.zip

Mittwoch, 27. Februar 2008

Dot Net (C#): List.ForEach() Methode

Verwenden der ForEach()-Methode einer Generic-List:

static void Main()
{
List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");

// Display the contents of the list using the Print method.
names.ForEach(Print);

// The following demonstrates the anonymous method feature of C#
// to display the contents of the list to the console.
names.ForEach(delegate(String name)
{
Console.WriteLine(name);
});
}

private static void Print(string s)
{
Console.WriteLine(s);
}


Generisch als Erweiterungsmethode für IEnumerable:
public static class IEnumerableExtension
{
public static void PrintItem<T>(this T item)
{
Console.WriteLine(item.ToString());
}

public static void PrintAllItems<T>(this IEnumerable<T> enumerable)
{
foreach (T item in enumerable)
{
PrintItem(item);
}
}
}