Autor |
Beitrag |
Calculon
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Fr 16.02.07 16:23
Hi Leute,
ich würde gerne Ausgaben in einer Konsolenanwendung in die selbe Zeile der Konsole schreiben, wobei die alte Ausgabe immer wieder überschrieben werden soll.
Kleines Bsp.:
Delphi-Quelltext 1: 2:
| for i := 1 to 100 do writeln(i); |
Kann mir da jemand weiterhelfen?
Gruß
Calculon
--
|
|
Leuchtturm
      
Beiträge: 1087
Win Vista, Knoppix, Ubuntu
Delphi 7 Pe, Turbo Delphi, C#(VS 2005 Express), (X)HTML + CSS, bald Assembler
|
Verfasst: Fr 16.02.07 16:24
Vorher vllt die Zeile löschen  oder soll der vorherige i-Wert auch noch da stehen 
_________________ Ich bin dafür verantwortlich was ich sage - nicht dafür was du verstehst.
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Fr 16.02.07 16:26
Ich kenne aus Turbo Pascal den Befehl ClrScr.
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Fr 16.02.07 16:42
Es gibt verschiedene CRT32 Units. Entweder du nimmst so eine, oder du baust dir eine mit WinAPI-Funktionen (was aber Sinnlos ist  ).
Da hast du dann ein GotoXY, mit dem du den Schreibcursor verschieben kannst.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Fr 16.02.07 16:43
Leuchtturm hat folgendes geschrieben: | vorher vllt die Zeile löschen oder soll der vorherige i-Wert auch noch da stehen |
Wie Löschen? Wenn ich writeln benutze ordnet delphi sie untereinander an. Bei write nebeneinander. Wenn ich bei write die Ausgabe vorher löschen könnte, könnte das funktionieren.
Marco D. hat folgendes geschrieben: | Ich kenne aus Turbo Pascal den Befehl ClrScr. |
Das Problem ist, dass die Ausgabe nicht zwingend in der ersten Zeile stehen muss und ich will nicht den Bildschirm "säubern" müssen.
Noch eine Anmerkung: Die Unit "crt32.pas" bietet den alten GotoXY-Befehl. Ich kann diese Unit aber nicht benutzen, da sie sich nicht mit der anderen Unit, die ich verwende verträgt ("Console32.pas").
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Fr 16.02.07 16:50
Calculon hat folgendes geschrieben: | Noch eine Anmerkung: Die Unit "crt32.pas" bietet den alten GotoXY-Befehl. Ich kann diese Unit aber nicht benutzen, da sie sich nicht mit der anderen Unit, die ich verwende verträgt ("Console32.pas"). |
Dann kopier doch die Funktion nach Console32.pas 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Fr 16.02.07 16:58
Bin ich grad' bei
Nur jede function oder procedure braucht wieder 'ne andere function oder procedure  ! Ich probier jetzt einfach mal weiter und geb' dann Bescheid.
Gruß
Calculon
--
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Fr 16.02.07 18:12
Nö, hat nicht funktioniert.
Hier ein Beispielprojekt. Lässt sich zwar kompilieren, bricht aber ab und schließt die Anwendung.
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:
| program Project1;
{$APPTYPE CONSOLE}
uses windows, SysUtils;
var i: integer; TextAttr: Byte; ConsoleScreenRect: TSmallRect; hConsoleOutput: THandle;
function WhereY: Byte; var CBI: TConsoleScreenBufferInfo; begin GetConsoleScreenBufferInfo(hConsoleOutput, CBI); Result := TCoord(CBI.dwCursorPosition).Y + 1 - ConsoleScreenRect.Top; end;
procedure DelLine; var SourceScreenRect: TSmallRect; Coord: TCoord; CI: TCharinfo; dwSize, dwCount: DWORD; begin SourceScreenRect := ConsoleScreenRect; SourceScreenRect.Top := WhereY + ConsoleScreenRect.Top; CI.AsciiChar := ' '; CI.Attributes := TextAttr; Coord.X := SourceScreenRect.Left; Coord.Y := SourceScreenRect.Top - 1; dwSize := SourceScreenRect.Right - SourceScreenRect.Left + 1; ScrollConsoleScreenBuffer(hConsoleOutput, SourceScreenRect, nil, Coord, CI); FillConsoleOutputAttribute(hConsoleOutput, TextAttr, dwSize, Coord, dwCount); end;
procedure GotoXY(X, Y: Byte); var Coord: TCoord; begin Coord.X := X - 1 + ConsoleScreenRect.Left; Coord.Y := Y - 1 + ConsoleScreenRect.Top; if not SetConsoleCursorPosition(hConsoleOutput, Coord) then begin GotoXY(1, 1); DelLine; end; end;
begin for i := 1 to 100 do begin write(i); sleep(1000); gotoxy(1,1); end; end. |
Kann es sein, dass der ganze Krimskrams der in der unit "crt32.pas" ganz oben steht wichtig für die procedures und functions ist?
Delphi-Quelltext 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:
| {$IfDef VER130} {$Define NEW_STYLES} {$EndIf}
{$IfDef VER140} {$Define NEW_STYLES} {$EndIf}
{$IfDef VER150} {$Define NEW_STYLES} {$EndIf}
{$IfDef VER160} {$Define NEW_STYLES} {$EndIf}
{$IfDef VER170} {$Define NEW_STYLES} {$EndIf}
{$HINTS OFF}
{$Define HARD_CRT} |
Wenn ja, wo füge ich den in meinem Projekt ein?
Gruß
Calculon
--
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 16.02.07 23:52
Sowohl TP7, als auch Delphi unterstützen neben dem WriteLn-Befehl auch ein reines Write zum Ausgeben von Text ...
Für die Positionierung gab es unter QBasic früher Location ... Wie der unter TP7 gleich hieß, weiß ich grad nicht aus'm Kopf ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 17.02.07 00:22
das war gotoXY 
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Sa 17.02.07 12:01
das war GotoXY 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 17.02.07 18:14
Ahhh, stimmt ...
Calculon hat folgendes geschrieben: | das war GotoXY  |
Wer von euch, wollte nun jetzt wo die Betonung wie weshalb setzen???
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Sa 17.02.07 18:27
Calculon hat folgendes geschrieben: | Hi Leute,
ich würde gerne Ausgaben in einer Konsolenanwendung in die selbe Zeile der Konsole schreiben, wobei die alte Ausgabe immer wieder überschrieben werden soll.
Kleines Bsp.:
Delphi-Quelltext 1: 2:
| for i := 1 to 100 do writeln(i); |
Kann mir da jemand weiterhelfen?
Gruß
Calculon
-- |
Hallo,
einfachste Möglichkeit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| write (' '); for i := 1 to 100 do begin write(#8,#8,#8,#8,i:4); sleep (500); end; writeln; |
(ungetestet, aber so ähnlich funktioniert es)
Bei der verbreiteten Neigung hier im Forum, jedes Problem auf möglichst komplizierte Weise zu lösen, ist so etwas Primitives wahrscheinlich nicht konkurrenzfähig.
Gruss Reinhard
Für diesen Beitrag haben gedankt: Calculon
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 17.02.07 18:36
Reinhard Kern hat folgendes geschrieben: |
Hallo,
einfachste Möglichkeit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| write (' '); for i := 1 to 100 do begin write(#8,#8,#8,#8,i:4); sleep (500); end; writeln; |
(ungetestet, aber so ähnlich funktioniert es)
Bei der verbreiteten Neigung hier im Forum, jedes Problem auf möglichst komplizierte Weise zu lösen, ist so etwas Primitives wahrscheinlich nicht konkurrenzfähig.
Gruss Reinhard |
denke besser wär hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| write (' '); for i := 1 to 100 do begin write(#13#8,#8,#8,#8,i:4); sleep (500); end; writeln; |
'n schöner CR im write, damit es sich nicht fortsetzt ... 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 17.02.07 19:35
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 17.02.07 23:39
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: So 18.02.07 17:35
Grenzgaenger hat folgendes geschrieben: |
...
das kompliment geb ich gern zurück. schon mal den code getestet??? bei mir funktionierts in beiden fällen. dies nur zu info.
und das write(#13'blablabla'); funktioniert auch, problemslos. dafür ist ja das CR da, um die zeile wieder von vorne zu beginnen...  |
Mein Gott, natürlich ohne CR, sonst bräuchte man ja die Backspaces nicht. So wie zuerst geschrieben funktioniert es nämlich an jeder beliebigen Stelle in der Zeile, solange man soviele BS ausgibt wie die Ausgabe lang war. Man wird doch wohl noch eine Technik verständlich machen können, die erheblich älter ist als der PC, oder ist es wirklich einfach zu einfach?
Gruss Reinhard
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mo 19.02.07 18:21
BenBE hat folgendes geschrieben: | Wer von euch, wollte nun jetzt wo die Betonung wie weshalb setzen??? |
Ich mutmaße mal, dass Grenzgaenger das GotoXY betont hat, weil vor deinem Post bereits die Rede davon war. Ich habe das war betont, weil Gotoxy das Äquvalent zum Basic-Befehl locate (Locomotive Basic) ist, das du erwähnt hast und das leider nicht mehr von Delphi unterstützt wird. Deshalb war!
Reinhard Kern hat folgendes geschrieben: | Bei der verbreiteten Neigung hier im Forum, jedes Problem auf möglichst komplizierte Weise zu lösen, ist so etwas Primitives wahrscheinlich nicht konkurrenzfähig. |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| write (' '); for i := 1 to 100 do begin write(#8,#8,#8,#8,i:4); sleep (500); end; writeln; |
Ist echt voll simpel und danke für den Hinweis! Ich wusste nicht, dass das so geht!
Schönen Dank und Gruß
Calculon
--
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 19.02.07 23:09
Calculon hat folgendes geschrieben: | Reinhard Kern hat folgendes geschrieben: | Bei der verbreiteten Neigung hier im Forum, jedes Problem auf möglichst komplizierte Weise zu lösen, ist so etwas Primitives wahrscheinlich nicht konkurrenzfähig. |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| write (' '); for i := 1 to 100 do begin write(#8,#8,#8,#8,i:4); sleep (500); end; writeln; |
Ist echt voll simpel und danke für den Hinweis! Ich wusste nicht, dass das so geht! |
Noch einfacher geht es, wenn man 3 Kommas löscht und das hier nimmt
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| write (' '); for i := 1 to 100 do begin write(#8#8#8#8,i:4); sleep (500); end; writeln; |
Das veranlasst Delphi nämlich sogar dzu, 3 Parameter weniger einzeln als String auszugeben, wodurch die Ausgabe maßgeblich beschleunigt wird 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
AlexSs
Hält's aus hier
Beiträge: 4
|
Verfasst: So 02.11.08 22:49
Hi, hatte in etwa dasselbe Problem. Mit der Crt32 klappt das. Habe da mal alles raus gelöscht, was man nicht unbedingt braucht. Hänge die Datei mal hier an. Du musst dann einmal in deinem Programm das hier ändern:
uses SysUtils;
in
uses Sysutils,ClearWindow;
und dann an richtiger Stelle, also da, wo die bisherige Ausgabe gelöscht werden soll, einfach den Befehl "clrscr" eintragen. Sollte dann funktionieren.
Wichtig!!!!: Speichere die Unit, die hier im Anhang ist, im selben Ordner wie dein Programm. Sollte dann eigentlich funktionieren.
MfG
Alex
Einloggen, um Attachments anzusehen!
|
|
|