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;{ TODO -oUser -cConsole Main : Hier Code einfügen }
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

user profile iconTilman hat folgendes geschrieben Zum zitierten Posting springen:
@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

user profile iconTimosch hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

// 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

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

user profile iconDonManfred hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconTilman hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconDonManfred hat folgendes geschrieben Zum zitierten Posting springen:
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?


Dude566 - Mo 31.08.09 17:09

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDonManfred hat folgendes geschrieben Zum zitierten Posting springen:
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?


ich fands gerade amüsant zu lesen, aber natürlich passt es nicht hier her.


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;
//  if not AreFileApisANSI then SetFileApisToANSI;
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 4OR (TextAttr AND $f);
SetConsoleTextAttribute(hConsoleOutput, TextAttr);
END;

PROCEDURE TextColor(CONST Color : Word);
BEGIN
LastMode := TextAttr;
TextAttr := (Color AND $fOR (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 $fOR (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 > 0or 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

user profile iconMuck hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconMuck hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconTimosch hat folgendes geschrieben Zum zitierten Posting springen:
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.


Jakob_Ullmann - Di 01.09.09 17:42

Hab noch ein etwas längeres "Tutorial", was meiner Meinung nach wirklich gut ist und genau bei den Konsolen anfängt:

http://de.wikibooks.org/wiki/Delphi
http://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Aufbau_eines_Delphi-Programms