TextForms Textmode Forms

Zur Vorstellung von Komponenten und Units für Lazarus
Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

TextForms Textmode Forms

Beitrag von Warf »

Hey ho,

ich habe vor einiger Zeit mal angefangen eine Textmode-Formular Bibliothek für Konsolenanwendungen zu schreiben. Mit einem Projekt für das ich diese benutzt habe, habe ich sie nun in einen Benutzbaren status gebracht.
Die Idee ist recht simpel, die Felder in einem TTY werden zur Darstellung von Objekten verwendet. Aktuell implementiert sind Checkboxen, ListBoxen, Checklistboxen, Edits, Labels und Buttons.

Ein Beispiel Projekt ist dabei, sollte eigentlich selbsterklärend sein.

Bild:
Bild

Download:
Link

PS: Je nach dem auf was für Terminals es laufen soll muss mit entweder define Col4 (4 Bit Farben, e.g. Windows CMD) Col8 (8 Bit Farben, gängiger Unix Standard) oder Col24(24 bit Farben, xTerm) kompiliert werden (also entweder -dColX oder im lazarus projekteinstellungen). Wird das nicht angegeben wird für Linux Col24 verwendet, für Windows Col4 und sonst Col8. Wenn man möchte das es über SSH unter den meisten Terminals funktioniert sollte man Col8 nehmen, da dies mehr oder weniger der Mindeststandard ist den so gut wie jedes TTY erfüllt.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextForms Textmode Forms

Beitrag von pluto »

Läuft das ganze nur in einem Terminal welches unter einem Desktop gestartet wurde oder läuft das auch ohne das man einen Desktop startet?
Verstehe mich nicht falsch, ich denke da gerade an ncurses. Die Handharbung ist ja nicht die einfachste.

Die Grafik sieht jedenfalls recht gut aus für eine Terminal Anwendung.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextForms Textmode Forms

Beitrag von pluto »

Wenn ich das Beispiel unter Lazarus 1.9.0 kompiliere kommt in TFCanvas eine Kompiler Fehler Meldung:

Code: Alles auswählen

 
function GetArrow(seq: string): TArrowKey;
begin
  Result := akNone;
  case seq[1] of
    #27:
      if seq.length = 3 then // Hier tfcanvas.pas(107,14) Error: Illegal qualifier
        case seq[3] of
          'A': Result := akUp;
          'B': Result := akDown;
          'C': Result := akRight;
          'D': Result := akLeft;
        end;
  end;
end;
 


Das Problem kommt auch noch weiter in der Unit auf, überall wo auf Length Zugriffen werden soll.
MFG
Michael Springwald

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: TextForms Textmode Forms

Beitrag von siro »

In der Windows Umgebnung kann ich beides benutzen:

Code: Alles auswählen

 
  if seq.length = 3 then   // wuste garnicht dass sowas geht .....
  if length(seq) = 3 then   // das war ja die übliche alte Form für Strings unter DOS


evtl. nur entsprechend ändern.

Code: Alles auswählen

  if ord(seq[0]) = 3 then  // sollte auch gehen, solange es sich um Shortstrings handelt 


Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TextForms Textmode Forms

Beitrag von Warf »

pluto hat geschrieben:Läuft das ganze nur in einem Terminal welches unter einem Desktop gestartet wurde oder läuft das auch ohne das man einen Desktop startet?
Verstehe mich nicht falsch, ich denke da gerade an ncurses. Die Handharbung ist ja nicht die einfachste.

Die Grafik sieht jedenfalls recht gut aus für eine Terminal Anwendung.


Kommt drauf an ob das TTY für die ausgäbe Ansi Escape Sequenzen unterstützt. Also bei einem modernen Unix ohne Desktop sollte es mit Col8 auf jeden fall funktionieren, bei Col24 bin ich mir nicht so sicher.

Aber, es kann noch kein UTF-8, das ist mein nächstes Ziel.

pluto hat geschrieben:Wenn ich das Beispiel unter Lazarus 1.9.0 kompiliere kommt in TFCanvas eine Kompiler Fehler Meldung:

Code: Alles auswählen

 
function GetArrow(seq: string): TArrowKey;
begin
  Result := akNone;
  case seq[1] of
    #27:
      if seq.length = 3 then // Hier tfcanvas.pas(107,14) Error: Illegal qualifier
        case seq[3] of
          'A': Result := akUp;
          'B': Result := akDown;
          'C': Result := akRight;
          'D': Result := akLeft;
        end;
  end;
end;
 


Das Problem kommt auch noch weiter in der Unit auf, überall wo auf Length Zugriffen werden soll.


Welche fpc version verwendest du? das ist glaube ich erst seit ppc 3.0.2 drin

siro hat geschrieben:In der Windows Umgebnung kann ich beides benutzen:

Code: Alles auswählen

 
  if seq.length = 3 then   // wuste garnicht dass sowas geht .....
  if length(seq) = 3 then   // das war ja die übliche alte Form für Strings unter DOS


evtl. nur entsprechend ändern.

Code: Alles auswählen

  if ord(seq[0]) = 3 then  // sollte auch gehen, solange es sich um Shortstrings handelt 


