![]() |
Konsolenanwendung - crt.pas - Console Library
Vielleicht kennen noch einige von Euch die Problematik, dass die gute alte crt.pas von Borland irgendwann in den neueren Delphi-Versionen einfach nicht mehr da war. Ich hatte diese Herausforderung vor etlichen Jahren zu meistern. Dazu kam dann noch die Thematik, dass die ERP-Software (Warenwirtschaft) für die ich als Programmierer verantwortlich war/bin, bis Mitte der 2010er-Jahre gleichzeitig unter MS-DOS und Windows laufen sollte. Also habe ich über die Jahre viel Zeit investiert um Code zu schreiben, der mir dies ermöglichte.
Ich habe diesen Code, der über die Jahre zusammengekommen ist, in den letzten Wochen etwas strukturiert und so zusammengefasst, dass er möglichst einfach von jedem eingesetzt werden kann. Ich möchte den Code der Community als Open Source Projekt zur Verfügung stellen und habe ihn heute auf GitHub hochgeladen. ![]() Die Bibliothek umfasst heute natürlich einen deutlich größeren Funktionsumfang, als nur die crt.pas zu ersetzen. Zum Beispiel hat man die Möglichkeit dem Konsolenfenster eine beliebige Größe (nicht nur 80 x 25) zu geben, die Farben beliebig zu manipulieren, Unicode-Zeichen zu verarbeiten und sogar underline und outline von Text ist möglich. Die Schriftart und Schriftgröße des Konsolenfensters kann genauso geändert werden, wie die Position auf dem Desktop. Um nur einige Features zu nennen. Ich habe zur Bibliothek auch einige Demos hinzugefügt, um die Anwendungsmöglichkeiten einiger Features zu zeigen. Ich würde mich freuen, wenn ihr Euch das mal anschaut und mir ein Feedback gebt. |
AW: Konsolenanwendung - crt.pas - Console Library
Vergiss es gleich wieder.
Diese API ist am sterben. Es wird zukünftig nur noch die neuen Streammingfunktionen geben. Vielleicht hättest du vorher mal die Dokumentation lesen sollen? Sie strotzt hier nur noch so vor Warnhinweisen :stupid:, ala Zitat:
Zitat:
Abgesehn davon, dass in aktuellen Windows 11 nun das neue Terminal standardmäßig genutzt wird, und nicht mehr die "veraltete" CMD.exe. |
AW: Konsolenanwendung - crt.pas - Console Library
Also wenn ich sehe wie oft Microsoft schon etwas als "preferred modern solution" angepriesen hat und wie schnell es danach wieder von der Bildfläche verschwand...
Ich finds toll und werde es mir demnächst mal anschauen, auch wenn ich spontan noch keinen Anwendungsfall habe. Daumen hoch für anschauliche Bildchen auf der Github-Startseite, damit bekommt man direkt ein Feeling für das, was es ist. Ich finde das nehmen viele nicht wichtig genug. |
AW: Konsolenanwendung - crt.pas - Console Library
@himitsu:
Zitat:
Ich gehe nicht davon aus, dass die API in den nächsten Jahre streben wird, Microsoft im übrigen auch nicht. Zitat:
@Der schöne Günther: Vielen Dank! :-D |
AW: Konsolenanwendung - crt.pas - Console Library
So eine CRT-Unit wünsche ich mir für die Linux-Console.
Auf meine Linux-Server im RZ melde ich mich über Putty auf die Console an. Nutze z.B. dort den Midnight-Commander (mc). Würde mir gerne ein paar Tools schreiben, die sich wie der MC bedienen lassen. Kennt sich jemand damit aus? |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
![]() Und: Respekt an die Arbeit für die crt.pas! Müsste mal gucken, ob mein Vokabeltrainer aus Schulzeiten noch funktioniert. ;-) |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Wolfgang,
zunächst vielen Dank für Deine Mühe & die Console Library! :thumb: Bei mir beschwert sich allerdings mein etwas betagter XE5-Compiler: Zeile 254: class operator Equal(Lhs, Rhs: TCoord) : Boolean; [dcc32 Fehler] Ply.Types.pas(254): E2123 PROCEDURE, FUNCTION, PROPERTY oder VAR erwartet Ab welcher Delphi-Version ist die Console Library verwendbar? |
AW: Konsolenanwendung - crt.pas - Console Library
"class operator" eigentich schon seit D2006. :gruebel:
|
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
|
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
|
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
|
AW: Konsolenanwendung - crt.pas - Console Library
Jetzt läuft ja hinter der cmd.exe bzw. der neuen Terminal-App ein Console-Host, je nach Ziel (Windows-Console, PowerShell, Linux-Bash usw)
Ich hatte mal versucht rauszufinden, wie das intern abläuft, aber in der Hilfe noch nicht wirklich was gefunden, bzw. im QuellCode des Terminals, da sieht doch niemand durch. Sonst hätte man sich da auch "einfach" was mit Delphi bauen können. :stupid: ![]() ![]() ![]() ![]() ![]() |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
Mit der aktuellen Delphi 11 CE sollte es auf jeden Fall funktionieren. Könnte das vielleicht daran liegen, dass es ein "Helper record" ist? Ich bin mir nicht sicher ob es "Helper Records" in XE5 schon gab oder wenn ja ob es bei XE5 dann in Verbindung mit Klassenoperatoren zu dieser Fehlermeldung kommt? Du kannst mal versuchen, die beiden "class operator" auszukommentieren, die werden in der Library selbst gar nicht verwendet. Ich habe die nur drinnen, weil ich sie dann im ERP-System genutzt habe. Allerdings wird der Compiler dann sofort bei Zeile 287 wieder meckern. Wenn Du diese beiden auch noch auskommentierst, dann kommt eine Fehlermeldung in Zeile 3286 der Ply.Console.pas. Die Zeile kannst Du (zum testen) auch einfach auskommentieren, da wird zwar dann unnötiger Code ausgeführt, sollte aber nichts machen. Wenn sich der Code dann kompilieren lässt, liegt es an den Helper Record in Verbindung mit class operator. -> Ich könnte dann {$ifdef} einbauen und den Code mit XE5 kompatibel machen. |
AW: Konsolenanwendung - crt.pas - Console Library
XE5 kennt leider noch keinen RecordHelper.
Habe versucht Deinen Hinweis umzusetzen, aber das Auskommentieren verursachte weitere Compiler-Fehler in Folge. Auch ein Ersetzen von class operator durch Function führte zu keinem Erfolg, da es dann später bei TCoordHelper.notEqual(..) zu Problemen führte, noch in der ersten Datei Ply.Types.pas. Möglicherweise habe ich mich ungeschickt angestellt.. :oops: Vielleicht wäre Dein fachkundig verwendeter {$ifdef} die bessere Lösung. :gruebel: |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
Ferner wäre es natürlich interessant zu wissen, ob der Code auch kompatibel zum Windows-Terminal gemacht werden kann. Ein kurzer Test war da eigentlich sehr vielversprechend. Einige der Grundfunktionen die ich nutze scheinen direkt vom Terminal unterstüzt zu werden. Aber für eine ordentliche Bewertung muss ich mich wohl erst mal wieder in der MSDN und/oder der Dokumentation vom Terminal eingraben...:roll: |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
|
AW: Konsolenanwendung - crt.pas - Console Library
Ich habe gestern mein altes Delphi XE6 ausgegraben (installiert) und den Code überarbeitet. An den RecordHelpern liegt es bei XE6 nicht, die gab es da auch schon. Da muss es irgendeine Änderung mit den "class operator" gegeben habe. Ich habe jetzt eine Compilerweiche ($IFDEF) zwischen Delphi XE8 und Delphi 10 eingebaut, sodass der Code mit XE6 (und hoffentlich auch XE5) kompiliert werden kann. Das Update ist auf GitHub zu finden.
![]() |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
Delphi-Quellcode:
Laut hier ->
function IsConsole: Boolean;
var Stdout: THandle; begin Stdout := GetStdHandle(Std_Output_Handle); Win32Check(Stdout <> Invalid_Handle_Value); Result := Stdout <> 0; end; ![]() |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
Delphi-Quellcode:
ConHandleStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
Zum Beispiel die Demo01 (Minimal_Console_App) läuft auch auf einem Terminal. Aber wenn es dann an die erweiterten Funktionen, wie z.B. manipulieren des Font, Änderung der Größe des Konsolenfensters, u.s.w. geht, dann funktioniert das nicht mehr wie gehabt. |
AW: Konsolenanwendung - crt.pas - Console Library
Ich verstehe.
Was für einen Prozess startet denn eine Konsolen Anwendung mit installierten Terminal? Mit der klassischen Konsolen Anwendung hab ich "conhost.exe" unter meiner ProcessID. |
AW: Konsolenanwendung - crt.pas - Console Library
GetStdHandle sollte so oder so gehen, denn ob die CMD oder das Terminal, die Daten-Pipe bleibt die Gleiche.
Nur dass sie seit einer Weile über die ConHost-EXEn behandelt werden und es somit möglich ist hinten einen anderen Viewer anzuhängen oder vorne eine andere Datenquelle (Console, PowerShell, Python, eine Linux-Bash, sowie die Consolen vom MAC, Android, Azure, AWS usw.). Wie gesagt, die alte API läuft parallel zu den 3 Consolen-Handle vom Windows, über einen eigenen Kanal. (weiß garnicht, ob Linux einen eigenen Error-Stream hat, aber da eh kaum Windows-Programme Diesen nutzen, ist er fast egal) Im neuen Streaming werden Daten und Control-Befehle im selben Stream übertragen. Ähnlich wie ganz früher, mit den EscapeCodes. Sobald beim Start die Console nicht verbunden war (z.B. bei einer VCL-Anwendung), oder wenn die Pipe umgeleitet wird, oder der "Viewer" diese ControlPipe nicht explizit abfragt, dann kann das nicht funktionieren. Über AttachConsole/AllocConsole könnte man prüfen ob eine "Console" dran hängt, oder z.B. die Pipe in ein anderes Programm umgeleitet ist. (siehe mein alter FileSplitter, der prüfte, ob er aus der Console, bzw. einer Batch, oder z.B. aus dem Explorer, einem Link oder via ShellExecute/CreateProcess gestartet wurde) |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
Wenn ich das Programm als Konsolenhost starte, dann habe ich in der Prozessliste eine "conhost.exe" und die "Demo01_Minimal_Console_App.exe". |
AW: Konsolenanwendung - crt.pas - Console Library
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Wolfgang,
vielen Dank für die Anpassung & Verbesserung Deiner Console Library an ältere Delphi-Versionen! :-D Nun lassen sich mit XE5 alle 9 Units der Bibliothek kompilieren. :thumb: Allerdings läßt sich nur ein einziges der 8 Demo-Programme kompilieren: Demo01_Minimal_Console_App.dpr Bei den übrigen kommt es zu etlichen Fehlermeldungen:
Delphi-Quellcode:
Weitere Fehlermeldungen habe ich im Anhang.
u. a.
begin Result := (FTextAttr and COMMON_LVB_REVERSE_VIDEO) = COMMON_LVB_REVERSE_VIDEO; end; [dcc32 Fehler] Ply.Console.pas(951): E2003 Undeklarierter Bezeichner: 'COMMON_LVB_REVERSE_VIDEO' … [dcc32 Fehler] Ply.Console.pas(963): E2003 Undeklarierter Bezeichner: 'COMMON_LVB_GRID_HORIZONTAL' [dcc32 Fehler] Ply.Console.pas(981): E2003 Undeklarierter Bezeichner: 'COMMON_LVB_GRID_LVERTICAL' [dcc32 Fehler] Ply.Console.pas(987): E2003 Undeklarierter Bezeichner: 'COMMON_LVB_UNDERSCORE' [dcc32 Fehler] Ply.Console.pas(999): E2003 Undeklarierter Bezeichner: 'COMMON_LVB_GRID_RVERTICAL' etc. Vielleicht findest Du noch eine Lösung für XE5-Benutzer(innen)... |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Andreas,
bitte schau noch einmal ob sich Demo01 wirklich immer noch kompilieren lässt. Ich würde vermuten, da hat sich bei Dir irgendwo im Quellcode ein oder mehrere Zeichen eingeschlichen, die da nicht sein sollten. Wenn sich Demo01 kompilieren lässt, warum sollte sich die Ply.Console.Pas (die bei Demo01 auch benötigt wird) dann bei Demo02 nicht mehr kompilieren lassen? :gruebel: Wenn alles nicht hilft, mach bitte noch einmal einen neuen pull von GitHub. |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Wolfgang,
Du hast recht: Auch Demo01_Minimal_Console_App.dpr läßt sich nicht kompilieren:
Delphi-Quellcode:
Die erste Zeile
[dcc32 Fehler] Demo01_Minimal_Console_App.dpr(13): E2003 Undeklarierter Bezeichner: 'Console'
[dcc32 Fehler] Demo01_Minimal_Console_App.dpr(13): E2035 Nicht genügend wirkliche Parameter
Delphi-Quellcode:
verursacht die Probleme.
Console.Window(80,25);
Versehentlich hatte ich am Nachmittag eine Kopie von Demo01_Minimal_Console_App.dpr von gestern kompiliert...:oops: |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Andreas,
irgendwie macht das keinen Sinn. Wenn Du sagst Zitat:
Oder der Compiler findet noch irgendeine andere crt.pas oder crt.dcu? Schau mal im globalen Suchpfad, siehe "Tools -> Optionen -> Delphi -> Bibliothek" o.ä. je nach Delphi-Version. Das würde erklären, warum der dann in der Unit Crt keine "Var Console" findet. |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Wolfgang,
ich habe gerade die Lösung für mein Compiler-Problem gefunden: Bei mir gibt es noch eine andere Unit namens Crt.pas und diese Unit steht bei mir im Suchpfad und wird zuerst gefunden. Weil ich die Directory-Struktur Deiner Console-Master Library nicht geändert habe, klappt es bei mir mit den Demos erst, wenn ich den Pfad für Dein Crt.pas wie folgt ändere:
Delphi-Quellcode:
oder z.B. in Ply.Crt.pas umbenenne.
...
uses Crt in '..\Crt.pas', ; ... Tolle & nützliche Bibliothek! :thumb: :thumb: Danke! :-D |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Andreas,
Zitat:
Da war ich ja schon auf der richtigen Spur, dass da eine andere crt.pas im Spiel ist. Ich habe deinen Vorschlag Zitat:
________________________ Ich habe heute das "Demo09_BuiltIn_Features" dem GitHub-Repository hinzugefügt. Das Demo soll die Funktionsweise einiger eingebauten Funktionen erklären, welche ohne extra Code automatisch zur Verfügung stehen sobald meine crt.pas bzw. Ply.Console.Extended.pas im Uses steht. |
AW: Konsolenanwendung - crt.pas - Console Library
Vielen Dank, Wolfgang! :thumb: :-D
[Edit] PS: Im Demo09_BuiltIn_Features.dpr ist in Zeile 50 eine Inline-Deklaration
Delphi-Quellcode:
welche ältere Delphi-Versionen (auch XE5) noch nicht verstehen. Aber das läßt sich einfach umschreiben.
Var FrameAttr := TTextAttr.Create(White, Red);
|
AW: Konsolenanwendung - crt.pas - Console Library
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Wolfgang,
mir ist aufgefallen, daß tConsoleInfoEx zwei kleinere Speicherlecks (117 - 124 Bytes) verursacht. Die Fehlermeldung findest Du im Anhang. Könntest Du bitte bei Gelegenheit nachschauen, woran das liegen kann? Vielen Dank! |
AW: Konsolenanwendung - crt.pas - Console Library
PS: Strg+C in dem "Dialog" (geht auch bei den Fehlermeldung des Compilers)
und dann hier mit Strg+V als Text rein. |
AW: Konsolenanwendung - crt.pas - Console Library
Danke Himitsu,
das war mir nicht bekannt. :oops: --------------------------- Unexpected Memory Leak --------------------------- An unexpected memory leak has occurred. The unexpected small block leaks are: 117 - 124 bytes: tConsoleInfoEx x 2 --------------------------- OK --------------------------- |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Andreas,
ja, vielen Dank! Du hast Recht, da haben 2 Free's gefehlt. Ich habe das gefixt und auf GitHub aktualisiert. |
AW: Konsolenanwendung - crt.pas - Console Library
Hallo Wolfgang,
danke für die Korrekturen! Allerdings rebelliert mein XE5 und meldet:
Code:
Hast Du eine Idee?
[dcc32 Fehler] Crt.pas(2920): E2003 Undeklarierter Bezeichner: 'AutoOpacityOnFocus'
[dcc32 Fehler] Crt.pas(2923): E2003 Undeklarierter Bezeichner: 'Opacity' [dcc32 Fehler] Crt.pas(2924): E2003 Undeklarierter Bezeichner: 'Opacity' [dcc32 Fataler Fehler] F2063 Verwendete Unit 'crt.pas' kann nicht compiliert werden |
AW: Konsolenanwendung - crt.pas - Console Library
Zitat:
|
AW: Konsolenanwendung - crt.pas - Console Library
Herzlichen Dank für Deine Hilfe & Mühe, Wolfgang! :-D
Jetzt funktioniert's! :thumb: |
AW: Konsolenanwendung - crt.pas - Console Library
Gerne! :)
|
AW: Konsolenanwendung - crt.pas - Console Library
Hi Wolfgang,
(wie) kann man im Fenster der Konsolenanwendung zurückblättern, wenn der Inhalt überläuft? Ich verwende Deine Bibliothek für Ausgabe der Ergebnisse umfangreicher Berechnungen, die mehrere 100 Zeilen Kolonnen voller Zahlen liefern. Leider sehe ich nur die letzten paar Zeilen davon. Kann man einen Scrollbar aktivieren? Danke! |
AW: Konsolenanwendung - crt.pas - Console Library
![]() Aber wie bereits gesagt ... Zitat:
|
AW: Konsolenanwendung - crt.pas - Console Library
Was spricht dagegen die Ausgaben in eine Textdatei zu schreiben oder über eine Pipe/Socket zu senden?
Ansonsten, die Tasten PageUp/PageDown sollten gehen falls es sich um eine echte Konsolenausgabe handelt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz