Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Den Bildschirm speicherschonend speichern?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 27.12.2005, 10:47    Titel: Den Bildschirm speicherschonend speichern? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 27.12.2005, 10:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 27.12.2005, 13:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 27.12.2005, 14:44    Titel: Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 27.12.2005, 15:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 28.12.2005, 22:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 28.12.2005, 23:59    Titel: Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 29.12.2005, 08:36    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 29.12.2005, 14:40    Titel: Antworten mit Zitat

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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 29.12.2005, 15:53    Titel: Antworten mit Zitat

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 zwinkern

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 zwinkern
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 zwinkern


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 zwinkern



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
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 29.12.2005, 17:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mecki
Igel


Anmeldungsdatum: 10.09.2004
Beiträge: 985
Wohnort: Niederbayern

BeitragVerfasst am: 30.12.2005, 01:42    Titel: Antworten mit Zitat

Also ich hab den Thread nur mal kurz überflogen und vllt is meine Antwort auch grotten falsch happy 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. verwundert
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 30.12.2005, 10:31    Titel: Antworten mit Zitat

Was bewirkt PIPE: ?
(Wegen dem for #1 gehe ich mal von schnell geschrieben, nicht geprüft aus mit den Augen rollen)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 30.12.2005, 15:27    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 30.12.2005, 16:04    Titel: Antworten mit Zitat

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 mit den Augen rollen.

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 01.01.2006, 16:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz