Autor Beitrag
Gorthaur
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Di 28.02.06 22:52 
Moin!

Ich weiß, das Thema ist alt und gabs schon öfter, dennoch sind bei mir noch Fragen geblieben zu denen ich bisher noch in keinem Thread antworten gefunden habe.

Ich schreibe Konsolenanwendungen unter Delphi und möchte die Funktionen, wie z.B. clrscr, readkey oder GoToXY, welche es unter Turbo Pascal in der Unit CRT gab auch gerne unter Delphi benutzen. Leider gibt es diese Unit unter Delphi nicht mehr und für viele Funktionen wie ClrScr gibt es (scheinbar) auch keinen Ersatz.

Warum ist das so???

Ich habe mehrfach gelesen das man irgendwelche Include Dateine einbinden kann, um die CRT-Funktionen auch unter Delphi zu verwenden.

Wie genau funktioniert das und wo bekomme ich die her?

Schonmal THX im Voraus...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.03.06 00:31 
Richtig, diese Frage hatten wir gestern erst. Olli hat in der Include-datei ConTools.inc diese Funktionen für die Windows-Konsole implementiert: www.michael-puff.de/...hi/Importe/Assarbad/

Warum die nicht mehr dabei ist? Weil Delphi primär als Entwicklungsumgebung für Windows GUI Anwendungen von Borland entwickelt wurde.
Gorthaur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Mi 01.03.06 00:51 
Entschuldige meine Unwissenheit, aber wie "installiert" man diese Datei? Das ist doch nur ein Text???
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.03.06 00:56 
pas-Dateien sind "auch nur Text". ;)

ausblenden Delphi-Quelltext
1:
{$include ConTools.inc}					

irgendwo nach den Uses Anweisungen aber noch bevor eine Funktion daraus genutzt werden soll.
Gorthaur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Mi 01.03.06 00:59 
Muss ich den gesamten Text in den Quelltext einfügen?
Oder muss ich den Text als *.inc Datei irgendwo im Delphi Ordner speichern und im Quelltext wie bei einer Unit darauf verweisen?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.03.06 01:16 
Speicher die Datei in deinem Projektordner ab und füge die Include-Anweisung hinzu.
Vera
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82

WinXP Home
Delphi 2005 Personal
BeitragVerfasst: Mi 01.03.06 11:14 
Hallo Gorthaur,

statt die Datei per Include einzufügen würde ich Dir empfehlen eine richtige Unit daraus zu machen:
ausblenden volle Höhe uConsole.pas
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:
(****************************************************************
 ****************************************************************
 ***                                                          ***
 ***        Copyright (c) 2001 by -=Assarbad [GoP]=-          ***
 ***       ____________                 ___________           ***
 ***      /\   ________\               /\   _____  \          ***
 ***     /  \  \       /    __________/  \  \    \  \         ***
 ***     \   \  \   __/___ /\   _____  \  \  \____\  \        ***
 ***      \   \  \ /\___  \  \  \    \  \  \   _______\       ***
 ***       \   \  \ /   \  \  \  \    \  \  \  \      /       ***
 ***        \   \  \_____\  \  \  \____\  \  \  \____/        ***
 ***         \   \___________\  \__________\  \__\            ***
 ***          \  /           /  /          /  /  /            ***
 ***           \/___________/ \/__________/ \/__/             ***
 ***                                                          ***
 ***  May the source be with you, stranger ... :-)            ***
 ***                                                          ***
 ***  Greets from -=Assarbad [GoP]=- ...                      ***
 ***  Special greets go 2 Nico, Casper, SA, Pizza, Navarion...***
 ***[for questions/proposals drop a mail to Assarbad@ePost.de]***
 *****************************************ASCII by Assa [GoP]****
 ****************************************************************)


unit uConsole;

interface

function textattribute: Word;
procedure settextattribute(attr: word);
procedure ClrEol;
procedure ClrScr;
function WhereX: Integer;
function WhereY: Integer;
procedure GotoXY(const x, y: integer);
procedure FlushInputBuffer;
function keypressed: boolean;
function ReadKey: Char;
procedure Sound(Freq, duration: Cardinal);
procedure NoSound;
procedure ConsoleEnd;

implementation

uses
  Windows;

var
  SoundFrequency: Integer;

function textattribute: word;
var
  csbi: _CONSOLE_SCREEN_BUFFER_INFO;
begin
  if getconsolescreenbufferinfo(getstdhandle(STD_OUTPUT_HANDLE), csbi) then
    result := csbi.wAttributes else
    result := 0;
end;

procedure settextattribute(attr: word);
begin
  setconsoletextattribute(getstdhandle(STD_OUTPUT_HANDLE), attr);
end;

procedure ClrEol;
var
  tC: tCoord;
  Len, Nw: Cardinal;
  Cbi: TConsoleScreenBufferInfo;
begin
  GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), cbi);
  len := cbi.dwsize.x - cbi.dwcursorposition.x;
  tc.x := cbi.dwcursorposition.x;
  tc.y := cbi.dwcursorposition.y;
  FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textattribute, len, tc, nw);
  FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), #32, len, tc, nw);
end;

procedure ClrScr;
var
  tc: tcoord;
  nw: Cardinal;
  cbi: TConsoleScreenBufferInfo;
begin
  getConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), cbi);
  tc.x := 0;
  tc.y := 0;
  FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textattribute, cbi.dwsize.x * cbi.dwsize.y, tc, nw);
  FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), #32, cbi.dwsize.x * cbi.dwsize.y, tc, nw);
  setConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), tc);
end;

