TextCanvas, Textmode Grafiken

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Warf
Beiträge: 1526
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

TextCanvas, Textmode Grafiken

Beitrag von Warf »

Hey ho Leute, im Zuge eines Projektes habe ich eine neue kleine Unit Entwickelt um Textmode Programme (Konsolenanwendungen) aufzuhübschen.

Die Idee ist, statt immer Zeile für Zeile Text auszugeben soll es dem Nutzer einfacher gemacht werden die Informationen überall über einfache Koordinaten zu ändern. Es kann entweder im 24 Farben Modus (normal) oder im 24 Bit Farbenmodus verwendet werden. Der 24 Bit Modus wird durch ein Define Col24 in den Projekteinstellungen (oder über den Compilerparameter -dCpu24) eingestellt. Allerdings unterstützt nicht jedes Terminal 24 Bit Farben (bzw. Ansi Escape strings), z.B. das Windows Konsolenfenster gehört dazu.
Im 24 Bit Modus ist es nicht möglich die Unit Crt zu verwenden, sobald diese in der Uses Klausel irgendwo auftaucht funktionier Textcanvas nicht mehr.
Der 16 Farben (default) Modus funktioniert hingegen verwendet intern die Unit Crt. Damit läuft dieser auch unter Windows, und sollte auch unter allen anderen Systemen problemlos laufen.

Zur Funktionsweise, man kann dem Canvas eine Größe Zuweisen, dann kann mit den Zeichenroutinen des Canvas auf diesem Bereich gezeichnet werden. Die Koordinaten bezeichnen dabei (0 basierend) die Zeichen auf dem Konsolenfenster beginnend in der oberen linken Ecke. Die darstellung wird mit der Methode Print dann ausgegeben. Wenn nicht anders angegeben (durch einen Parameter bei dem Aufruf von Print) werden nur die Zeilen neu gezeichnet welche geändert wurden, was das ganze selbst auf langsamen Ausgaben wie der Windows Konsole effizient gestaltet.

Neben der Klasse werden noch einige Funktionen gegeben wie MoveCursor, ClearScreen, GetWindowSize oder ReadChar, um von der Crt Unit unabhängig zu sein.

Dabei liegt auch ein Beispielprojekt welches 2 Formen und viele Buchstaben zeichnet.

Download link

Bild:
Bild

PS: Ich habe das ganze unter Windows nicht wirklich getestet, da ich es nur für Unix brauche. Außerdem gibt es ab und an Probleme mit ReadChar wenn dieses Non Blocking aufgerufen wird.

KenntKeinSchwein AG
Beiträge: 26
Registriert: So 4. Dez 2016, 13:35

Re: TextCanvas, Textmode Grafiken

Beitrag von KenntKeinSchwein AG »

Wow, das sieht ja echt gut aus. Sowas kann man wirklich gut gebrauchen :D

Mathias
Beiträge: 5095
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TextCanvas, Textmode Grafiken

Beitrag von Mathias »

Interessantes Project, dies muss ich mir mal genauer angucken.
Sehe ich es richtig, das das meiste mit Escape-Sequenzen und Write gemacht wurde ?
Oder wird doch irgendwo direkt in den Konsolenpuffer geschrieben, etwa so wie unter DOS direkt in den VRAM ?

Ich hätte da noch ein fertiges Menü, welches man noch als Ergänzung brauchen könnte.
viewtopic.php?f=29&t=8312

Ich denke Nixsager gefällt diese Unit sicher auch. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1526
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: TextCanvas, Textmode Grafiken

Beitrag von Warf »

Mathias hat geschrieben:Interessantes Project, dies muss ich mir mal genauer angucken.
Sehe ich es richtig, das das meiste mit Escape-Sequenzen und Write gemacht wurde ?
Oder wird doch irgendwo direkt in den Konsolenpuffer geschrieben, etwa so wie unter DOS direkt in den VRAM ?

Ich hätte da noch ein fertiges Menü, welches man noch als Ergänzung brauchen könnte.
viewtopic.php?f=29&t=8312

Ich denke Nixsager gefällt diese Unit sicher auch. :wink:


Wenn man im 24 Bit Modus ist wird alles über Escapesquenzen + Chars in den StdOut mit Write geschrieben (gepuffert um Performant zu sein). Im default modus wird einfach über die unit Crt die Farbe eingestellt, und danach der Char separat mittels Write geschrieben. Da kümmert sich allerdings die Unit Crt um die Pufferung, darum geben sich die beiden von der Performance nicht viel, so ist auch gesichert das es funktioniert (eben nur mit 16 Farben) falls keine String Escape Sequenzen zur verfügung stehen, wie etwa unter Windows.

Das Projekt in dessen Zug diese Unit entstanden ist, ist ein Komponentenset mit einigen standard Komponenten wie ListBoxen, Edits, Buttons etc., welche eben das Canvas als Grundlage nehmen (Daher die Methode Draw mit der man eine Graphik eines anderen Canvas auf das eigene Canvas zeichnen kann). Ich habe sogar auch schon einige Überlegungen dazu gemacht, das ganze als Abstammende Klasse von TCustomApplication aufzuziehen mit verschiedenen Forms die jehweils Controls enthalten können, und immer ein Control den Fokus hält (an welches dann Key events gesendet werden) und immer nur eine Form aktuell angezeigt werden kann. Bisher bin ich allerdings noch in der Planung mit der Eventqueue (Ob man auf Keydowns warten soll oder das ganze Multithreaded machen soll, oder non blocking read wie in meinem Example das ist aber noch verbuggt, das funktioniert bei mir nur manchmal), da bin ich noch recht unentschlossen wie ich das aufziehen möchte.

Hier ist das Github Repo zu dem Projekt, ist aber bis auf das Canvas noch nicht viel dran gemacht.

Mathias
Beiträge: 5095
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TextCanvas, Textmode Grafiken

Beitrag von Mathias »

So wie ich sehe, hat du etwas grösseres vor. :shock:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1526
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: TextCanvas, Textmode Grafiken

Beitrag von Warf »

Kleines update, es wird jetzt auch 8 Bit Farben (mit Col8 Switch) unterstützt für z.B. OSX, sowie man jetzt den 16 Farben modus mit Col4 aktiviert. Wird kein Compilerswitch gesetzt wird nach dem Betriebsystem entschieden (Linux 24 OSX 8, Sonstige 4 Bit). Außerdem funktioniert die RGB funktion nun unabhängig von der Farbtiefe
Utf8 support kommt als nächstes

Antworten