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

Anmeldungsdatum: 09.05.2005 Beiträge: 16
|
Verfasst am: 03.06.2005, 00:37 Titel: Problem bei einbindung der Shell |
|
|
Hallo alle zusammen..... u. wieder ma hat smokie ein prob
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.
kann mir jemand sagen wiso u. was ich tun kann
besten dank wie immer im voraus
mfg
Smokie |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 03.06.2005, 10:08 Titel: |
|
|
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
/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 |
|
 |
Question
Anmeldungsdatum: 01.06.2005 Beiträge: 9
|
Verfasst am: 03.06.2005, 16:00 Titel: |
|
|
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 |
|
 |
Smokie_joe

Anmeldungsdatum: 09.05.2005 Beiträge: 16
|
Verfasst am: 06.06.2005, 10:40 Titel: |
|
|
vielen dank für eure hilfe
mfg
smokie |
|
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.
|
|