Entwickler-Ecke
Sonstiges (Delphi) - console tutorial suche
DL_Ricko - So 30.08.09 00:01
Titel: console tutorial suche
ich suche eine delphi consolen tutorial
mfg dl_ricko
FinnO - So 30.08.09 00:09
ich dachte du kennst dich da aus...
gibt nicht viel zu wissen... Ist halt normales Delphi, nur dass alles zwischen
begin und
end. von oben nach unten durchgeht.
mit ReadLn und WriteLn liest bzw. schreibt man eine Zeile in der Konsole... allgemein könnte eine Konsolenanwendung so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| program Hallo Welt;
{$APPTYPE CONSOLE}
uses SysUtils;
procedure SchreibeHalloWelt; begin WriteLn('Hallo Welt... hier kommt mein Betribssystem'); end; begin SchreibeHalloWelt; ReadLn; end. |
Delete - So 30.08.09 00:09
Hi :)
In deinem anderem Thread hast du doch eigentlich behauptet , dass du dich mit der Konsolen-Programmierung unter Delphi auskennts. Nunja , mir ist eigentlich kein Tutorial bekannt , aber vielleicht kann ich trotzdem helfen wenn du mir einfach sagts wo es genau hakt du nich weiterkommts.
Falls du lieber ein Tutorial sehen möchtest , würde ich Google vorschlagen.
MfG , Jesse
DL_Ricko - So 30.08.09 00:12
man hat nie aus gelernt
FinnO - So 30.08.09 00:15
weise Männer, weise Sprüche
*wegschmeiß*
DL_Ricko - So 30.08.09 00:19
ja abe rich muss noch mehr wissen da mit das klapt
und P.S: wie kann man was bei der console sagen wir unten in die rechte ecke ein text anzeigen lassen wie kan man das
FinnO - So 30.08.09 00:22
nö kann man nicht... ist auch nicht sinnvoll...
DL_Ricko - So 30.08.09 00:23
ok hast recht ist doof
Tilman - So 30.08.09 01:30
@Ricko unter QBasic geht das mit Locate... unter Delphi gibts da soweit ich weiß kein einfaches Rezept, wenn es überhaupt geht. Das einzige was mir Spontan einfällt, ein Konsolenfenster hat glaub ich 25 Zeilen und 80 Spalten im Normalfall, also könnte man sich eine eigene Engine basteln die dann die Konsole immer als ganze "Seite" ausgibt so wie man sie braucht... wäre aber sicher nicht besonders schnell.
@FinnO wenn man ein Spiel im Textmodus programmieren will ist sowas schon Nützlich. Oder allgemein Textmodus-basierte Programme wie edit.com etc.
DL_Ricko - So 30.08.09 01:32
ok danke und das das so geht bei qbasic weis ich
Hobby-Programmierer - So 30.08.09 02:18
Hallo Ricko ...,
was Du net alles weisst :wink:
Ein Konsolentutorial habe ich zwar auch net gefunden, aber gute Tutorials findest Du bei
http://www.delphi-treff.de/tutorials/. Grundsätzlich finde ich es Super das Du dich diesmal vorher informierst :zustimm:
Delete - So 30.08.09 03:06
Ein Konsolenprogramm ist auch nichts anderes als ein normales Delphi Programm ohne Benutzeroberfläche. da gibt es nichts zu lernen und ein Tutorial ist deswegen überflüssig. man kann genauso struktureirt Programmieren mit Funktionen, Prozeduren und Klasse wie in jedem anderem Delphi Programm auch.
Auch in einer Konsole kann man den Cursor positionieren, wo der Text ausgegeben werden soll. Das zu bietet die Win32-API entsprechende Funktionen. Eine Oliver hat mal dafür eine Include-Datei zusammengestellt, um die Handhabung zu erleichtern:
http://www.michael-puff.de/Developer/Delphi/Units/ -> ConTools.inc
Timosch - So 30.08.09 11:06
Tilman hat folgendes geschrieben : |
@Ricko unter QBasic geht das mit Locate... unter Delphi gibts da soweit ich weiß kein einfaches Rezept, wenn es überhaupt geht. Das einzige was mir Spontan einfällt, ein Konsolenfenster hat glaub ich 25 Zeilen und 80 Spalten im Normalfall, also könnte man sich eine eigene Engine basteln die dann die Konsole immer als ganze "Seite" ausgibt so wie man sie braucht... wäre aber sicher nicht besonders schnell.
|
Unter Delphi 1 ging das AFAIK, da gabs ne Unit dafür. Mal sehen, obs irgendwo eine Art Nachfolger zum Runterladen gibt... (wenn ich noch wüsste, wie die heißt^^)
jaenicke - So 30.08.09 11:17
Timosch hat folgendes geschrieben : |
| Unter Delphi 1 ging das AFAIK, da gabs ne Unit dafür. |
Du meinst sowas wie die crt-Unit aus Turbo Pascal nehme ich an, bei Delphi 1 gab es dafür die wincrt-Unit. Sowas gibts bestimmt auch für neuere Versionen.
// EDIT:
Oh, war sehr schwer zu finden, gibt sogar ne Kategorie CRT dafür bei Torry: :mrgreen:
http://www.torry.net/pages.php?id=236
Timosch - So 30.08.09 13:42
In der Tat - wenn man sich an den Namen erinnert... :mrgreen: Genau, CRT, das wars...
Tilo - So 30.08.09 14:29
Bin mal gespannt ob die klassen mit crt irgenwann in tft umgenannt werden.
(Seitenblick auf die Röhrenmonitoren, deren Zahl schwindet).
Tilman - So 30.08.09 14:50
wincrt kenn ich auch noch... bevor ich mit Delphi angefangen habe hab ich mich an Turbo Pascal (für Windows) versucht, da war die Unit dabei. Wobei ich immer annahm dass CRT eine Abkürzung für Caret (Schreibmarke) ist.
DonManfred - Mo 31.08.09 14:02
Cathode Ray Tube, englisch für Kathodenstrahlröhre in der Elektrotechnik, eingesetzt in Kathodenstrahlröhrenbildschirmen
Tilman - Mo 31.08.09 14:09
DonManfred hat folgendes geschrieben : |
| Cathode Ray Tube, englisch für Kathodenstrahlröhre in der Elektrotechnik, eingesetzt in Kathodenstrahlröhrenbildschirmen |
Schon richtig, nur stellt sich mir die Frage was das mit dem Textmodus zu tun haben soll, genauso hätte man ja eine Grafikunit WinCRT nennen können. Aber egal, ich glaube es ja schon ;)
DonManfred - Mo 31.08.09 15:59
Tilman hat folgendes geschrieben : |
| Schon richtig, nur stellt sich mir die Frage was das mit dem Textmodus zu tun haben soll, genauso hätte man ja eine Grafikunit WinCRT nennen können. Aber egal, ich glaube es ja schon ;) |
Die Dateinamensgebung bei Microsoft erschliesst sich mir auch nicht immer :D
Es ist Microsoft, da denke ich dann über solche Dinge nicht gross nach und nehme es hin wie gegeben :-)
Martok - Mo 31.08.09 16:04
DonManfred hat folgendes geschrieben : |
Die Dateinamensgebung bei Microsoft erschliesst sich mir auch nicht immer :D
Es ist Microsoft, da denke ich dann über solche Dinge nicht gross nach und nehme es hin wie gegeben :-) |
Nur ist TurboPascal/Delphi leider von Borland...
Und damit sind wir völlig OT, oder?
Muck - Mo 31.08.09 17:54
Hallo,
zurueck zur eigentlichen Frage der Cursorsteuerung in einer DOS BOX.
Habe damals viele Spiele (80er) fuer ne mailbox geschrieben. (2400 BAUD, falls sich andere erinnern GRINS)
Zur Steuerung von Farben und Cursor wurden dort Ansi-Escape Sequenzen genutzt.
Alles was man tun muss ist die ANSI.SYS mit passenden Parametern in der config.sys des Dos Fensters installieren. Google nach den ANSI Sequenzen. Und die ANSI.SYS gibt es noch, zumindest habe ich sie auf meinem XP Rechner.
Auch kann man sich eine Beschreibung des grafikkarten Assembler satzes besorgen und einfach den Textmodus der Grafikkarte direkt ansprechen durch Aufrufe des DOS Interrupt $10 mit passendem Parameter im Register AH.
Google nach DOS Interrupt Listen, da findet man eigentlich alles.
Und dann war da noch die unsaubere Methode einfach direkt in den Textmodusspeicher an der Adresse $B800:0000 zu schreiben. 80x25 Doppelbytes. Jeweils ein Byte fuer Farb Info und ein Byte Ascii.
cu
Markus
Muck - Mo 31.08.09 18:07
Hallo,
habe mal in der alten Kiste gestoebert.
Hier meine CRT32.PAS, habe die mal unter Delphi im Jahr 2002 genutzt.
Ich weiss nicht, ob die mit Delphi 2009 rennt, Delphi 2007 sollte klappen.
Falls Interesse:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215:
| CONST
CheckBreak = True; CheckEOF = True; DirectVideo = True; CheckSnow = False;
VAR StartAttr : Word; CrtPipe : Boolean; CrtInPipe : boolean; German : Boolean; Delphirun : Boolean;
PROCEDURE OEMCode; begin if AreFileApisANSI then SetFileApisToOEM; end;
PROCEDURE ClrEol; VAR tC : TCoord;Len, Nw : LongWord;Cbi : TConsoleScreenBufferInfo; BEGIN GetConsoleScreenBufferInfo(hConsoleOutput, Cbi); Len := Cbi.dwSize.x-Cbi.dwCursorPosition.x; tC.x := Cbi.dwCursorPosition.x; tC.y := Cbi.dwCursorPosition.y; FillConsoleOutputAttribute(hConsoleOutput, TextAttr, Len, tC, Nw); FillConsoleOutputCharacter(hConsoleOutput, ' ', Len, tC, Nw); END;
PROCEDURE ClrScr; VAR tC : TCoord; Nw : LongWord; Cbi : TConsoleScreenBufferInfo; BEGIN GetConsoleScreenBufferInfo(hConsoleOutput, Cbi); tC.x := 0; tC.y := 0; FillConsoleOutputAttribute(hConsoleOutput, TextAttr, Cbi.dwSize.x*Cbi.dwSize.y, tC, Nw); FillConsoleOutputCharacter(hConsoleOutput, ' ', Cbi.dwSize.x*Cbi.dwSize.y, tC, Nw); SetConsoleCursorPosition(hConsoleOutput, tC); END;
FUNCTION WhereX : Integer; VAR Cbi : TConsoleScreenBufferInfo; BEGIN GetConsoleScreenBufferInfo(hConsoleOutput, Cbi); Result := TCoord(Cbi.dwCursorPosition).x+1 END;
FUNCTION WhereY : Integer; VAR Cbi : TConsoleScreenBufferInfo; BEGIN GetConsoleScreenBufferInfo(hConsoleOutput, Cbi); Result := TCoord(Cbi.dwCursorPosition).y+1 END;
PROCEDURE GotoXY(CONST x, y : Integer); VAR Coord : TCoord; BEGIN Coord.x := x-1; Coord.y := y-1; SetConsoleCursorPosition(hConsoleOutput, Coord) END;
PROCEDURE InsLine; VAR Cbi : TConsoleScreenBufferInfo;sSR : TSmallRect;Coord : TCoord; CI : TCharInfo;Nw : LongWord; BEGIN GetConsoleScreenBufferInfo(hConsoleOutput, Cbi); Coord := Cbi.dwCursorPosition; sSR.left := 0; sSR.Top := Coord.y; sSR.Right := Cbi.srWindow.Right; sSR.Bottom := Cbi.srWindow.Bottom; CI.AsciiChar := ' '; CI.Attributes := Cbi.wAttributes; Coord.x := 0; Coord.y := Coord.y+1; ScrollConsoleScreenBuffer(hConsoleOutput, sSR, NIL, Coord, CI); Coord.y := Coord.y-1; FillConsoleOutputAttribute(hConsoleOutput, TextAttr, Cbi.dwSize.x*Cbi.dwSize.y, Coord, Nw); END;
PROCEDURE DelLine; VAR Cbi : TConsoleScreenBufferInfo;sSR : TSmallRect;Coord : TCoord; CI : TCharInfo;Nw : LongWord; BEGIN GetConsoleScreenBufferInfo(hConsoleOutput, Cbi); Coord := Cbi.dwCursorPosition; sSR.left := 0; sSR.Top := Coord.y+1; sSR.Right := Cbi.srWindow.Right; sSR.Bottom := Cbi.srWindow.Bottom; CI.AsciiChar := ' '; CI.Attributes := Cbi.wAttributes; Coord.x := 0; Coord.y := Coord.y; ScrollConsoleScreenBuffer(hConsoleOutput, sSR, NIL, Coord, CI); FillConsoleOutputAttribute(hConsoleOutput, TextAttr, Cbi.dwSize.x*Cbi.dwSize.y, Coord, Nw); END;
PROCEDURE TextBackground(CONST Color : Word); BEGIN LastMode := TextAttr; TextAttr := (Color SHL 4) OR (TextAttr AND $f); SetConsoleTextAttribute(hConsoleOutput, TextAttr); END;
PROCEDURE TextColor(CONST Color : Word); BEGIN LastMode := TextAttr; TextAttr := (Color AND $f) OR (TextAttr AND $f0); SetConsoleTextAttribute(hConsoleOutput, TextAttr); END;
PROCEDURE RestoreCrt; BEGIN Normvideo; END;
Procedure CRTLesen; VAR Cbi:TConsoleScreenBufferInfo;tC : TCoord; begin IF GetConsoleScreenBufferInfo(hConsoleOutput, Cbi) THEN BEGIN TextAttr := Cbi.wAttributes; StartAttr := Cbi.wAttributes; LastMode := Cbi.wAttributes; tC.x := Cbi.srWindow.left+1; tC.y := Cbi.srWindow.Top+1; WindMin := tC; ViewMax := Cbi.dwSize; tC.x := Cbi.srWindow.Right+1; tC.y := Cbi.srWindow.Bottom+1; WindMax := tC; CrtPipe := False; END ELSE CrtPipe := True; end;
PROCEDURE TextMode(Cols,Rows:Word); var X:TCoord;Y:Small_rect; BEGIN X.X:=Cols;X.Y:=Rows; Y.Left:=0;Y.Top:=0;Y.Right:=Cols-1;Y.Bottom:=Rows-1; SetConsoleScreenBufferSize(hConsoleOutput,X); SetConsoleWindowInfo(hConsoleOutput,true,Y); CrtLesen; X80:=ViewMax.X; END;
PROCEDURE TextAttribut(CONST Color, Background : Word); BEGIN LastMode := TextAttr; TextAttr := (Color AND $f) OR (Background SHL 4); SetConsoleTextAttribute(hConsoleOutput, TextAttr); END;
PROCEDURE HighVideo; BEGIN LastMode := TextAttr; TextAttr := TextAttr OR $8; SetConsoleTextAttribute(hConsoleOutput, TextAttr); END;
PROCEDURE LowVideo; BEGIN LastMode := TextAttr; TextAttr := TextAttr AND $f7; SetConsoleTextAttribute(hConsoleOutput, TextAttr); END;
PROCEDURE NormVideo; BEGIN LastMode := TextAttr; TextAttr := StartAttr; SetConsoleTextAttribute(hConsoleOutput, TextAttr); END;
PROCEDURE FlushInputBuffer; BEGIN FlushConsoleInputBuffer(hConsoleInput) END;
FUNCTION KeyPressed : Boolean; VAR NumberOfEvents : LongWord; BEGIN GetNumberOfConsoleInputEvents(hConsoleInput, NumberOfEvents); Result := (NumberOfEvents > 0) or SendKeyDa or (Wiederholen>0); END;
Procedure SetCursorSize(WieGross:Byte;IstDa:Boolean); var CCI:TConsoleCursorInfo; begin CCI.dwSize:=WieGross;CCI.bVisible:=IstDa; SetConsoleCursorInfo(hConsoleOutput,CCI); end;
PROCEDURE Init; BEGIN SetActiveWindow(0); OEMCode; hConsoleInput := GetStdHandle(STD_INPUT_HANDLE); hConsoleOutput := GetStdHandle(STD_OUTPUT_HANDLE); HConsoleError := GetStdHandle(STD_ERROR_HANDLE); CrtInPipe := getfiletype(hConsoleInput) = FILE_TYPE_PIPE; AssignFile(StdError, ''); ReWrite(StdError); TTextRec(StdError).Handle := HConsoleError; CrtLesen; GetConsoleCursorInfo(hConsoleOutput,CI); GetConsoleMode(hConsoleOutput,lpMode); SetConsoleMode(hConsoleOutput,lpMode-Enable_Wrap_at_eol_output); GetConsoleMode(hConsoleInput,ipMode); SetConsoleMode(hConsoleInput,(ipMode-ENABLE_PROCESSED_INPUT) or ENABLE_WINDOW_INPUT or ENABLE_MOUSE_INPUT); END; |
Delete - Mo 31.08.09 22:56
Muck hat folgendes geschrieben : |
Zur Steuerung von Farben und Cursor wurden dort Ansi-Escape Sequenzen genutzt.
Alles was man tun muss ist die ANSI.SYS mit passenden Parametern in der config.sys des Dos Fensters installieren. Google nach den ANSI Sequenzen. Und die ANSI.SYS gibt es noch, zumindest habe ich sie auf meinem XP Rechner. |
Die Konsole hat nichts mit DOS und 16-Bit Anwendungen zu tun. Die Konsole dient nur dazu 32-Bit Windows Programme ohne Benutzeroberfläche auszuführen.
Muck - Mo 31.08.09 23:12
Hi,
ich habe die alte CRT32.pas hier angegeben, um zu zeigen, dass man sehr wohl eine Benutzerobeflaeche im ALTEN DOS Stil in eine 32 BIT EXE packen kann. Ich zeige hier was geht, nicht wozu die Konsole dient.
Jeder kann dann selbst entscheiden, was er damit machen will.
bis denne
Delete - Di 01.09.09 00:15
Schon klar. das sind ja auch alles Windows API Funktionen. Mein verlinkte Include-Datei macht auch nichts anderes, als die Win-API Funktionen zu kapseln.
Timosch - Di 01.09.09 09:36
Muck hat folgendes geschrieben : |
Auch kann man sich eine Beschreibung des grafikkarten Assembler satzes besorgen und einfach den Textmodus der Grafikkarte direkt ansprechen durch Aufrufe des DOS Interrupt $10 mit passendem Parameter im Register AH.
Google nach DOS Interrupt Listen, da findet man eigentlich alles.
Und dann war da noch die unsaubere Methode einfach direkt in den Textmodusspeicher an der Adresse $B800:0000 zu schreiben. 80x25 Doppelbytes. Jeweils ein Byte fuer Farb Info und ein Byte Ascii.
|
Ja, mit dem int 10h hab ich häufig rumgespielt, aber weder das noch der Zugriff auf den Textmodusspeicher wird unter 32-Bit-Windows funktionieren.
Delete - Di 01.09.09 14:36
Timosch hat folgendes geschrieben : |
| Ja, mit dem int 10h hab ich häufig rumgespielt, aber weder das noch der Zugriff auf den Textmodusspeicher wird unter 32-Bit-Windows funktionieren. |
... weil Windows direkte Hardwarezugriffe unterbindet, aus Sicherheitsgründen.
Boldar - Di 01.09.09 16:36
...Aber Unser Luckie könnte dafür sicherlich einen Treiber basteln, wenn er wirklich wollte...
So großes Vertrauen in deine Fähigkeiten haben wir...
Delete - Di 01.09.09 17:20
Könnte wohl jeder. Der Unterschied liegt nur darin, wie lange man braucht, sich das nötige Wissen und die nötigen Fähigkeiten anzueignen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!