![]() |
Konsolenprogramme wie in TP
Wie kann man eigentlich in Delphi die Schriftfarbe und -größe der Ausgabe verändern? Und wie kann man über den Speaker etwas ausgeben, ohne die API Beep() zu verwenden?
|
Moin Chewie,
bei einem Konsolenprogramm kannst Du einfach durch ein
Delphi-Quellcode:
einen Ton ausgeben.
WriteLn(#07);
Ich habe jetzt leider keine Liste zur Hand, aber auch das mit den Farben könnte sich über spezielle ASCII Codes (Wert < 32) einleiten lassen. |
Zitat:
Windows bietet für die Consolenprogrammierung genug API Funktionen. Hier ist mal ein kleines Beispielprogramm:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} uses Windows, SysUtils; type TConsole = class(TObject) private FNewConsole: Boolean; FhOut, FhIn: THandle; procedure SetTitle(const Value: string); function GetTitle: string; public constructor Create(const Title: string = ''; NewConsole: Boolean = True); destructor Destroy; override; procedure ClrScr; procedure GotoXY(x, y: Integer); procedure SetTextAttr(Attr: Word); procedure WriteEx(const Text: string; Attr: Word); property Title: string read GetTitle write SetTitle; property hOut: THandle read FhOut; property hIn: THandle read FhIn; end; constructor TConsole.Create(const Title: string = ''; NewConsole: Boolean = True); begin inherited Create; FNewConsole := NewConsole; if FNewConsole then AllocConsole; FhOut := GetStdHandle(STD_OUTPUT_HANDLE); FhIn := GetStdHandle(STD_INPUT_HANDLE); SetTitle(Title); end; destructor TConsole.Destroy; begin if FNewConsole then FreeConsole; inherited Destroy; end; procedure TConsole.SetTitle(const Value: string); begin SetConsoleTitle(PChar(Value)); end; function TConsole.GetTitle: string; var Buf: Array[0..1024] of Char; begin SetString(Result, Buf, GetConsoleTitle(Buf, 1024)); end; procedure TConsole.ClrScr; var NumWritten: Cardinal; c: TCoord; Info: TConsoleScreenBufferInfo; begin c.X := 0; c.Y := 0; GetConsoleScreenBufferInfo(hOut, Info); FillConsoleOutputAttribute(hOut, Info.wAttributes, 80 * 25, c, NumWritten); FillConsoleOutputCharacter(hOut, ' ', 80 * 25, c, NumWritten) end; procedure TConsole.GotoXY(x, y: Integer); var c: TCoord; begin c.X := x; c.Y := y; SetConsoleCursorPosition(hOut, c); end; procedure TConsole.SetTextAttr(Attr: Word); begin SetConsoleTextAttribute(hOut, Attr); end; procedure TConsole.WriteEx(const Text: string; Attr: Word); var NumWritten: Cardinal; begin SetConsoleTextAttribute(hOut, Attr); WriteConsole(hOut, PChar(Text), Length(Text), NumWritten, nil); end; var Con: TConsole; begin Con := TConsole.Create('Meine Konsole'); try Con.SetTextAttr(FOREGROUND_GREEN or FOREGROUND_RED or FOREGROUND_INTENSITY or BACKGROUND_BLUE); Con.ClrScr; Con.GotoXY(10, 10); Write('Hallo'); ReadLn; Con.ClrScr; ReadLn; finally Con.Free; end; end. |
Moin jbg,
die genaue Vorgehensweise weiss ich leider auch nicht mehr. Dass man aber mit "Bordmitteln" seinen Batchdateien Farbe verleihen konnte, vorausgesetzt, man hatte Mode CO80 eingestellt und den ANSI.SYS geladen, weiss ich noch genau. ;-) (nur: Wer braucht's heute noch...) |
Warum ich frage, ist ganz simpel: Man muss ja irgendwie den Inf-Unterricht rumkriegen, und Matrix-Programme zu schreiben, hilft ungemein dabei. Und die Matrix sieht halt grün besser aus als weiß :wink:
|
Hi Chewie,
zumindest auf neueren UNIX-Shells kann man die Farben mit Escape-Sequenzen umstellen (ASCII 27 und dann einen bestimmten Code senden). Mit bestimmten Einstellungen in der CONFIG.SYS/CONFIG.NT scheint man auch unter Windows diese Escape-Sequenzen nutzen zu können: ![]() MfG, d3g |
Hallo,
wenn es eine Alternative für dich ist, das Programm tatsächlich in Turbo Pascal zu schreiben, dann solltest du mal ins ![]() Gruß Klabautermann |
Zitat:
Aber auch sehr lustig sind Programme, die hochfrequente Töne erzeugen. Ich hab dabei nämlich festgestellt, dass ich höchstens noch 11000 Hertz hören kann. Kein sehr gutes Ergebnis. Und da haben sie mich bei der Musterung als "befriedigend" eingestuft. :| Aber nochmal zurück zu meiner urrsprünglichen Frage. Bei der API Beep() kann man laut SDK (und laut meinen Ohren, ich hoffe, tiefe Töne hören sie noch) keine Töne mit Frequenzen von weniger als 37 Hertz erzeugen. Kann man nicht irgendwie unter diese Grenze gehen, ein Mensch sollte ja schließlich bis 18 Hertz hören können. Und unter TP geht das ja auch. |
Moin Chewie,
ich weiss ja nicht, über was für Lautsprecher/Soundkarte Du verfügst, aber: Das mit den 11000 Hz kann auch daran liegen, das höhere Frequenzen von mindestens einer der Komponenten nicht mehr wiedergegeben werden können. Von der Möglichkeit eine Wiedergabequelle zu haben, die 18Hz produzieren kann mal ganz zu schweigen. ;-) |
Hallo Christian,
das Problem war hier nicht die Soundkarte oder der Lautsprecher, sondern die Hörmuschel :mrgreen: . Stell dich einmal neben ein laufendes Jettriebwerk, dann weist du was ich meine... Häääääh, hast du was gesagt ? :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 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 by Thomas Breitkreuz