function WhereX: integer;
var
  cbi: TConsoleScreenBufferInfo;
begin
  getConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), cbi);
  result := tcoord(cbi.dwCursorPosition).x + 1
end;

function WhereY: integer;
var
  cbi: TConsoleScreenBufferInfo;
begin
  getConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), 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(GetStdHandle(STD_OUTPUT_HANDLE), coord);
end;

procedure FlushInputBuffer;
begin
  FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE))
end;

function keypressed: boolean;
var
  NumberOfEvents: Cardinal;
begin
  GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), NumberOfEvents);
  result := NumberOfEvents > 0;
end;

function ReadKey: Char;
var
  NumRead: Cardinal;
  InputRec: TInputRecord;
begin
  while ((not ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), InputRec, 1, NumRead)) or (InputRec.EventType <> KEY_EVENT)) do ;
  Result := InputRec.Event.KeyEvent.AsciiChar;
end;

procedure Sound(Freq, duration: Cardinal);
begin
  soundfrequency := freq;
  windows.beep(Freq, duration);
end;

procedure NoSound;
begin
  windows.beep(SoundFrequency, 0);
end;

procedure ConsoleEnd;
begin
  if isconsole then begin
    if wherex > 1 then writeln;
    settextattribute(FOREGROUND_GREEN or FOREGROUND_INTENSITY);
    setfocus(GetCurrentProcess);
    write('Press any key to continue.');
    FlushInputBuffer;
    ReadKey;
    FlushInputBuffer;
  end;
End;

end.

In Deiner Unit brauchst Du dann nur noch in der Uses-Anweisung die Datei uConsole.pas aufführen:
ausblenden Delphi-Quelltext
1:
2:
3:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uConsole;


Bye, Vera!
Gorthaur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Mi 01.03.06 11:43 
Genau das wollte ich, eine Unit mit der ich die alten Befehle aus der CRT wieder benutzen kann!

Wie ich eine Unit einbinde weiß ich aber, wie mache ich aus dem 'Text' eine Unit?

Ich meine die SysUtils ist doch vom Datentyp *.dcu, muss denn die Unit uConsole nicht auch vom selben Datentyp sein? Oder muss ich den 'text' einfach nur als *.txt Datei irgendwohin speichern? Und wenn ja, wohin genau?

Tut mir leid aber ich hab' das noch nie gemacht...
Vera
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82

WinXP Home
Delphi 2005 Personal
BeitragVerfasst: Mi 01.03.06 11:54 
user profile iconGorthaur hat folgendes geschrieben:
wie mache ich aus dem 'Text' eine Unit?

Eine Unit ist eine ganz normale Textdatei nur hat diese Datei nicht die Endung .txt sondern .pas!

user profile iconGorthaur hat folgendes geschrieben:
Ich meine die SysUtils ist doch vom Datentyp *.dcu, muss

Es gibt eine Datei SysUtils.pas und wenn der Compiler die Datei compiliert hat dann erstellt der Compiler eine die Datei SysUtils.dcu. Mit diesen DCU Dateien hast du aber nichts zu tun - also ignoriere sie. ;-)

user profile iconGorthaur hat folgendes geschrieben:
denn die Unit uConsole nicht auch vom selben Datentyp sein?

Nein. Erstelle in deinem Projektverzeichnis eine Datei mit dem Namen uConsole.pas und füge dort den von mir geposteten Inhalt rein.

user profile iconGorthaur hat folgendes geschrieben:
Oder muss ich den 'text' einfach nur als *.txt Datei irgendwohin speichern? Und wenn ja, wohin genau?

Nein, die Datei muss die Endung .pas haben und sollte am besten dort liegen wo auch deine Projektdatei (.dpr) liegt.

Am einfachsten wäre es wenn du in Delphi den Menüpunkt Datei -> Neu -> Unit wählst und dann dort den Sourcecode einfügst.

Bye, Vera!
Gorthaur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Mi 01.03.06 12:09 
Vielen Dank!
So klappt es.

Jetzt nur noch eines:

Könnte man diese uConsole Unit nicht so verwenden wie z.B. die SysUtils, ich meine quasi 'global' so dass die Unit in alle Programme eingebunden werden kann egal wo sie gespeichert sind?

Müsste das nicht klappen, wenn die uConsole im selben Ordner wie die SysUtils gespeichert wird?
Vera
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82

WinXP Home
Delphi 2005 Personal
BeitragVerfasst: Mi 01.03.06 12:15 
Probier es doch einfach mal aus. ;-)
Gorthaur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP SP2
Delphi7
BeitragVerfasst: Mi 01.03.06 13:01 
Also ich hab's ausprobiert:

Ich habe einfach mal nach SysUtils im Borland Ordner gesucht und sie drei mal gefunden:

1. Borland\Delphi\Lib -> CDU Datei
2. Borland\Delphi\Lib\Debug -> CDU Datei
3. Borland\Delphi\Source\Rtl\Sys -> Delphi Source File

Vorher hatte ich ja, wie von Vera beschrieben, die Unit uConsole.pas in meinem Projektorder angelegt und nachdem ich ich die Unit eingebunden und verwendet hatte, hat Delphi automatisch eine uConsole.CDU Datei im Projektordner angelegt.

Da es nicht genügte, die uConsole.pas in den Ordner zu speichern, in dem die SysUtils.pas ist (also ...\Source\Rtl\Sys) habe ich kurzerhand die uConsole.cdu in die entsprechenden Ordner kopiert wo die SysUtils.cdu Dateien liegen und siehe da, es funktioniert!!!

Also nochmals vielen Dank euch beiden!