 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 27.12.2005, 10:47 Titel: Den Bildschirm speicherschonend speichern? |
|
|
Hallo, ich weiss, zum Thema wie man den Bildschirm speichert gibt es einige Threads (u.a. einen von mir), jedoch habe ich in keinem folgendes Problem gefunden:
Also, ich möchte im normalen Text-Konsolen-Modus in FreeBASIC einen Befehl, sagen wir mal "DIR" ausführen. Soweit so gut, das ist kein Problem. Jedoch möchte ich danach die Ausgabe auf dem Bildschirm in eine Variable/ein Feld kopieren, so dass ich die Ausgabe z.B. in einem VIEW PRINT Feld wiedergeben kann. Mit SCREEN könnte ich natürlich schon den ganzen Bildschirm auslesen, jedoch frisst das 2KB Speicher und das sind mir zuviel... |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 27.12.2005, 10:58 Titel: |
|
|
Da du im Allgemein Bereich bist, gehe ich von Windows aus:
Code: | screen 12
shell "dir >out.txt"
Open "out.txt" for input as #1
do
line Input #1, a$
? a$
loop Until EOF(1)
sleep |
Der Teil mit dem Feld sollte jetzt einfach sein. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 27.12.2005, 13:08 Titel: |
|
|
es wird DOS sein, aber das spielt beim obigen beispiel keine Rolle... Die Idee hatte ich auch schon, das Problem stellt jedoch die Eingabe dar, da ich nicht nur DIR ausführen will.
Es soll z.B. auch Format oder so ausgeführt werden, und erst wenn der Befehl Fertig ist, die Bildschirmausgabe gespeichert werden...
und bei "Format" muss bekanntlich auch noch etwas eingegeben werden und das geht mit der Dateiumleitung leider nicht |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 27.12.2005, 14:44 Titel: |
|
|
Brauchst du wirklich DEN TEXT, der angezeigt wird, oder genügt dir eine Grafische Aufzeichnung?
Ansonsten könntest du einen Grafik-Modus starten, und mit BSAVE regelmäßig Snapshots machen.
Ansonsten siehe
http://fb.exp-soft.de/r.php?s=SCREEN#1
So kannst du relativ einfach mit zwei For-Next-Schleifen den Kompletten Bildschirm in ein Array kopieren (am besten ein Array des Types UBYTE oder STRING * 1).
Einziges Problem: Während ein Prog läuft (FORMAT, DIR, ...) kannst du natürlich keine Kopie erstellen.
Wärst du Unter Windows, könntest du via THREADCREATE einen Thread erstellen, der Regelmäßig den Bildschirm kopiert...
Siehe:
http://fb.exp-soft.de/r.php?s=THREADCREATE
Hope, it helped
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 27.12.2005, 15:58 Titel: |
|
|
vielen dank für die hilfe, aber nützt tut es mir leider auch nicht viel, da die screen methode, wie ich in meinem eröffnugnspost bereits geschrieben habe zuviel speicher frisst (2KB um genau zu sein)...
Die Methode mit Windows ist ja leider auch nix, da es DOS sein muss...
Es reicht aber schon das ganze NACH dem Befehl zu haben...
BSAVE:Wenn man das mit BLOAD lädt, wird doch der ganze Bildschirm übermalen, ich möchte das ganze jedoch nur in ein Teil des Fensters malen... |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 28.12.2005, 22:49 Titel: |
|
|
gandro hat Folgendes geschrieben: | es wird DOS sein, aber das spielt beim obigen beispiel keine Rolle... Die Idee hatte ich auch schon, das Problem stellt jedoch die Eingabe dar, da ich nicht nur DIR ausführen will.
Es soll z.B. auch Format oder so ausgeführt werden, und erst wenn der Befehl Fertig ist, die Bildschirmausgabe gespeichert werden...
und bei "Format" muss bekanntlich auch noch etwas eingegeben werden und das geht mit der Dateiumleitung leider nicht |
wie wäre es mit
Code: |
open "Kommando" for output as #1
print #1,"C:\"
close #1
shell "format <Kommando >Ergebnis"
|
_________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 28.12.2005, 23:59 Titel: |
|
|
gandro hat Folgendes geschrieben: | Die Methode mit Windows ist ja leider auch nix, da es DOS sein muss...
Es reicht aber schon das ganze NACH dem Befehl zu haben... |
In this case:
Code: | Declare Sub CopyTxtScreen (Target() As Byte, _
StartX = 1, StartY = 1, _
EndX = 80, EndY = 25)
...
Dim TxtOnScreen(1 To 80, 1 To 60)
SHELL "Befehl"
CopyTxtScreen (TxtOnScreen())
...
Sub CopyTxtScreen (Target() As Byte, _
StartX = 1, StartY = 1, _
EndX = 80, EndY = 25)
Dim As Integer x, y
Dim As Integer dx, dy
dx = StartX - LBound(Target, 1)
dy = StartY - LBound(Target, 2)
For x = StartX To EndX
For y = StartY To EndY
Target(x - dx, y - dy) = Screen(y, x, 0)
Next
Next
End Sub |
As easy as possible, denk ich, und doch noch mit dem Luxus, nur einen bestimmten Teilausschnitt kopieren zu können.
Um das dann wieder anzeigen zu können:
Code: | Declare Sub ShowTxtSnapshot (Snap() As Byte, TargetX = 1, TargetY = 1)
Sub ShowTxtSnapshot (Snap() As Byte, TX = 1, TY = 1)
Dim As Integer x, y
For x = LBound(Snap, 1) To UBound(Snap, 1)
For y = LBound(Snap, 2) To UBound(Snap, 2)
Locate TY + y - LBound(Snap, 2), TX + x - LBound(Snap, 1)
Print Chr(Snap(x, y);
Next
Next
End Sub |
Should work...
gandro hat Folgendes geschrieben: | BSAVE:Wenn man das mit BLOAD lädt, wird doch der ganze Bildschirm übermalen, ich möchte das ganze jedoch nur in ein Teil des Fensters malen... |
Tut zwar zur lösung des Problems nichts zur sache, da du im non-Gfx bleiben willst, aber: Du kannst ein Bild via Bload auch in ein Array oder einen Speicherbereich laden, und ihn dann via PUT anzeigen. Und da wird garantiert nicht der ganze Bildschirm übermalt
Siehe:
http://fb.exp-soft.de/r.php?s=BLOAD
http://fb.exp-soft.de/r.php?s=BSAVE
http://fb.exp-soft.de/r.php?s=PUT%20(Grafik)
http://fb.exp-soft.de/r.php?s=GET%20(Grafik)
http://fb.exp-soft.de/r.php?s=IMAGECREATE
http://fb.exp-soft.de/r.php?s=IMAGEDESTROY
@ Jojo:
So, wie ich das verstanden habe, möchte er komplett auf Umleitung verzichten, da er evtl. auch Programme aufrufen möchte, die solche nciht unterstützen. Stell dir einfach mal vor, du hättest ein Programm geschrieben, das...sagen wir auf eine INPUT-Eingabe angewiesen ist. INPUT ist nicht mit den BATCH-Umleitungszeichen kompatibel. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 29.12.2005, 08:36 Titel: |
|
|
@Dusky_Joe
gandro hat Folgendes geschrieben: | Mit SCREEN könnte ich natürlich schon den ganzen Bildschirm auslesen, jedoch frisst das 2KB Speicher und das sind mir zuviel... |
Und: Ist das Programm von dir Geprüft?
Bei mir in Freebasic 0.15 Beta hagelt es Fehlermeldungen ...
So könnte es gehen:
Code: | declare Sub CopyTxtScreen (StartX,StartY,EndX,EndY)
declare Sub ShowTxtScreen (StartX,StartY,EndX,EndY)
Dim shared TxtOnScreen(1 To 80, 1 To 60) as byte
SHELL "dir"
CopyTxtScreen(1,1,79,24)
sleep
cls
ShowTxtScreen(1,1,79,24)
sleep
Sub CopyTxtScreen (StartX,StartY,EndX,EndY)
Dim As Integer x, y
Dim As Integer dx, dy
For x = StartX To EndX
For y = StartY To EndY
TxtOnScreen(x , y) = Screen(y, x,0)
Next
Next
End Sub
Sub ShowTxtScreen (StartX,StartY,EndX,EndY)
Dim As Integer x, y
Dim As Integer dx, dy
For x = StartX To EndX
For y = StartY To EndY
locate y,x
? chr$(TxtOnScreen(x , y))
Next
Next
End Sub |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 29.12.2005, 14:40 Titel: |
|
|
vielen dank für die antworten, ich werde es gleich morgen, wenn ich wieder zuhause bin testen.
aja, und wie Dusky_Joe bereits erraten hat, ist es nicht im voraus gegeben, welche programme aufgeführt werden  |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 29.12.2005, 15:53 Titel: |
|
|
Erst mal Sorry, dass ich schon zum zweiten Mal den Eröffnungsthread nicht gescheit gelesen habe...
Anyway:
Tja, unter die 2KB für den gesamten Screen wirst du wohl kaum kommen; 80*25 Zeichen sind nun mal 2000 Byte = 1,95KB. (Bei 80x60 wärens um die 4,6KB) Allerdings könntest du das ganze mit der FB-Eigenen LZW-Kompression ein wenig zusammenschrumpfen.
Siehe
http://fb.exp-soft.de/FBtuts.php?zeig=tuts&view=Referenz_Gfx-7.~Tipps~und~Tricks.txt#6
Dazu musst du - wie beschrieben, erst mal Screen aufrufen, um den Codec in dein Prog einzubinden, und zusätzlich die Funktionen deklarieren. Ansonsten dürfte es aber funzen
Ansonsten bleibt dir nur die Möglichkeit, eben nicht den gesamten Bildschirm auszulesen, sondern eben nur Teile davon. Das sollten meine beiden Routinen bringen, allerdings habe ich schon beim schreiben vermutet, dass die nciht ganz bug-free sind; Michael Frey hat's bewiesen
Dein Code ist übrigens eine abgespeckte Version, die IMMER ein Array der Größe 1 TO 80, 1 TO 25 braucht; genau das wollte ich bei meiner Prozedur abfangen... was auch zu den Fehlern führt, die du gefunden hast.
Außerdem lässt sich mit deiner Show-Routine ein Snapshot nur dort wieder anzeigen, wo er auch aufgenommen wurde (außer man trickst mit VIEW-PRINT, wobei sich der Shot auch nur in der Zeile verschieben lässt). Letztendendes eine Sache von Angebot und nachfrage; gandro wird schon wissen, ob er den Text auch noch verschieben will
Was ich die ganze zeit vergessen habe:
Unter Gfx-Modi kann man verschiedene Bildschirmseiten verwenden; evtl ist das auch in einem Txt-Mode möglich. In this case könntest du mit ScreenCopy arbeiten...hätte aber wieder den nachteil, dass du den gesamten Bildschirm überschreibst.
Oder, du nutzt eine zweite Seite als Puffer, ließt die mit SCREEN in ein Temp-Array aus, und schreibst von diesem wieder auf deine Sichtbare Seite...
Bin allerdings alles andere als sicher, dass Txt-Modes pageflipping unterstützen.
Well, just try
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 29.12.2005, 17:40 Titel: |
|
|
Man kann die Arrey dimensionierung noch ändern, unter rein dos glaub's nicht über 80 Breit und 25 Höhe hinaus.
Code: | Dim shared TxtOnScreen(1 To 79, 1 To 24) as byte |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
Verfasst am: 30.12.2005, 01:42 Titel: |
|
|
Also ich hab den Thread nur mal kurz überflogen und vllt is meine Antwort auch grotten falsch aber ich hätte einfach Code: | OPEN "PIPE: format <befehle" for #1
do until eof(1)
..auslesen.. | benutzt, wobei du einfache befehle direkt reinschreiben kannst, ansonsten schreib befehle.tmp und schreib die befehle nacheinander in die Datei wie Jojo es schon vorgeschlagen hat.. _________________ » Yodl.de: So sucht man gestern.
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 30.12.2005, 10:31 Titel: |
|
|
Was bewirkt PIPE: ?
(Wegen dem for #1 gehe ich mal von schnell geschrieben, nicht geprüft aus )
Wenn's die Normale Ausgaben Umleitung sein soll:
gandro hat Folgendes geschrieben: | ...
Es soll z.B. auch Format oder so ausgeführt werden, und erst wenn der Befehl Fertig ist, die Bildschirmausgabe gespeichert werden...
und bei "Format" muss bekanntlich auch noch etwas eingegeben werden und das geht mit der Dateiumleitung leider nicht |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 30.12.2005, 15:27 Titel: |
|
|
PIPE: Siehe OPEN in der Referenz
http://fb.exp-soft.de/r.php?s=OPEN
Über PIPE kann man die Ausgaben, die auf dem Bildschirm gemacht werden einlesen. Bin mir nicht ganz sicher, ob das hier funktioniert, da mal wieder die Frage ist, ob generell alle Ausgaben anderer Programme in PIPE eingelesen werden, oder nur ein paar...
Anyway, auf die Normale Ausgabeumleitung können wir uns nicht verlassen.
@ Michael Frey:
Ja, sicher, aber es ist doch unpraktisch, an die Copy-Sub erst mal ein 80x25-Array zu übergeben, das man dann nachträglich auf 5x17 einschrumpft?
Es wäre doch besser, gleich ein 5x17-Array übergeben zu können...
Naja, wie schon gesagt - Angebot und Nachfrage. Wieso soll man mehr Features installieren, als man braucht, andererseits, wieso soll man mit weniger auskommen, als man bekommen kann  _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 30.12.2005, 16:04 Titel: |
|
|
Danke Dusky_Joe, der Code von Mecki ist Fehlerhaft, statt
OPEN "PIPE: format <befehle" for #1
heisst es für FB 0.15
OPEN PIPE "format <befehle" FOR INPUT AS #1
und für FB 0.14
OPEN "PIPE: format <befehle" for Input as #1
Das war der Hauptgrund, wieso ich "PIPE" nicht als FB Befehl erkannte, ich meinte es sei ein Dos Befehl .
Ein letzer Zeit gibt es irgendwie auch den Trend, ungeprüften Quellcode hoch zuladen, was bei der Problemlösung selten hilfreich ist ...
Hier noch ein kurzes Beispiel zu Pipe:
Code: | OPEN PIPE "dir" FOR INPUT AS #1
sleep
do until eof(1)
line input #1, a$
? a$
loop
sleep |
(Geprüft mit Freebasic 0.15) _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 01.01.2006, 16:17 Titel: |
|
|
gibt es denn eine möglichkeit PIPE als RANDOM zu öffnen? auf der offziellen seite steht zwar es geht nicht, aber vll. gibt es ja eine andere möglichkeit auf einen befehl so zuzugreifen, dass man bestimmen kann woher die eingabe und die ausgabe hinkommt... |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|