LogMonitor

Hinterlasse einen Kommentar

ist eine weitere kleine aber vollständige Anwendung zum online betrachten von Log-Files (ähnlich wie ComMonitor, das auch eine eigene abgeschlossene Anwendung ist). Der eigentliche Grundgedanke ist aber mehr ein Anschauungsobjekt als eine professionelle Anwendung. Trotzdem erfüllt sie ihren Zweck. Ich habe mir auch hier mal die Mühe gemacht eine eigene Webseite dafür einzurichten.
Für die optische UI Darstellung habe ich MahApps.Metro library gewählt und da ich die alten Microsoft Blacklight Controls eigentlich immer ziemlich cool fand habe ich mir die Arbeit gemacht die Panels aus der Blacklight Lib heraus zu schneiden und in das Projekt einzubinden.

Ziemlich schwierig gestaltete sich die richtige Auswahl zu treffen, mit welchen der „100 Millionen“ Dateifunktionen, die .Net zur Verfügung stellt, die richtige ist. Es kam zu doch recht merkwürdigen Effekten, wie ich feststellen musste. Zum Beispiel funktionierte das ganze nur eine gewisse zeit lang, dann wurden die Files nicht mehr upgedatet (ein Phänomen das ich übrigens auch bei einigen Linux-Versionen feststellen konnte mit dem Tail-Befehl). Schließlich funktionierte die Strategie mit dem .Net FileSystemWatcher und

using (FileStream stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
}

und

using (StreamReader reader = new StreamReader(stream))
{
}

Folgende Features werden gezeigt:

 

Das Projekt gibt’s hier und die Webseite befindet sich hier.

Advertisements

MySimpleCsvConsoleAppCpp

Hinterlasse einen Kommentar

ist ein C++ Konsolen-Programm das mit VS 2017 erstellt wurde. Es kann neben farbigen Ausgaben in der Windows-Konsole eine Csv Datei mit doubles (als Strings) einlesen und in eine Liste (list<string>) laden oder eine Csv mit random doubles erstellen und zurück in eine Datei schreiben.

Zu bemerken wäre, dass die MyCsvClass nicht sicher programmiert ist. Gemeint ist das sie keine Exceptions wirft oder abfängt. Wird ihr eine Csv-Datei vorgesetzt die sich nicht verarbeiten lässt (kein „;“ als Seperator, keine doubles als Inhalt etc.) kann die Anwendung abstürzt.

Folgende Features werden gezeigt:

  • Farbige Ausgabe in einer Konsole für eine C++ Windows Anwendung
  • Lesen und schreiben in einer Text Datei mit C/C++
  • Csv Datei in C/C++ verarbeiten

Das Projekt auf Github.

Hinweis zum kompilieren ist das Windows 10 SDK notwendig. Der Download ist hier.

MyKillWinAppCpp

Hinterlasse einen Kommentar

ist eine MFC C++ Anwendung, die alle Fenster auf dem Desktop durch iteriert und in einer ComboBox speichert. Wählt man einen Eintrag aus der ComboBox aus wird dieser in das Edit Feld geladen, so dass man es editieren kann wenn man es möchte um dann die Anwendung (das Fenster) mit dem Inhalt in dem Fenster Rahmen zu beenden:

Dies ist eigentlich ein WPF und .Net Blog, gelegentlich gibt es aber Ausnahmen, wie diese. Der Grund hierfür war das kleine ComMonitor Projekt. In dem ich die Software aus dem Internet updaten wollte wenn es eine neue Version gibt. So wie bei Notpad++, dessen Mechanismus ich auch mit freundlicher Genehmigung von Don Ho benutze (WinGup). WinGup hat nur einen kleinen Nachteil für WPF Anwendungen. Es schließt die upzudatende Anwendung auf Grund der unter Win32 registrierten Fenster-Klasse (RegisterClassEx). Die gibt es aber bei .Net Anwendungen so nicht. Deshalb muss man das Programm so ändern, das es auch für WPF Anwendungen brauchbar ist. Ich habe mich dazu entschlossen nach der Titelzeile im Fenster zu suchen und so das Fenster zu schließen. Eine nicht ganz ungefährliche Methode aber bis jetzt hatte ich keine bessere Idee. Nach den Äderungen in WinGup entschloss ich das Ganze in ein eigenes, kleines, „sauberes“ Demo-Projekt zu packen.

Folgende Features werden gezeigt:

  • Beispiel für Win32 EnumWindows
  • Beispiel für eine MFC C++ Dialog Applikation

Das Projekt gibt’s hier.

MyWpfTabApp

Hinterlasse einen Kommentar

ist ein eine Wpf Tab-Anwendung die unterschiedliche Tab-Typen anzeigen kann, die dynamisch hinzugefügt und entfernt werden können:

Dieses Beispiel ist in C# 7.0 kompiliert und mit Visual Studio 2017 erstellt und es ist konsequent im MVVM-Pattern geschrieben. Es werden zur Laufzeit unterschiedliche Typen dem Tab-Control zugewiesen, das kann man in C# mit Interfaces realisieren:

    ITabViewModel itvw = new TabPictureViewModel();
    oder
    ITabViewModel itvw = new TabTextViewModel();

 

