Autor |
Beitrag |
Gorthaur
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: 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
|
Verfasst: 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 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: 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
|
Verfasst: Mi 01.03.06 00:56
pas-Dateien sind "auch nur Text".
Delphi-Quelltext 1:
| {$include ConTools.inc} |
irgendwo nach den Uses Anweisungen aber noch bevor eine Funktion daraus genutzt werden soll.
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: 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
|
Verfasst: Mi 01.03.06 01:16
Speicher die Datei in deinem Projektordner ab und füge die Include-Anweisung hinzu.
|
|
Vera
      
Beiträge: 82
WinXP Home
Delphi 2005 Personal
|
Verfasst: 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:
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:
|
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:
Delphi-Quelltext 1: 2: 3:
| uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uConsole; |
Bye, Vera!
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: 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
      
Beiträge: 82
WinXP Home
Delphi 2005 Personal
|
Verfasst: Mi 01.03.06 11:54
Gorthaur 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!
Gorthaur 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.
Gorthaur 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.
Gorthaur 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 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: 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
      
Beiträge: 82
WinXP Home
Delphi 2005 Personal
|
Verfasst: Mi 01.03.06 12:15
Probier es doch einfach mal aus. 
|
|
Gorthaur 
      
Beiträge: 19
WinXP SP2
Delphi7
|
Verfasst: 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!
|
|