Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ausgabe (Text) automatisch unterstreichen lassen? (https://www.delphipraxis.net/114912-ausgabe-text-automatisch-unterstreichen-lassen.html)

coly546 2. Jun 2008 20:24


Ausgabe (Text) automatisch unterstreichen lassen?
 
Guten Abend liebes Forum,
im Rahmen des Informatikunterrichtes bin ich auf eine Problemstellung gestoßen,
wo ich keinen Ansatz für finde. Das Problem bezieht sich auf eine Konsolen-Anwendung.

Es geht im speziellen um eine Text-Ausgabe, die automatisch unterstrichen werden soll.


Bisher programmierten wir das immer wie folgt:

Delphi-Quellcode:
writeln('                  Testueberschrift');
writeln('                  ----------------');
halt ganz primitiv und einfach, aber leider nicht automatisch sondern programmiert.

Nun habe ich schon überlegt, ob man das vielleicht mit einer If-Then-Else Anweisung machen könnte.
Quasi wenn Text vorhanden, dann writeln(' ------------'); sonst mache nichts oder sowas in der Art. Leider habe ich auch im Internet keinerlei Informationen darüber gefunden wie man das Automatisieren könnte.



Um Rat und/oder Lösungsansätzen wäre ich euch sehr dankbar.




Beste Grüße und noch einen schönen Abend.
coly546

Dax 2. Jun 2008 20:27

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Du bastelst dir einfach eine eigene WriteLn-Funktion ;) Diese Funktion bricht den Text auf Konsolenbreite um und schreibt nacheinander erst Text, Unterstreichung, Text, Unterstreichung usw.

coly546 2. Jun 2008 20:35

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Hallo,
danke erstmal für Ihre Antwort.

Kann es sein das es dann immer noch nicht automatisch ist?
Es kann auch gut sein, dass ich mich gerade ein bisschen
bedeppert anstelle. Dann berichtigen Sie mich bitte.

Wenn ich Sie richtig verstanden habe sollte, dass dann in etwa so
aussehen:

Delphi-Quellcode:
writeln('Text.....................bis auf die Konsolenbreite');
writeln('---------------------------------------------------');
writeln('Text.....................bis auf die Konsolenbreite');
writeln('---------------------------------------------------');
writeln('Text.....................bis auf die Konsolenbreite');
writeln('---------------------------------------------------');
writeln('Text.....................bis auf die Konsolenbreite');
writeln('---------------------------------------------------');

//und so weiter
Nur dann wäre es ja immer noch nicht automatisch?


//Add

Mir ist gerade noch was eingefallen. Wäre es vielleicht möglich mit Hilfe von
einer If-Then-Else-Anweosung das zu gestallten? Sprich wenn writeln da steht, dann schreibe('----------'), sonst mache nichts.

omata 2. Jun 2008 20:37

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Die Idee ist folgende...

Delphi-Quellcode:
procedure MyWriteLn(text:string);
var i:byte;
begin
  writeln(text);
  for i:=1 to length(text) do
    write('-');
  writeln;
end;
Gruss
Thorsten

coly546 2. Jun 2008 20:49

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Hallo Thorsten,
danke für deine super Idee :-D


Ähm...das Problem ist nur das er mir nicht die vollständige Überschrift
unterstreicht. :?

Delphi-Quellcode:
program Project;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var text:string;

//001----Procedure-------Anfang--------------
procedure MyWriteLn(text:string);
var i:byte;
begin
  writeln('DasisteineUeberschrift');
  for i:=1 to length(text) do
    write('-');
  writeln;
end;
//001----Procedure--------Ende----------------

//-------Hauptprogramm----Anfang--------------
begin
 MyWriteLn('text:string');
 readln;
end.
//-------Hauptprogramm----Ende----------------

Gruß coly546

Dax 2. Jun 2008 20:52

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Delphi-Quellcode:
program Project;

{$APPTYPE CONSOLE}

uses
  SysUtils;

//001----Procedure-------Anfang--------------
procedure MyWriteLn(text:string);
var i:byte;
begin
  writeln(text);
  for i:=1 to length(text) do
    write('-');
  writeln;
end;
//001----Procedure--------Ende----------------

//-------Hauptprogramm----Anfang--------------
begin
MyWriteLn('DasisteineUeberschrift');
readln;
end.
//-------Hauptprogramm----Ende----------------

coly546 2. Jun 2008 20:58

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Oh, dann lag es nur an meiner Unfähigkeit.


Vielen Dank, schön das hier auch Anfänger geholfen wird.

