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:
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.
TextCanvas, Textmode Grafiken
-
- Beiträge: 26
- Registriert: So 4. Dez 2016, 13:35
Re: TextCanvas, Textmode Grafiken
Wow, das sieht ja echt gut aus. Sowas kann man wirklich gut gebrauchen
-
- Beiträge: 6193
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TextCanvas, Textmode Grafiken
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.
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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 1909
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: TextCanvas, Textmode Grafiken
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.
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.
-
- Beiträge: 6193
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TextCanvas, Textmode Grafiken
So wie ich sehe, hat du etwas grösseres vor.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 1909
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: TextCanvas, Textmode Grafiken
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
Utf8 support kommt als nächstes