Eine Klasse, die von einem Interface abgeleitet wurde kann man einer Variablen von selben Typ dieses Interfaces zuweisen. Auch wenn es in Wirklichkeit unterschiedliche Klassen sind. Umgekehrt geht es nicht, also:

    TabPictureViewModel ipvm = new ITabViewModel(); 
    oder 
    TabTextViewModel ttvm = new ITabViewModel();

 

führt zu einem Compilerfehler, da laut Definition aus einem Interface keine Instanz erstellt werden kann.
Dies ist ein gutes Beispiel für das Inversion of Control Prinzip in der Objektorientierten Programmierung (siehe hier, hier oder hier)

 

 

Das Projekt auf Github.

ComMonitor

Hinterlasse einen Kommentar

ist eine kleine Anwendung zur Low-Level-Kommunikation (auf Byte-Ebene) über TCP/IP Sockets. Es kann für SPS-Programmierer nützlich sein, die Datenaustausch mit der SPS oder anderen Devices testen wollen. Aber auch für andere Entwickler, die mit Sockets Verbindungen aufbauen wollen oder einfach nur zu herumspielen oder ausprobieren mit TCP/IP.

ComMonitor kann:

  • Verbringungen laden/speichern
  • Nachrichten benennen, laden und speichern
  • auf einfache Weise Nachrichten (Telegramme) auswählen und zur eigenen Nachrichten-Listen hinzufügen
  • Fokussierte-Nachrichten senden
  • Nachrichten in einem Hex-Editor bearbeiten und die bearbeiteten Nachrichten senden oder speichen

Es ist nicht wie die andren Beiträge nur als Beispiel zu verstehen, sondern eine kleine aber vollständige Anwendung mit eigenem Setup (Hinweis: sowohl das ComMonitor.exe als auch das Setup.exe ist nicht signiert). Weitere Beschreibungen sind auf Github zu finden

Das Projekt gibt’s hier und die hier die Projekt-Hompage.

MyHexStackPanel

Hinterlasse einen Kommentar

ist ein weiteres Beispiel für die Erstellung und Benutzung von WPF UserControls. Der Gedanke bei diesem kleinem Anschauungsprojekt war eine schnelle Hex-Anzeige zu bauen die einen beliebigen Byte-Stream anzeigen kann.

wenn man mit der rechten Maustaste auf den grauen Rand klickt wird eine zufällige OUT Nachricht hinzugefügt, wenn man mit der linken Maustaste klickt wird eine zufällige IN Nachricht erzeugt. Klickt man auf eine Nachricht wird sie schwarz selektiert, beim zweiten klick wird die Selektion wider Aufgehoben.
Als kleiner Nebeneffekt kann man sehen wie man mit einem StackPanel und einem Scrollbar arbeiten kann.

Folgende Features werden gezeigt:

  • verschachtelte UserControls
  • arbeiten mit StackPanel
  • arbeiten mit Scrollbar

Das Projekt auf Github.

MyUcMvvmApp

Hinterlasse einen Kommentar

Wie im voran gegangenem Beispiel handelt es sich bei MyUcMvvmApp um ein UserControl mit DependencyProperties die Eigenschaften des Controls nach außen legen. Es gibt aber zwei Unterschiede, erstens ist dies ein UserControl das in eine Anwendung eingebettet ist die ein ViewModel hat und zweitens hat das UserControl eine Klasse (MyUserControlAction) in der man bestimmte Logik abhanden kann.
Der Hintergrund ist der Folgender:
Man stelle sich folgendes Scenario vor, eine Anwendung erhält von außen irgendwelche Events über eine Schnittstelle seriell, I/O oder TCP. Diese Ereignisse sollen zum Beispiel angezeigt werden und auch vielleicht quittiert werden oder irgendwie anders verarbeitet werden. Um den ganzen notwendigen Kladderadatsch abzuhandeln und zu kapseln, so dass ich nicht alles in meiner Anwendung habe und vielleicht sogar noch mal woanders wider verwenden kann bietet es sich an das ganze in einem UserControl zu verpacken.
In unserem Fall kommen die Ereignisse nicht von außerhalb sondern werden mit einem DispatcherTimer in der Klasse MyUserControlAction simuliert, und es werden nach einem Zufallsprinzip die ‚Leuchtdioden‘ geschaltet.

42_1

Die Klasse MyUserControlAction kann nun über das DependencyProperty in dem ViewModel gebunden werden und so Aktionen aus lösen, zum Beispiel den DispatcherTimer schneller oder langsamer laufen lassen.
Eine Anmerkung: damit das hier geschilderte auch wirklich funktioniert ist es notwendig aus der MyUserControlAction Klasse in Singleton zu machen, da sowohl das UserControl als auch das ViewModel über MyUserControlAction.Instance auf eine Instanz der Klasse zugreifen muss. Auch in diesem Projekt habe ich das MVVM Light Toolkit von Codeplex benutzt.

Folgende Features werden gezeigt:

  • Databinding an UserContol mit DependencyProperty
  • Implementierung des Singleton Patterns
  • UserContol über DependencyProperty an ein ViewModel binden

Das Projekt auf Github.

Older Entries