Siro


Seit der Einführung von Typehelpern gibt es einige nette Spielereien, die ich seither auch recht viel verwende, z.B. .ToString von Integer oder Floats, oder .SubString von Strings. Vor allem sind diese Hilfsfunktionen für Strings 0 basiert. Das heißt 'abc'.Character[0] ist das selbe wie 'abc'.SubString(0,1) und das ist 'a'. Somit kommt man nicht so sehr mit Arrays und strings durcheinander

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

Re: TextForms Textmode Forms

Beitrag von Mathias »

ich habe vor einiger Zeit mal angefangen eine Textmode-Formular Bibliothek für Konsolenanwendungen zu schreiben.

Ich will nichts gegen dein Project einwenden, aber als kleiner Hinweis, gibt es dies mit Free Vision fix und fertig.

Ich habe da ein Tutorial in Arbeit. :wink:

viewtopic.php?f=22&t=11063&p=98205&hilit=vision#p98205

Die Grafik sieht jedenfalls recht gut aus für eine Terminal Anwendung.

Ich habe auch immer wieder Freude, wen man sieht, was man alles im Text-Modus machen kann. Unter DOS hatte es richtige Künstler von Programmierern. :shock: :wink:

So was ist sehr gefährlich.

Code: Alles auswählen

function GetArrow(seq: string): TArrowKey;
begin
  Result := akNone;
  case seq[1] of

Wen man GetArrow(''); aufruft, dann knallt es.

Seit der Einführung von Typehelpern gibt es einige nette Spielereien, die ich seither auch recht viel verwende, z.B. .ToString von Integer oder Floats, oder .SubString von Strings.

Dieses Typenhelper finde ich auch genial, ich denke dabei an String.Spitt.

PS: Ich habe gerade ein Project getestet.

Code: Alles auswählen

[Debuggerausnahmen-Nachricht]
 
Projekt example hat Exception-Klasse »ERangeError« ausgelöst mit der Meldung:
Range check error
 In Datei '../tfcanvas.pas' in Zeile 673

Getestet mit Linux 64Bit. FPC 3.0.4
Zuletzt geändert von Mathias am Fr 20. Okt 2017, 17:47, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextForms Textmode Forms

Beitrag von pluto »

Nun, ich verwende so wie es aussieht: fpc-3.0.0

Ein FPC Update ist immer nicht so einfach.... aber das ist ein anders Thema.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextForms Textmode Forms

Beitrag von pluto »

Alles klar, ich update jetzt mein fpc nicht....
und so wie es aussieht geht das nur mit dem neuen FPC.....
MFG
Michael Springwald

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

Re: TextForms Textmode Forms

Beitrag von Mathias »

Alles klar, ich update jetzt mein fpc nicht....
und so wie es aussieht geht das nur mit dem neuen FPC.....

Wen du dies auf den Typenhelper beziehst, kannst du mit FPC 3.0.4 nicht viel falsch machen.
War TypenHelper nicht schon mit 3.0.0 verfügbar ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextForms Textmode Forms

Beitrag von pluto »

Es sind leider mehrer Änderungen nötig.... Zum Beispiel sowas hier:
ACanvas.TextOut(Left + 3, Top + i, Text[i].Substring(0, Width - 3));
da meckert der Kompiler wird. Ich denke, sowas kommt noch öfter vor.
Da in dem Projekt leider gebraucht gemacht wird von neuern FPC Versionen,
habe ich auch keine Lust jetzt diese Units anzupassen, dass sie unter einem Ältern FPC läuft.

Das erinnert mich halt sehr Stark an z.b. java oder JavaScript. Das war immer das schöne an Object Pascal, dass sowas nicht ging, früher.
Wurde wohl in Delphi eingeführt und das muss jetzt unbedingt auch übernommen werden in fpc....
MFG
Michael Springwald

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

Re: TextForms Textmode Forms

Beitrag von Mathias »

habe ich auch keine Lust jetzt diese Units anzupassen, dass sie unter einem Ältern FPC läuft.

Ich dachte, FPC sei abwärts kompatibel.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TextForms Textmode Forms

Beitrag von Warf »

Mathias hat geschrieben:
ich habe vor einiger Zeit mal angefangen eine Textmode-Formular Bibliothek für Konsolenanwendungen zu schreiben.

Ich will nichts gegen dein Project einwenden, aber als kleiner Hinweis, gibt es dies mit Free Vision fix und fertig.

Ich habe da ein Tutorial in Arbeit. :wink:

viewtopic.php?f=22&t=11063&p=98205&hilit=vision#p98205

Die Grafik sieht jedenfalls recht gut aus für eine Terminal Anwendung.

Ich habe auch immer wieder Freude, wen man sieht, was man alles im Text-Modus machen kann. Unter DOS hatte es richtige Künstler von Programmierern. :shock: :wink:

So was ist sehr gefährlich.

Code: Alles auswählen

function GetArrow(seq: string): TArrowKey;
begin
  Result := akNone;
  case seq[1] of

Wen man GetArrow(''); aufruft, dann knallt es.

