Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konsolenprogramme wie in TP (https://www.delphipraxis.net/1653-konsolenprogramme-wie-tp.html)

Chewie 16. Dez 2002 15:00


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?

Christian Seehase 16. Dez 2002 16:55

Moin Chewie,

bei einem Konsolenprogramm kannst Du einfach durch ein

Delphi-Quellcode:
WriteLn(#07);
einen Ton ausgeben.

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.

jbg 16. Dez 2002 17:54

Zitat:

Zitat von Christian Seehase
... aber auch das mit den Farben könnte sich über spezielle ASCII Codes (Wert < 32) einleiten lassen.

Das ist mir neu. Das ging schon unter DOS nicht. Warum sollte es dann unter Windows funktionieren?

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.

Christian Seehase 16. Dez 2002 19:22

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...)

Chewie 16. Dez 2002 20:37

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:

d3g 17. Dez 2002 14:30

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:
http://www.evergreen.edu/biophysics/...m/ansi_esc.htm.

MfG,
d3g

Klabautermann 17. Dez 2002 16:32

Hallo,

wenn es eine Alternative für dich ist, das Programm tatsächlich in Turbo Pascal zu schreiben, dann solltest du mal ins Museum der Borländer gucken ;).

Gruß
Klabautermann

Chewie 17. Dez 2002 21:11

Zitat:

Zitat von Klabautermann
Hallo,

wenn es eine Alternative für dich ist, das Programm tatsächlich in Turbo Pascal zu schreiben, dann solltest du mal ins Museum der Borländer gucken ;).

Gruß
Klabautermann

Na ja, etwas Fortschritt muss ja schon sein :wink:
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.

Christian Seehase 17. Dez 2002 22:53

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. ;-)

MrSpock 18. Dez 2002 06:57

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 20:54 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz