Montag, 21. Mai 2018

Listen in FMX (StringGrid)

Listen in FMX, Nutzung des StringGrids

Im letzten Post ging es um die Nutzung von ListView- Steuerelementen der VCL als Standard- Stream für C++. Nun gibt es im FMX- Framework keine Unterstützung für das Windows- Steuerelement und es braucht eine andere Lösung. Dieses kann ein StringGrid sein.

Sonntag, 13. Mai 2018

VCL ListViews als Standard C++ Stream

VCL ListViews als Standard C++ Stream

In einigen der vorherigen Posts ging es um die Verwendung von GUI- Elementen für die C++- Standard- Streams. Neben dem Memofeld waren das auch Labels und Editfelder. Und für die VCL auch die Statuszeile. Damit lassen sich sicher schon einige interessante Anwendungen zusammenbauen, aber ich möchte jetzt noch einen Schritt weiter gehen, und ein ListView- Steuerelement verwenden. Dieses gibt es in der Form nur unter Windows, und damit auch nur für die VCL. Für FMX könnte man einen ähnlichen Wrapper für ein StringGrid implementieren, und damit die Funktion eines ListViews nachbilden. Aber das originale Steuerelement unter Windows nicht zu verwenden wäre sicherlich dumm. Kompatibilität ist nicht Verzicht sondern das Suchen geeigneter Abstraktionen. Eigentlich sollten die bisherigen Posts schon gezeigt haben, welche mächtigen Abstraktionen uns als C++- Programmierer zur Verfügung stehen, und das Verzicht auf Möglichkeiten sicher nicht zu diesen gehört.

Donnerstag, 10. Mai 2018

Weitere GUI- Elemente und C++- Streams

Weitere GUI- Elemente und C++- Streams

Wie im letzten Post schon angedeutet, geht es heute um weitere GUI- Elemente, die ich als Ausgabemedium für Standard- Streams verwenden möchte. Dabei sind der Phantasie keine Grenzen gesetzt,sie können Edit- Felder,  Label, die Statuszeile und die Überschrift des Formulars verwenden, aber auch so komplexe Oberflächenelemente wie ein VCL- ListView- Element für Windows. Dabei können die Standard- Streams cout, clog und cerr verwendet werden, oder sie definieren einen eigenen Stream den sie dann mit den normalen Stream- Operatoren verwenden können.

RAII beim Verwenden der stream- Neuzuordnungen

Weitere GUI- Elemente als streambuf und RAII zum aufräumen

Kurz vor dem Feiertag ein weitere Post. Wie bereits angekündigt, möchte ich einfach weitere Steuerelemente zur Ausgabe verwenden, zum anderen ist bisher immer noch das manuelle Aufräumen notwendig. In dem Post RAII - Mauszeiger für VCL + FMX habe ich ja erklärt, dass dieses dank RAII nicht notwendig ist, und durch C++ selber verhindert werden kann. Also möchte ich in diesem Post beginnen, einen entsprechenden RAII- Wrapper entwerfen. Weitere Steuerelemente werde ich im nächsten Post betrachten.

Dienstag, 8. Mai 2018

Kleine Hilfstools, trainiere deine C++ Kenntnisse

Kleine Hilfstools, trainiere deine C++ Kenntnisse

Ich vergleiche C++- Entwickler gerne mit Leistungssportlern, die jeden Tag trainieren müssen. Nur so können sie ihre Leistungen kontinuierlich steigern. Das ist bei Programmieren nicht anders, nur sind es nicht die Muskeln und Reflexe, es sind neue Techniken. So weit her ist dieser Vergleich also nicht gezogen. Warum, zum einen weil programmieren nicht so einfach ist, und speziell C++ erweiterte Anforderungen an den Kenntnisstand stellt, und es nicht jeder kann, zum anderen aber auch, weil wir in Projekten nur Spracheigenschaften nutzen werden, die wir sicher beherrschen.

Nur, wie können wir sie trainieren, wenn nicht in unseren aktuellen Projekten? Uns begegnen in der täglichen Arbeit immer wieder Aufgaben, für die wir kleine Hilfstools brauchen. Aber anstatt sie schnell selber zu schreiben, fangen wir an im Internet zu suchen und ärgern uns, wenn es nicht 100% zu dem passt, was wir eigentlich suchen. Und genau hier ist die Lösung, wir schreiben uns kleine Hilfstools und lösen damit nicht nur unsere konkreten Probleme rund um die Projekte, wir trainieren mit den aktuellsten Compilern einfach neue Techniken.

Sonntag, 6. Mai 2018

