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:

Problem bei einbindung der Shell

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



Anmeldungsdatum: 09.05.2005
Beiträge: 16

BeitragVerfasst am: 03.06.2005, 00:37    Titel: Problem bei einbindung der Shell Antworten mit Zitat

Hallo alle zusammen..... u. wieder ma hat smokie ein prob durchgeknallt

zu meiner Frage
ich hab in ein prog das ich grad schreiben will die Shell eingebunden um
mir eine Textdatei anzeigen zu lassen.

das ganze sieht ungefär so aus:

Code:
 

Locate 9, 21
Shell "type" + " " + PfaduDatei$




mein Problem ist nun die Erste Zeile wird bei der mit locate angegebenen pos. angezeigt die darauf folgenden Zeilen allerdings beginnen ganz am rand. mit dem Kopf durch die Mauer wollen

kann mir jemand sagen wiso u. was ich tun kann weinen

besten dank wie immer im voraus

mfg
Smokie
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 03.06.2005, 10:08    Titel: Antworten mit Zitat

nur selber typen:
Code:
SUB type (datei$, startZeile%, startSpalte%)
LOCATE startZeile%
OPEN datei$ FOR INPUT AS #1
WHILE NOT EOF(1)
  LINE INPUT #1, zeile$
  LOCATE , startSpalte%
  PRINT zeile$
WEND
CLOSE #1
END SUB

Ohne Gewähr, dass das geht, ich bin erkältet, hab n bisschen Kopfweh und das is nur grad so runtergeschrieben, ungetestet.. Viel Glück damit happy

/edit: Du kannst natürlich die Sub auch so machen, dass du da, wo das erste Locate steht, einfach startSpalte%=POS(1) oder so hinschreibst, weiß ned mehr welcher Aufruf dir die aktuelle Cursorspalte zurückgibt, dann kannst du die beiden Integer-Parameter rausschmeißen und die Sub mittels "LOCATE 3, 4: type c:\autoexec.bat" aufrufen. mach, wies dir lieber is.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Question



Anmeldungsdatum: 01.06.2005
Beiträge: 9

BeitragVerfasst am: 03.06.2005, 16:00    Titel: Antworten mit Zitat

Hallo,

das darf ich vielleicht noch etwas ergänzen.

Zunächst eine Erklärung für Smokie_joe:

Wieso das passiert, wolltest du wissen. Ich versuche dir das mal so zu erklären (und im Erklären bin ich nicht so firm...)

Sobald du mit »SHELL« einen DOS-Befehl ausführst, übergibst du auch die Bildschirmkontrolle an DOS. Und DOS interessiert sich nicht die Bohne dafür, was du im Basicprogramm mit »LOCATE« vorgegeben hast.
Der »TYPE« gibt also die erste Zeile aus, die (auch das prüft DOS nicht) eben zufällig an der Cursorposition beginnt, die gerade aktuell ist (weil sie vom Programm so vorgegeben wurde).

Nun gibt es zwei Dinge, die bewirken, dass die Cursorposition KLEINER als deine Vorgabe (21) wird:
a) Ein &H0D, &H0A steht in der Datei
Dann wird ein Carriage Return ausgegeben, die Ausgabespalte also auf »1« gesetzt, anschließend ein Line Feed, die Ausgabezeile also hochgezählt (kann auch ein Scrollen verursachen)
DOS fängt eine „neue Zeile« stets an Position 1 an, also hat der Locate–Befehl des Programmes spätestens jetzt keine Bedeutung mehr.
b) Eine Zeile aus der Datei ist länger als (80-21=59) Zeichen
Dann „rutscht“ der Rest der Zeile nämlich auch in die nächste Zeile. Und da für die Ausgabe DOS verantwortlich ist, ist der Locate–Befehl des Basicprogrammes ebenfalls hinfällig.

MisterD hat deshalb völlig richtig vorgeschlagen, die Bildschirmausgabe der Datei ebenfalls in BASIC zu realisieren.
Seinem Vorschlag möchte ich mich jedoch nicht ganz anschließen.
Freilich kann man in QBasic keine SUB mit dem Namen TYPE erstellen, da müssen wir uns etwas anderes einfallen lassen (»TYPE« ist ein Befehlsname).
Ich nenne die Sub einfach mal DTYPE (für DateiTYPE)

Code:
SUB DType (Dateiname AS STRING, StartX AS INTEGER, MaximalX AS INTEGER)

 DIM Spalte AS INTEGER
 DIM FileNr AS INTEGER
 DIM EinByte AS STRING

 Spalte = StartX
 FileNr = FREEFILE

 OPEN Dateiname FOR INPUT AS #FileNr
 EinByte = INPUT$(1, FileNr)
 LOCATE CSRLIN, StartX
 DO
   Spalte = POS(0)

   IF Spalte < StartX THEN
      Spalte = StartX
   END IF
 
   IF Spalte > MaximalX THEN
      PRINT
      Spalte = StartX
   END IF

   LOCATE CSRLIN, Spalte
   PRINT EinByte;

   EinByte = INPUT$(1, FileNr)

 LOOP UNTIL EOF(FileNr)

 CLOSE #FileNr

END SUB


Zugegeben, der Code ist wesentlich länger und er verlangt auch Eingaben, vor Allem ist er aber noch nicht „fertig“, denn eine Begrenzung nach oben oder unten fehlt noch (bei langen Dateien würde nämlich die Bildschirmmaske nach oben wegscrollen).

An die Sub wird der Dateiname, die erste und die letzte Ausgabespalte übergeben, wobei ich für dieses Beispiel auf eine Überprüfung dieser Werte verzichtet habe.

Die Datei (eine Existenzprüfung fehlt) wird zeichenweise eingelesen, damit die SUB die Cursor-Spaltenposition „im Griff“ hat.
Nach einem CR (oder CR/LF) in der auszugebenden Datei würde ja die nächste Schreibposition kleiner sein, als die Vorgabe, das wird im ersten »IF«–Block abgefangen.
Erreicht die Cursorposition die maximal erlaubte Spalte (das kann auch »80« sein...), wird ein Zeilenumbruch erzeugt und der Cursor wieder an die Vorgabeposition gesetzt.

Ich lese Dateien vielleicht etwas umständlich aus (erster Lesebefehl ist außerhalb der »DO—LOOP«–Konstruktion), das verwirrt hoffentlich nicht.

Die SUB wird also zum Beispiel so aufgerufen:
Code:
DType "C:\AUTOEXEC.BAT", 20, 60

Die Bildschirmausgabe erfolgt ab der aktuellen Zeile (ggf. vorher festlegen) und „zwingt“ die Ausgabe, bei Spalte 20 zu beginnen und nach Spalte 60 eine neue Zeile zu beginnen, die SUB kann freilich auch bis zum „echten“ Zeilenende schreiben:
Code:
DType "D:\CONFIG.SYS", 20, 80

Das ist Geschmacksache und auch von der Bildschirmmaske abhängig.

So, ich hoffe, ich konnte erklären, was du wissen wolltest.

VLG
Thomas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Smokie_joe



Anmeldungsdatum: 09.05.2005
Beiträge: 16

BeitragVerfasst am: 06.06.2005, 10:40    Titel: Antworten mit Zitat

vielen dank für eure hilfe

grinsen grinsen grinsen grinsen grinsen grinsen

mfg
smokie
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 QBasic. 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