Seit der Einführung von Typehelpern gibt es einige nette Spielereien, die ich seither auch recht viel verwende, z.B. .ToString von Integer oder Floats, oder .SubString von Strings.

Dieses Typenhelper finde ich auch genial, ich denke dabei an String.Spitt.

PS: Ich habe gerade ein Project getestet.

Code: Alles auswählen

[Debuggerausnahmen-Nachricht]
 
Projekt example hat Exception-Klasse »ERangeError« ausgelöst mit der Meldung:
Range check error
 In Datei '../tfcanvas.pas' in Zeile 673

Getestet mit Linux 64Bit. FPC 3.0.4


Es gibt auch schon ncurses, was auch etwa das selbe macht und in wahrscheinlich die umfangreichste Bibliothek dieser Sorte ist. Ich hab das ganze einfach aus spaß gemacht.
Außerdem verwendet mein Projekt echte Klassen und keine Objects :mrgreen:

Und GetArrow werde ich dann bald fixen :D

pluto hat geschrieben:Es sind leider mehrer Änderungen nötig.... Zum Beispiel sowas hier:
ACanvas.TextOut(Left + 3, Top + i, Text[i].Substring(0, Width - 3));
da meckert der Kompiler wird. Ich denke, sowas kommt noch öfter vor.
Da in dem Projekt leider gebraucht gemacht wird von neuern FPC Versionen,
habe ich auch keine Lust jetzt diese Units anzupassen, dass sie unter einem Ältern FPC läuft.

Das erinnert mich halt sehr Stark an z.b. java oder JavaScript. Das war immer das schöne an Object Pascal, dass sowas nicht ging, früher.
Wurde wohl in Delphi eingeführt und das muss jetzt unbedingt auch übernommen werden in fpc....


Also das ganze abwärts zu Porten wäre gar nicht so wenig Aufwand, ich verwende diese Typhelfer relativ häufig.

Ich verstehe nur nicht was du daran so schlecht findest, sie sind deutlich übersichtlicher. Z.B.

Code: Alles auswählen

s := str.SubString(0, 5) +  str.Length.ToString + Str2.Split([';'])[1] + str.SubString(5);
// ohne helper
s := Copy(str, 1, 5) + IntToStr(Length(str)) + Copy(Str2, Pos(';', Str2), Length(str2)) + Copy(Str, 5, Length(str));

Also da hab ich klar einen Favoriten wenn es um Übersichtlichkeit geht und schnelles verstehen vom Code

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextForms Textmode Forms

Beitrag von pluto »

Also das ganze abwärts zu Porten wäre gar nicht so wenig Aufwand, ich verwende diese Typhelfer relativ häufig.

Klar kann man das jetzt alles anpassen oder man lässt es sein und verwenden den normalen Object Pascal Standard(Wenn es einen gibt)
oder man Updatet das FPC, das war beim letzten mal aber so viel Arbeit und Aufwand....
Ich glaube im Moment verwende ich sogar eine svn version(Ich meine die verwenden noch kein git), ich könnte mal schauen, ob es immer noch so viel aufwand ist.....
Zuletzt geändert von pluto am Fr 20. Okt 2017, 20:20, insgesamt 1-mal geändert.
MFG
Michael Springwald

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

Re: TextForms Textmode Forms

Beitrag von Mathias »

Es gibt auch schon ncurses, was auch etwa das selbe macht und in wahrscheinlich die umfangreichste Bibliothek dieser Sorte ist.
Ich dachte immer des sei eine C/C++ Bibliothek, aber da habe ich mich getäuscht, die gibt es auch unter Lazarus, aber nur unter Linux.
Ich hab das ganze einfach aus spaß gemacht.
Das kann ich mit gut vorstellen, sowas ist immer lern reich. Ich beschäftige mich momentan mit FreeVision.
Außerdem verwendet mein Projekt echte Klassen und keine Objects
Das ist bei FreeVision nicht der Fall, das sind es noch Objecte, immerhin stammt dies aus TP-Zeiten und da gab es noch keine Classen. Aber Objecte kann man fast gleich Hand haben wie Classen, sie haben sogar den Vorteil, man kann sie dynamisch und statisch verwenden. Classen sind nur dynamisch.


Klar kann man das jetzt alles anpassen oder man lässt es sein und verwenden den normalen Object Pascal Standard(Wenn es einen gibt)
oder man Updatet das FPC, das war beim letzten mal aber so viel Arbeit und Aufwand....
Ich verstehe dich da nicht ganz, wen man von 3.0.0 auf 3.0.4 Updatet, was muss man da an seinen Programmen ändern ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TextForms Textmode Forms

Beitrag von pluto »

Ich verstehe dich da nicht ganz, wen man von 3.0.0 auf 3.0.4 Updatet, was muss man da an seinen Programmen ändern ?

Man muss nicht sein Programm ändern, man muss die FPC Version ändern. Das ist aufwendig.
Bei den letzten malen war das so aufwendig und es hat lange gedauert.

Ich habe natürlich beim FPC Wiki nach gesehen und mich an der Anleitung gehalten, aber genau weiß ich das nicht mehr.
MFG
Michael Springwald

Antworten