Archiv für Kategorie Allgemein

Suchen und Ersetzen mittels Regular Expressions

Ich veränderte die Art und Weise, wie ich meine Settings anspreche – und zwar implementierte ich die Library Nini.

Dazu musste ich in verschiedenen Dateien einige Zeilen ändern, womit sich die Gelegenheit bot mal das Suchen und Ersetzen mittels Regular Expressions auszuprobieren.

[sourcecode language=“csharp“]
Properties.Connection.Default.ComPort
Properties.Connection.Default.BaudRate.ToString()
[/sourcecode]

… sollte werden zu:

[sourcecode language=“csharp“]
configCommunication.Get( "ComPort" )
configCommunication.Get( "BaudRate" )
[/sourcecode]

Suchen nach diesem Pattern: Properties.Connection.Default.{[:c]+}[.ToString\(\)]*
Ersetzen mit diesem Pattern: configCommunication.Get( \1″ )

Die geschweiften Klammern gruppieren, um dann später bei der Ersetzung diese Gruppe mit \1 anzusprechen. :c steht für ein alphanumierischen Zeichen, welches durch die Klammern herum und das folgenden Plus in beliebiger Anzahl größer 1 vorkommen darf. Der letzte Ausdruck in eckigen Klammern wird durch den Stern optional – das Pattern trifft zu, egal ob er vorhanden ist oder nicht.

Keine Kommentare

Individueller MenuStrip – Schriftfarbe anpassen

In einer Windows-Form habe ich einen MenuStrip mit einem blauen Hintergrund. Die Schriftfarbe (ForeColor) wurde daher von System.ControlText zu System.Control geändert, da es sonst schlecht lesbar wäre. Allerdings ergab sich nun das Problem, dass beim Aktivieren des Menüs der Hover-Effekt für einen hellen Hintergrund sorgt und der Text kaum noch lesbar ist.

Der Hover-Effekt selbst sollte so bleiben, aber die Schriftfarbe entsprechend des Hintergrundes bzw. Status (aktiv/inaktiv) angepasst werden. Möglich macht es das Event ToolStripMenuItem.Paint. Damit man aber sowohl das direkte Hovern als auch das aufgeklappte DropDown-Menüs erwischt, müssen offenbar die Eigenschaften Selected und Pressed abgefragt werden.

[sourcecode language=“csharp“]

myItem.Paint += new PaintEventHandler( myItem_Paint );

void myItem_Paint( object sender, PaintEventArgs e )
{
var item = (ToolStripMenuItem) sender;

if (item.Selected || item.Pressed)
{
item.ForeColor = SystemColors.ControlText;
}
else
{
item.ForeColor = SystemColors.Control;
}
}

[/sourcecode]

1 Kommentar

Visual Studio: Warnung über fehlende XML Kommentare unterdrücken

Ich habe angefangen meinen Quelltext mit den XML-Kommentaren zu formatieren. Dazu gibt man einfach /// ein und Visual Studio erzeugt daraus sowas wie:

[sourcecode language=“csharp“]

/// <summary>
///
/// </summary>
/// <param name="addr"></param>
/// <param name="value"></param>
public static void WriteData(int addr, short value)
{
}
[/sourcecode]

Visual Studio meckert dann aber später über jede Methode, die noch nicht kommentiert wurde. Dafür gibt es in den Projekteinstellungen Warnungen unterdrücken (Reiter Erstellen). Dort wird hinzugefügt: 1591,1592,1573,1571,1570,1572

Keine Kommentare

C# Properties.Settings portabel machen

… oder: „Warum werden meine Änderungen in meiner AppName.exe.config nicht berücksichtigt?!“

Es hat eine Weile gedauert, bis ich die Funktionsweise kapiert hatte.

Folgendes musste ich erst herausfinden:

  • Bereich Benutzer sind zur Laufzeit änderbar, Anwendung nicht und werden erst durch einen Neustart der Anwendung aktiv
  • Das Ändern der Settings in der XML Datei AppName.exe.config klappt nicht, da Benutzer-Einstellungen für jeden Nutzer seperat abgespeichert werden unter einem kryptischem Pfad wie z.B:
    C:\Users\flowschi\AppData\Local\[Herstellername]\[Anwendungsname mit kryptischem String] – genauer Pfad abhängig von Faktoren wie Roaming true/false und Bereich der Settings (Anwendung/Benutzer)
  • Löscht man diese user.config, wird sie beim nächsten Programmstart erneut mit den Standardwerten aus der AppName.exe.config aus dem Programmverzeichnis erstellt
  • An den Pfad kommt man über die .NET Anwendung mit (Verweis zu System.Configuration nötig):

[sourcecode language=“csharp“]// Machine Configuration Path
string path1 = ConfigurationManager.OpenMachineConfiguration().FilePath;
// Application Configuration Path
string path2 = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None).FilePath;
// User Configuration Path
string path3 = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;[/sourcecode]

Das alles mag teilweise recht praktisch sein, aber ich suchte nach einer Möglichkeit das ganze sehr einfach zu halten und mit einer einzigen Konfigurationsdatei auszukommen. Die sollte auch schön bei der Anwendung liegen, so dass ein Benutzer ggf. per Hand leicht was an der Konfiguration ändern kann und vor allem die ganze Anwendung mitsamt Einstellungen portabel bleibt.

Fündig geworden bin ich bei Mike Nathan auf Geek Republic. Sein C# Portable Settings Provider macht genau das. Da ich meine Settings nicht unter Properties gespeichert habe sondern in einem eigenen Ordner, war noch etwas Anpassung nötig:

[sourcecode language=“csharp“]
// Application Specific Node
//string APPNODE = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Properties.Settings";
string APPNODE = "SYMAP_Daten_Logger.Settings";
[/sourcecode]

Weiß jemand wie ich den Standard-Namespace meines Projektes herausbekomme ohne ihn statisch festzulegen?

Eines sollte einem aber noch bewusst sein: Baut man doch einen Installer und installiert die Software unter C:\Program Files\ …, so wird auch versucht dort die Konfigurations-Datei zu speichern. Das geht aber schief, weil hierfür die nötigen Rechte fehlen.

, ,

7 Kommentare