Danke!

Blackheart 2. Jun 2008 21:34

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Zitat:

Zitat von coly546
...Vielen Dank, schön das hier auch Anfänger geholfen wird...

Profis brauchen keine hilfe. :wink:

Dax 2. Jun 2008 21:37

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Zitat:

Zitat von Blackheart
Profis brauchen keine hilfe. :wink:

*nääht* Behauptungszonk ;)

Blackheart 2. Jun 2008 21:42

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Profi erwischt, da haben wir es wieder. :thumb: :wink:

coly546 4. Jun 2008 08:06

Ein weiteres kleines Problem
 
Hi,
ich möchte meine automatische Text-Unterstreichung noch etwas verfeinern.
Und zwar sollte man auch den "Freiraum" vor der Überschrift frei bestimmen können.

Dazu habe ich die Prozedur wie folgt erweitert:

Delphi-Quellcode:
program textautomatischunterstreichen2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

//001----Procedure-------Anfang--------------
procedure MyWriteLn(leer,text:string);
var i:byte;
begin
  write(leer); writeln(text);
  for i:=1 to length(leer) do
    write(#32);
  for i:=1 to length(text) do
    write(#196);
  writeln;
end;
//001----Procedure--------Ende----------------

//-------Hauptprogramm----Anfang--------------
begin
MyWriteLn('           ','DasisteineUeberschrift');
readln;
end.
//-------Hauptprogramm----Ende----------------

So weit so gut, allerdings möchte ich anstelle von den in der Zeile 23:
Delphi-Quellcode:
MyWriteLn('           ','DasisteineUeberschrift');
verwendeten Leerzeichen via Tastatur, eine "Zählschleife" verwenden.
Als ich nun die besagte Zeile 23 gegen diese:
Delphi-Quellcode:
MyWriteLn(for i:=1 to 20 do write(#32),'DasisteineUeberschrift');
mit "Zählschleife" ersetzte, wollte er das Programm nicht mehr compilieren.



Jetzt stellt sich für mich die Frage, was ich machen kann damit es auch mit einer "Zählschleife" funktioniert.



freundliche Grüße
coly546

taaktaak 4. Jun 2008 08:13

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Moin, Moin,
die Schleife muss in die Prozedur, du übergibst nur die Schleifenobergrenze als Integer (oder Byte).

tomsel 4. Jun 2008 08:23

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Wie wär's damit:

Delphi-Quellcode:
Writeln(StringOfChar(#32, i), myString);
Writeln(StringOfChar(#32, i), StringOfChar('_', Length(myString));

taaktaak 4. Jun 2008 08:30

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Schön, damit ist's einfacher
- ich gehe aber davon aus, dass es coly546 primär um das "Selberbauen" geht.

tomsel 4. Jun 2008 08:53

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Ja, ähm, glaub ich ja auch. Ein anderer Vorschlag: Bau deine MyWriteln-Function doch so um, dass du ihr einfach nur die Länge des Leerstrings an Stelle des Strings selbst übergibst.

[Edit] Mit Leerstring meine ich natürlich nicht '', sondern einen String aus Leerzeichen :zwinker: [/Edit]

coly546 4. Jun 2008 09:25

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Zitat:

Zitat von taaktaak
Schön, damit ist's einfacher
- ich gehe aber davon aus, dass es coly546 primär um das "Selberbauen" geht.

Richtig, ich als Anfänger möchte mich da erstmal mit einer "ausführlicheren" Schreibweise,
die ich im Moment auch verstehe "durchfummeln". Trotzdem danke tomsel.

Wenn ich die Schleife in die Prozedur mache, befindet sich der Strich aber am linken Bildrand.

Delphi-Quellcode:
//001----Procedure-------Anfang--------------
procedure MyWriteLn(leer,text:string);
var i:byte;
begin
  for i:=1 to 20 do write(#32); writeln(text);
  for i:=1 to length(leer) do
    write(#32);
  for i:=1 to length(text) do
    write(#196);
  writeln;
end;
//001----Procedure--------Ende----------------

//-------Hauptprogramm----Anfang--------------
begin
MyWriteLn('','DasisteineUeberschrift');
readln;
end.
//-------Hauptprogramm----Ende----------------

Ich müsste das glaube so machen, dass er nochmal die selbe Anzahl für die Leerzeichen wie oben angegeben, für die Anzahl der Leerzeichen verwendet für den Bereich vor den Strichen (#196).


Dann müsste es ja so aussehen:
Delphi-Quellcode:
//001----Procedure-------Anfang--------------
procedure MyWriteLn(leer,text:string);
var i:byte;
begin
  for i:=1 to 20 do write(#32); writeln(text);

  for i:=1 to length(text) do
    write(#196);
  for i:=1 to length(leer) do
    write(#32);
  writeln;

end;
//001----Procedure--------Ende----------------

//-------Hauptprogramm----Anfang--------------
begin
MyWriteLn('','DasisteineUeberschrift');
readln;
end.
//-------Hauptprogramm----Ende----------------

Nur irgendwie geht das trotzdem nicht. :wall:


Zitat:

Ja, ähm, glaub ich ja auch. Ein anderer Vorschlag: Bau deine MyWriteln-Function doch so um, dass du ihr einfach nur die Länge des Leerstrings an Stelle des Strings selbst übergibst.

[Edit] Mit Leerstring meine ich natürlich nicht '', sondern einen String aus Leerzeichen Zwinkern [/Edit]
hmmm...ist nur die Frage wie ich das umsetzen soll :(

tomsel 4. Jun 2008 09:32

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Delphi-Quellcode:
 //001----Procedure-------Anfang-------------- 
procedure MyWriteLn(leer,text:string);
var i:byte;
begin
  for i:=1 to 20 do write(#32); writeln(text); // hier schreibst du 20 Leerzeichen
  for i:=1 to length(leer) do                  // hier verwendest du statt 20 die Länge von leer
    write(#32);
  for i:=1 to length(text) do
    write(#196);
  writeln;
end;
//001----Procedure--------Ende---------------- 

//-------Hauptprogramm----Anfang-------------- 
begin
MyWriteLn('','DasisteineUeberschrift');       // als leer übergibst du hier einen String der Länge 0
readln;
end.
//-------Hauptprogramm----Ende----------------
Siehe Kommentare oben, was fällt dir da auf? :zwinker:

taaktaak 4. Jun 2008 09:36

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Nun, du bist der Lösung ja schon sehr nah! Du musst die Unterstreichung genau so beginnen wie die Textausgabe. Also: Zuerst Leerzeichen, dann Text, noch 'mal Leerzeichen, dann Unterstriche. Die Zahl der Leerzeichen übergibst du der Prozedur, also in etwa so

Delphi-Quellcode:
procedure MyWriteln(AnzLeerzeichen:Byte;Text:String);
var i : Byte;
begin
  for i:=1 to AnzLeerzeichen do write(' '); writeln(Text);
  for i:=1 to AnzLeerzeichen do write(' ');
  for i:=1 to length(Text) do write('-');
end;

tomsel 4. Jun 2008 09:38

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Musst du alles ausplaudern? Er wollte doch selber denken. :mrgreen:

taaktaak 4. Jun 2008 09:46

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
:oops: Na, manchmal ist ein kleiner Schubs auch nicht schlecht, dann ist der Kopf für die nächste Herausforderung frei. Wenn man zu lange an einer Stelle herumdoktert ist das auch nicht motivierend. Schwer einzuschätzen, wann so ein Zeitpunkt erreicht ist. Grundsätzlich gebe ich dir Recht!

coly546 4. Jun 2008 09:54

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Achso, ich dachte man kann das irgendwie kombinieren.
Also ein mal i:=1 to 20 und wenn man es an anderer Stelle mit der Längen-Berechnung besser findet, verwendet man halt diese wieder.

Wieder was gelernt.

Vielen Dank an alle Beteiligten.

taaktaak 4. Jun 2008 10:00

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Na klar, geht das auch!
Du schreibst einfach eine Funktion, die dir einen String aus einer bestimmten Anzahl von Zeichen zurückgibt - und dann sind wir wieder beim Hinweis von tomsel: Du hättest dir dann deine eigene (spezielle) StringOfChar()-Funktion erstellt!

coly546 4. Jun 2008 10:09

Re: Ausgabe (Text) automatisch unterstreichen lassen?
 
Hmm..ok,
aber als verständlicher (für mich) sehe ich die Lösung an, wo oben ausschließlich length von etwas verwendet wurde:
Delphi-Quellcode:
procedure MyWriteln(AnzLeerzeichen:Byte;Text:String);
var i : Byte;
begin
  for i:=1 to AnzLeerzeichen do write(' '); writeln(Text);
  for i:=1 to AnzLeerzeichen do write(' ');
  for i:=1 to length(Text) do write('-');
end;

schön Tag noch :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 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-2025 by Thomas Breitkreuz