Verwendung von Standardstreams zur Ausgabe in Memofeldern

Verwendung von Standardstreams mit VCL und FMX

Ich höre immer wieder, dass die meisten C++ Bücher und Beispiele, die man im Internet findet, mit dem C++Builder im speziellen, aber eben auch generell mit C++ in der heutigen Zeit nicht mehr funktionieren würden. Diese würden die Standardstreams verwenden, und die würden ja bei der Nutzung einer grafischen Oberfläche, sei es nun Windows, Android oder auch IOS nicht funktionieren. Und wer würde dann noch Anwendungen für die Konsole oder Eingabeaufforderung schreiben? Daran würde sich dann sogar sehr schnell die generelle Schwäche von C++ zeigen, eigentlich aus der Vergangenheit zu stammen, nicht mehr modern zu sein. Für mich zeigt es allerdings nur eines. Nämlich, dass viele die C++ Streams bisher nicht verstanden haben.

Die meisten schaffen es vielleicht noch, für eigene Datentypen die Eingabe- und Ausgabe- Operatoren zu schreiben, aber generell scheinen die Streams bei vielen C++- Programmierern nicht beliebt zu sein. Dabei bieten sie uns viele Möglichkeiten, und funktionieren von beiden Seiten. Wir können unabhängig voneinander Operatoren definieren, die die Streams nutzen, um unsere eigenen Datentypen auszugeben oder einzulesen. Wir können aber auch an der Basis Veränderungen vornehmen. Also bestimmen, wohin (bzw. woher) die Daten geschrieben oder gelesen werden. Beim Verwenden solcher veränderten Streams spricht man oft vom umlenken, manche bezeichnen es auch "Verbiegen". Ich werde das für die Standardausgabe machen, im ersten Schritt werden ich hier ein Memo- Feld der VCL verwenden, um dann die Klasse auch wieder für FMX verfügbar zu machen. Außerdem werde ich einen Wrapper schreiben, der über RAII die Kontrolle über einen beliebigen Stream übernimmt und Funktionen zum "Verbiegen" anbietet. Beim Ende der Lebensdauer wird aber auf jeden Fall der vorherige Zustand wiederherstellt. 

In einem späteren Blogpost werde ich dann weitere sinnvolle Steuerelemente verwenden, wie die Statuszeile für das Loggen mit clog, oder sogar ein Listview- Steuerelement für die Ausgabe von Listen. Da Listview- Steuerelemente nur unter Windows in der Form existieren und damit mit der VCL werden wir dieses dann einfach in einem StringGrid und FMX nutzen.

Freitag, 4. Mai 2018

Konvertierung der Delphi Stringtypen

Konvertierung der Delphi Stringtypen (template, Spezialisierung)

Wir alle kennen das Problem, dass die Delphi- Stringtypen (UnicodeString oder kurz String, AnsiString) nicht unbedingt zu C++ passen, und wir immer wieder die Methode c_str() bemühen müssen. Das ist nicht nur nervig, es kann auch zu Fehlern führen. Außerdem wollen wir oft den Inhalt einen Strings in einem anderen Datentyp haben, oder dieses umgekehrt in einen Delphi- String umwandeln, zum Beispiel um diesen in einem Edit- Feld eines Formulars anzuzeigen.

Dazu kommt, dass dank der nicht unbedingt nachvollziehbaren Entscheidung von Embarcadero unter iOS und Android weiter auf ein 16 bit Zeichentyp zu setzen, anstatt den systemspezifischen wchar_t Typ zu nutzen, der bei den unixoiden Betriebssystem ja ein 32 bit Datentyp ist. Damit kann es passieren, dass wir es in einem C++- Programm unter Android plötzlich mit 3 nicht unbedingt kompatiblen Datentypen zu haben. Dabei sollte es im Businessteil ihrer Anwendung nur die Entscheidung zwischen nationalen Zeichensatz (8 bit, char, string) geben, oder dem internationalen (wchar_t, wstring). Außerdem sind die Indizes für die Delphi Stringtypen auf den Desktop- Betriebssystemen 1 basierend, auf den mobilen Betriebssystemen aber an C und C++ orientiert 0 basierend. Auch dieses kann zu Problemen und notwendigen Anpassungen führen. Alles das wäre unter C++ einfach schlichtweg unmöglich, da hier ein Industriestandard die Investitionen des Entwicklers schützt.

Ich möchte hier eine Headerdatei für die weitere Verwendung in diesem Blog erzeugen, und dieses Problem mit Hilfe von C++- templates und der Spezialisierung dieser für spezielle Datentypen.

;