 |
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 |
SL
Anmeldungsdatum: 06.12.2009 Beiträge: 43
|
Verfasst am: 06.12.2009, 15:30 Titel: Anfängerprobleme: Drucken und Dateiverwaltung |
|
|
Hi,
ich mache gerade meine ersten – noch ziemlich wackeligen - Gehversuche in fb. Fragen haben ich im Moment keine (außer solche, wo ich vermutlich aufgefordert werde zunächst mal die Suchfunktion dieses Forums zu benutzen). Ein paar Probleme habe ich mit Freebasic dennoch.
1. Über den Druck auf Papier (mit handelsüblichen Windows-USB-Druckern) findet man praktisch keine Beispielprogramme oder Tutorials. Wie stelle ich Schriftart, Schriftgröße, Zeilenabstand, Seitenränder usw. ein? Wie positioniere ich den Text?
2. So ähnlich sieht es auch mit Dateien aus. Da finde ich nicht allzu viel an Informationen. Im Freebasic-Portal gibt es hierzu ein Tutorial namens „Random-Tutorial“. Erklärt wird der wahlfreie Dateizugriff auf einen Datensatz mittels des Schlüsselworts „Random“. In der Befehlsreferenz zu diesem Schlüsselwort steht jedoch folgendes „Es wird davon abgeraten, den RANDOM-Modus zu verwenden; stattdessen empfiehlt sich der BINARY-Modus oder die sequentiellen Modi“. Für mich klingt das ziemlich verwirrend. Noch verwirrender wird es, wenn ich versuche mittels der Befehlsreferenz den „Binary-Modus“ zu durchblicken. Was mir fehlt, ist ein einfaches Beispiel für eine vollständige Dateiverwaltung. z.B. eine Adressendatei, in der Adressen gesucht, eingefügt, gelöscht oder nach bestimmten Kriterien umsortiert werden.
So, genug gemeckert. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.12.2009, 17:02 Titel: |
|
|
Zitat: |
1. Über den Druck auf Papier (mit handelsüblichen Windows-USB-Druckern) findet man praktisch keine Beispielprogramme oder Tutorials. Wie stelle ich Schriftart, Schriftgröße, Zeilenabstand, Seitenränder usw. ein? Wie positioniere ich den Text?
|
so trivial ist das auch keineswegs, vor allem nicht mit FB. du könntest dich natürlich mit PostScript auseinandersetzen, das kann man sicher irgendwie mit FB benutzen.
Zitat: |
2. So ähnlich sieht es auch mit Dateien aus. Da finde ich nicht allzu viel an Informationen. Im Freebasic-Portal gibt es hierzu ein Tutorial namens „Random-Tutorial“. Erklärt wird der wahlfreie Dateizugriff auf einen Datensatz mittels des Schlüsselworts „Random“. In der Befehlsreferenz zu diesem Schlüsselwort steht jedoch folgendes „Es wird davon abgeraten, den RANDOM-Modus zu verwenden; stattdessen empfiehlt sich der BINARY-Modus oder die sequentiellen Modi“. Für mich klingt das ziemlich verwirrend. Noch verwirrender wird es, wenn ich versuche mittels der Befehlsreferenz den „Binary-Modus“ zu durchblicken. Was mir fehlt, ist ein einfaches Beispiel für eine vollständige Dateiverwaltung. z.B. eine Adressendatei, in der Adressen gesucht, eingefügt, gelöscht oder nach bestimmten Kriterien umsortiert werden. |
Das hat schon nichts mehr mit Dateiverwaltung, sondern mit Datenbanken zu tun. In Dateien kann so ziemlich alles stehen, aber Datenbanken sind schon ein wenig komplexer. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 06.12.2009, 17:57 Titel: |
|
|
Vielleicht mal ganz kurz zu PUT/GET in Verbindung mit BINARY:
Wenn du eine Datei öffnest, steht der Datenzeiger (normalerweise) an Position 1. Der Datenzeiger gibt an, von welcher Stelle der Datei gelesen bzw. wohin geschrieben wird. Wenn du jetzt mit PUT Daten hineinlegst, wird der Datenzeiger automatisch mitbewegt, und zwar weiß er immer genau, wieviel Platz der geschriebene Datenspeicher braucht.
Code: | DIM a AS INTEGER = 1, b AS BYTE = 2, c AS SHORT = 3
OPEN "test" FOR BINARY AS #1
PUT #1, , a
PUT #1, , b
PUT #1, , c
CLOSE #1 |
erzeugt eine 7 Byte große Datei: Die ersten vier Byte werden vom Integer a=1 belegt, das fünfte Byte von b=2 und die letzten beiden für das Short c=3.
Beim Auslesen funktioniert das genauso (eben mit GET). Wenn deine Variable ein Integer ist, versucht GET auch ein Integer (vier Byte) auszulesen. Deswegen wird das hier ordnungsgemäß funktionieren:
Code: | DIM a AS INTEGER, b AS BYTE, c AS SHORT
OPEN "test" FOR BINARY AS #1
GET #1, , a
GET #1, , b
GET #1, , c
CLOSE #1 |
das hier aber nicht:
Code: | DIM a AS BYTE, b AS INTEGER, c AS SHORT
OPEN "test" FOR BINARY AS #1
GET #1, , a
GET #1, , b
GET #1, , c
CLOSE #1 |
Das heißt, bei c stimmt es wieder, weil vorher die richtige Anzahl an Bytes weitergeschaltet wurde.
Mit Strings kann das nur richtig funktionieren, wenn diese eine feste Länge haben. Aber das Praktische ist, das du dir mit TYPE einen eigenen Dateitypen erstellen kannst (z. B. mit den ganzen Adressdaten) und dann den kompletten Datensatz speichern bzw. wieder auslesen kannst.
Code: | TYPE adresse
AS STRING*20 name, strasse, wohnort
AS INTEGER hausnr, plz
END TYPE
DIM eintrag AS adresse
eintrag.name = "Max Muster"
eintrag.strasse = "Karoweg"
eintrag.hausnr = 9
eintrag.wohnort = "Streifenhausen"
eintrag.plz = 12345
OPEN "adressbuch" FOR BINARY AS #1
PUT #1, , eintrag
CLOSE #1 |
Du merkst vielleicht, dass es ähnlich funktioniert wie bei RANDOM; nur bist du bei BINARY wesentlich flexibler und kannst verschiedene Datentypen beliebig mischen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
SL
Anmeldungsdatum: 06.12.2009 Beiträge: 43
|
Verfasst am: 06.12.2009, 19:09 Titel: |
|
|
@ Jojo.
Von Postscript habe ich keine Ahnung. Früher (zu DOS-Zeiten) war das Drucken in Q-Basic relativ einfach. Beispielsweise wurde der Fettdruck mit folgendem Basic-Befehl aktiviert: "LPRINT CHR$(27); CHR$(69)“ und mit " LPRINT CHR$(27); CHR$(70)“ wieder desaktiviert. Für alles, was der Drucker konnte, gab es eine Befehlssequenz, die mit "LPRINT CHR$(27)“ begann. Gibt es so was Einfaches heutzutage nicht mehr?
@nemored.
Danke für deine sehr einleuchtende Erklärung des BINARY-Modus. Ich habe es jetzt verstanden. Doch wo ist der Unterschied zum RANDOM-Modus? Beide Modi machen doch anscheinend das Gleiche. Man kann aus einer Datei mit Datensätzen von gleicher (konstanter) Länge einen beliebigen Datensatz (z. B. Datensatz Nr. 7) ein- oder auslesen. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 06.12.2009, 20:15 Titel: |
|
|
Nein.
Du kannst aber wunderbar per GDI drucken. Siehe dazu Petzold (gibt es so kein Tut im INet - zumindest keines, welches mir bekannt wäre) |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 06.12.2009, 20:25 Titel: |
|
|
Escape-Sequenzen funktionieren auf einem modernen Betriebssystem, wo auch gerne mal zwei Anwendungen auf einen Drucker, der kein Zeilendrucker (line printer -> LPRINT) ist, zugreifen können...
Im Vergleich zu dem ganzen GDI/WinAPI-Müll ist PostScript und Konsorten doch aber schon eher verständlich und näher an Escape-Sequenzen dran. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 06.12.2009, 20:35 Titel: |
|
|
Zitat: | Doch wo ist der Unterschied zum RANDOM-Modus? Beide Modi machen doch anscheinend das Gleiche. Man kann aus einer Datei mit Datensätzen von gleicher (konstanter) Länge einen beliebigen Datensatz (z. B. Datensatz Nr. 7) ein- oder auslesen. |
Man kann mit BINARY auch Datensätze unterschiedlicher Länge einlesen, mit RANDOM ist man auf die gleiche Länge beschränkt. Das macht BINARY wesentlich flexibler (und natürlich auch komplizierter ). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
SL
Anmeldungsdatum: 06.12.2009 Beiträge: 43
|
Verfasst am: 07.12.2009, 22:12 Titel: |
|
|
So ganz hat sich der Nebel bei mir noch nicht gelichtet. Wenn ich das richtig begreife, ist der RANDOM-Modus anscheinend ein Spezialfall des BINARY-Modus.
Sobald eine Dateistruktur mit ausschließlich gleich langen Datensätzen vorliegt (ein typisches Beispiel wäre eine Adressen-Datei mit den Feldern Nachname, Vorname, Wohnort) kann mittels des RANDOM-Modus anhand der Datensatznummer auf jeden x-beliebigen Datensatz unmittelbar zugegriffen werden.
Mit dem BINARY-Modus ist das anscheinend auch möglich, jedoch umständlicher, da dieser Modus keine Datensätze kennt, sondern nur Byte-Positionen. Anhand der bekannten Länge der Datensätze (z.B. 80 Bytes) und der Position des gesuchten Datensatzes (z.B. Satz Nr. 4) müsste hier zuerst die Position des ersten zu lesenden Bytes (in dem Beispiel-Fall: Byte-Nr 241) ausgerechnet werden. Dieser Aufwand ist im RANDOM-Modus nicht notwendig.
Ich verstehe deshalb absolut nicht, wieso in der Befehlreferenz zum RANDOM-Modus abgeraten wird, diesen zu verwenden. Gibt es hierzu einen plausiblen Grund? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.12.2009, 00:49 Titel: |
|
|
Keine Ahnung, ob das jetzt ein plausibler Grund ist oder nicht - ich habe in meiner ganzen Programmiererzeit noch nie RANDOM benutzt, weil es mir viel zu unflexibel ist. Der Rechenmehraufwand bei BINARY ist dagegen minimal.
Wie auch immer, es hindert dich trotz allem niemand, den Modus zu verwenden; es handelt sich nur um eine Empfehlung des Verfassers (der übrigens nicht ich bin, auch wenn mein Name dabei steht ) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 08.12.2009, 08:22 Titel: |
|
|
Ich kann die ganzen RANDOM-Liebhaber auch nicht vestehen... Ist halt ziemlich unflexibel, vor allem wenn man jetzt eher mit Stream-artigen Formaten statt Datensätzen arbeitet (Also sämtliche Multimedia-Formate). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
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.
|
|