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:

Einstieg finden
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
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
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 110

BeitragVerfasst am: 05.09.2013, 19:44    Titel: Antworten mit Zitat

RockTheSchock hat Folgendes geschrieben:
… muss man die Datei mit "open ... for binary" öffnen …


Das ist ein HexDump der mit

Code:
Open "FIRMEN.DIR" FOR RANDOM AS #1 Len = 120
PUT #1, FirmaNr, Fir

Datei.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 05.09.2013, 21:48    Titel: Antworten mit Zitat

@Neuling...
wenn ich das richtig gesehen habe, hast den den Hinweis von nemored
(Strings in der UDT auf eine feste laenge zu Deklarieren) in deinem Code-Schnipsel noch nicht befolgt. Solange das der fall ist wird das mit Get/Put nicht Funktionieren(egal ob im Binary oder Random-Modus).

Dein DatenType koennte z.B. so aussehen:
Code:

TYPE FirmenDatei
   As Short DFirmaNr:     ' = 0
   As String*30 DName:       ' String * 30
   As String*25 DStrasse:    ' String * 25
   As String*25 DOrt:        ' String * 25
   As String*20 DBankname:   ' String * 20
   As String*8 DBLZ:        ' String * 8
   As String*10 DKontoNr:    ' String * 10
End Type

Nur so Funktionierts.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 06.09.2013, 13:32    Titel: Antworten mit Zitat

Ich habe dein Beispiel mal etwas aufgebohrt und ein bisschen Objektorientierung reingebracht.

http://www.freebasic-portal.de/porticula/adressen-speichern-mit-datei-datenbank-1646.html

Normalerweise sollte man bei größeren Projekten Type TAdresse und TKonto und TFirma in eigene bi und bas Dateien auslagern. Dabei kommen die Deklarationen in die bi Datei und die Implementationen in die bas datei. Die bi Dateien werden in den bas Dateien mit include eingebunden und nachher werden alle bas Dateien kompiliert.
der Compilierbefehl dafür sieht etwa so aus;
fbc -g -s console Hauptprogramm.bas TFirma.bas
da werden einfach immer weitere module drangehängt die dazugehören.
Solltest du TAdressen um eine EingabeÜberprüfungsfunktion werweitern wollen gehört das in TAdresse.bas
Wenn du ein Projekt in der IDE anlegst, wird das etwas vereinfacht.

also z.B. TFirma.bi
Code:

#include once "TAdresse.bi"
#include once "TKonto.bi"
Const CRLF = Chr(13)+Chr(10)

Type TFirma
 ...
End Type


und TFirma.bas
Code:

#include once "TFirma.bi"

Function TFirma.LadeAlle(datei As String="firma.db") As Integer
..
End Function


Operator TFirma.cast () As String
...   
End Operator


Sub TFirma.Eingabe(datei As String="firma.db")
...
End Sub


Sub TFirma.Laden(nummer As Integer, datei As String="firma.db")
...
End Sub   


Sub TFirma.Speichern(datei As String="firma.db")
 ...               
End Sub



TAdresse.bi
Code:

Type TAdresse
   Anschrift As String*64
   Strasse   As String*64
   Ort       As String*64
End Type


TKonto.bi
Code:

Type TKonto
   Bank   As String*64
   BLZ    As String*64
   Nummer As String*10
   IBAN   As String*34
   BIC    As String*11
End Type


Hauptprogramm.bas
Code:

#include once "TFirma.bi"

ReDim Shared firma() As TFirma

Dim neuefirma AS TFirma

Screen 0
Width 120,50
Print "Firmen Laden: "; TFirma.LadeAlle
neuefirma.Eingabe
Print neuefirma
'neuefirma.Speichern

sleep
End
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Neuling



Anmeldungsdatum: 19.08.2013
Beiträge: 12
Wohnort: Baienfurt (DE)

BeitragVerfasst am: 07.09.2013, 15:38    Titel: Einstieg finden Antworten mit Zitat

Zitat:

Er will aber wahrscheinlich folgendes:

Code:

01 00 4f 74 74 6f 20 4d 61 79 65 72 20 56 65 72 
6c 61 67 20 48 48 20 20 20 20 20 20 20 20 20 20
48 61 75 73 20 61 6d 20 42 61 63 68 20 32 32 20
20 20 20 20 20 20 20 20 20 31 32 33 34 35 20 4e
69 72 67 65 6e 64 68 61 75 73 65 6e 20 20 20 20
20 20 48 61 6e 73 69 73 20 48 61 75 73 62 61 6e
6b 20 42 65 72 6c 38 37 36 35 34 33 32 31 30 30
38 35 32 34 36 33 35 37


Genau das will ich. Mit ein paar Änderungen - Anregungen von euch und Probieren - habe ich es geschafft. Auch dass der 2. Datensatz genau hinter dem ersten anfängt, ist erreicht.
Allerdings habe ich folgenden Code (auszugsweise die entscheidenden Stellen) verwendet:

Code:

TYPE FirmenDatei
   DFirmaNr As Short = 0
   DName As String * 30
   DStrasse As String * 25
   DOrt As String * 25
   DBankname As String * 20
   DBLZ As String * 8
   DKontoNr As String * 10
   DIBAN As String * 22
   DBIC As String * 11
End Type
Dim Shared Fir AS FirmenDatei: '  Länge = 151

Open "SAVETEST.DIR" For Binary As #1 Len = 151       'Len (Fir)
....
    Put #1, FirmaNr + (FirmaNr - 1)*(151+8), Fir
....


Das Programm von 1990 war unter der Prämisse geschrieben, dass Hauptspeicher sehr "rar" war und Plattenspeicher auch ziemlich begrenzt und / oder teuer. Dem ist heute nicht mehr, sodass ich beim Transponieren der Dateien auf solche Einwände, wie die von RockTheShock, reagieren kann. Anpassungen wegen wirtschaftlicher Rahmenbedingungen (SEPA, Auslandsadressen usw.) können platzmäßig berücksichtigt werden. Darüber hinaus sind Anpassungen im erforderlichen und ersichtlichen Rahmen sowieso klar.

Meine letzten Tests gingen einmal darum, von -lang "qb" auf -lang "fb" anzupassen. Diesen Schritt brauche ich, um in die Materie besser hineinzukommen und zu sehen, was in welcher Weise zu welchem Ergebnis führt. Allein dabei bin ich experimentell (und damit nachhaltig) auf Probleme gestoßen, die es in sich haben.
1.) Integer <---> Short in Verbindung mit -lang "qb": Daten werden nicht korrekt gelesen.
2.) Dateizugriff (Binary statt Random) mit der Folge des Nullbytes
Beides ist unbedingt nötig, weil ich bestehende Daten habe, um die herum ich aufbauen muss. Ein Neuerfassen ziehe ich erst dann in Erwägung, wenn alle anderen Tricks erfolglos gescheitert sind. Obiges Beispiel war eine Neuanlage von Datendateien, was diese Probleme nicht aufwirft. Dennoch war es für mich wichtig, weil ich dadurch mich mit 2.) auseinander setzen musste und gelernt habe. Ferner musste ich feststellen, dass QB viel zu locker in puncto Strukturierung ist/war. Variablen mit dem selben Identifier konnten problemlos als STRING und INTEGER (SHORT) im selben Modul, aber in einer SUB oder FUNCTION ohne Definition verwendet werden.

Dabei habe ich feststellen müssen, dass das vorstehende Problem nicht in lösbar ist innerhalb FB. Deshalb muss ich die Möglichkeit nutzen, unter Win XP und mit PDS 7.x die Dateien zu konvertieren. Dafür war es (rückblickend) aber wichtig, die Zusammenhänge mit den Dateien zu verstehen. Diese Arbeit werde ich in den kommenden Tagen (wie lange ich brauche, kann ich heute nicht abschätzen) erledigen.

Ich habe unter <https://www.hightail.com/download/OGhjUGhTd0lmVFpOeDhUQw> mal zusammengestellt, wie ein Teilprogramm aussieht. Der Quellcode soll die in der EXE-Datei produzierten Ergebnisse offenlegen. Das JPG-Beispiel stellt dar, wie ich mir eine gute und gelungene Eingabe (unter Windows) vorstelle. Dass es sich dabei um einen Screenshort aus einem Steuerprogramm handelt, ist Zufall. Es zeigt halt kompakt mehrere Aspekte der Erfassung: Auswahlfelder, reine Eingabefelder, Datumseingaben, Eingaben mit Hilfestellung (Steuer-ID). Bitte nicht als DAS (optisch) einzig Wahre ansehen, sondern als Vorgabe für optimale Erfassung mit (maximaler) Unterstützung.

Nach dem Transponieren der Datendateien gehe ich dann daran, mich um die Objektorientierung und das Anwenden von Maus- und Tastatursteuerungen zu kümmern. Wer mir hierzu anschauliche und verständliche Beispiele nennen kann, ist hierzu herzlich eingeladen. Ich würde gerne - es sei denn es ist (fast) unmöglich - bei FreeBasic bleiben. PureBasic oder PowerBasic kann ich immer noch einsetzen, wenn es anders nicht geht.

Danke schön und dis dann.
Dietmar
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 07.09.2013, 16:22    Titel: Antworten mit Zitat

Zitat:
1.) Integer <---> Short in Verbindung mit -lang "qb": Daten werden nicht korrekt gelesen.

Integer sind in QBaisc (und damit auch unter -lang qb) 16 Bit, in FreeBASIC 32 Bit. Wenn du eine Einheitlichkeit für beide Sprachen brauchst, kannst du LONG verwenden; das ist beide Male 32 Bit (und auch zukunftssicher in Bezug auf ein mögliches 64bit-FreeBASIC ...)
Zitat:
2.) Dateizugriff (Binary statt Random) mit der Folge des Nullbytes

Eine Möglichkeit wäre, das UDT nicht als Gesamtes zu speichern, sondern eine eigene Speicherroutine zu schreiben; dann kannst du das mit dem Nullbyte so steuern wie du es haben willst. Für so etwas bietet sich FOR BINARY auch hervorragend an, weil du exakt (byte-genau) steuern kannst, an welcher Stelle der Datei du schreiben bzw. lesen willst.

Für die Eingabemaske würde ich auf jeden Fall zu einer GUI-Bibliothek raten. Mit Gtk, Qt oder Wxwidget hast du den Vorteil einer Plattformunhabhängigkeit (im Gegensatz zur WinAPI), oder du schaust dir mal die komplett in FreeBASIC geschriebene sGUI von Muttonhead an. Und falls du mit Wxwidgets liebäugelst, möchte MOD sicher, dass ich dich auf wxFBE hinweise; das ist ein FreeBASIC-Editor (in Entwicklung) mit Möglichkeit, eine GUI zusammenzuklicken.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 07.09.2013, 17:10    Titel: Antworten mit Zitat

Noch ne kleine Bemerkung zur Laengenangabe deines Datentyps:
Der Datentype FirmenDatei ist nicht 120 Bytes, sondern 126 Bytes lang (erste Version). Im veraenderten Datentype bei dem noch zwei Strings dazu gekommen sind, gibst Du die laenge mit 151 Bytes an, die tatsaechliche laenge ist aber 162 Bytes. Ueberpruefen kannst Du das zum Beispiel so:
Code:

'Dein Datentype u.s.w

Print SizeOf(FirmenDatei)

Ich bin mir zwar nicht sicher, aber es koennte moeglicherweise wichtig sein fuer die Buffer-Laengenangabe beim Oeffnen der Datei. Das Wissen die Profis hier im Forum aber besser als ich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Neuling



Anmeldungsdatum: 19.08.2013
Beiträge: 12
Wohnort: Baienfurt (DE)

BeitragVerfasst am: 07.09.2013, 17:22    Titel: Einstieg finden Antworten mit Zitat

Ich sehe schon, mit dem Datei-Handling hat man heute viel mehr Möglichkeiten - oder sehe ich das erst jetzt.

Da ist es sicher nicht fehl am Platz, wenn ich mich gerade deshalb nochmals intensiv um dieses Thema kümmere, indem ich die Dateien transponiere und gleichzeitig etwas "aufbohre". Schaden kann's nicht.

Den Befehl Print SizeOf(DateiName) werden ich mir gut merken. Danke.


Zuletzt bearbeitet von Neuling am 07.09.2013, 17:29, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 07.09.2013, 17:23    Titel: Antworten mit Zitat

Die Recordlänge spielt nur beim Dateimodus RANDOM eine Rolle und wird sonst ignoriert; im Dateimodus BINARY richtet sich die Anzahl der gelesenen Bytes an der Länge der Variablen, in die gelesen wird (das ist insbesondere wichtig, wenn ein String einzeln ausgelesen werden soll). Aber abgesehen davon empfiehlt es sich natürlich immer, die Länge eines UDTs nicht per Hand auszurechnen, sondern über SIZEOF zu bestimmen. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 07.09.2013, 17:42    Titel: Datensatzlänge mit Random und Field Antworten mit Zitat

Wenn du Datensätze mit Random ließt solltest du beim Type mit Field festlegen welches Alignment gewählt wird. Sonst wird defaultmäßig 4 Byte genommen. bei QB sind es 1 byte. D.h. wenn du in Freebasic die alten Daten auslesen möchtest musst du field auf 1 setzen also
Code:
TYPE FirmenDatei Field = 1
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 07.09.2013, 19:29    Titel: Re: Einstieg finden Antworten mit Zitat

Neuling hat Folgendes geschrieben:
Gespräche, sowohl mit dem derzeitigen als auch den künftigen Nutzern, haben ergeben, dass ich die Umsetzung in eine "echte" Windows-Anwendung angehen soll. Es liegt in meinem Ermessen, wie viel ich davon umsetze. Aber Sinn soll das Ganze dann doch machen.

Danke für Deine Ausführungen. Aus meiner Sicht empfehlenswert: Portierung auf Win32 -> Testkriterium = fertige Anwendung muss auf sämtlichen aktuelle x86- und x64-Windows-Versionen lauffähig sein. Mit FreeBasic hast Du den Glücksfall, maximal viel Code wiederverwenden zu können. Im Sinn von guter Wartbarkeit macht daher ein sanftes Refactoring Sinn, also typische MS-DOS-spezifische Dinge/Speicherspar-Kompromisse aus der Intel 8088-Real Mode-Zeit (Stichwort konventioneller Speicher) rauszuwerfen.

Neuling hat Folgendes geschrieben:
Wirtschaftlich ist es für's erste unrentabel. Wenn es mir gelingt, eine gute Applikation zustande zu bringen, steht einer Vermarktung nichts im Wege; zumindest ist es einen Versuch wert. Aus diesem Grund und um in die Materie "objektorientierte Programmierung" hinein zu kommen, würde ich gerne diese Aufgabe angehen. An einem konkreten Projekt mit einem klaren Ziel ist dies leichter zu erreichen, als wenn man "nur so" loslegt. Erfahrungsgemäß macht man dann nur das, was man eh schon kann. Die Tiefe und der Biss fehlen dann, zumindest bei mir.

Auch hier ein Tipp für später (Stichwort Vermarktung): Überleg Dir noch gut, ob Du das Projekt als Open Source oder Closed Source aufbauen willst. Es gibt mittlerweilen erfolgreiche Firmen, welche die Software selber als Open Source herausgeben, ihr Geld mit Dienstleistungen (=beim Kunden das Ganze spezifisch anpassen und einrichten sowie Support leisten) machen.

Falls Du Closed Source bevorzugst: Denke an den Fall, was der Kunde machen soll, wenn Du einmal in den Bergferien tödlich abstürzst... => Stichwort alles Know-How in nur einem Kopf = Risiko, welches jeder denkfähige Einkäufer bei grösseren Firmen beachtet (weiss ich aus Erfahrung im Zusammenhang mit der Auftragsaquisition als Kleinfirma gegenüber jemand Grösserem). Geeignete Lösung: Aktueller Quellcode z.B. bei einem Notar hinterlegen und passendes Notfallkonzept, damit die Weiterentwicklung auch durch einen Nachfolger sichergestellt ist. Alternative: Gesamte Anwendung als Team weiterentwickeln, so dass sämtliches Knowhow immer über mehrere Köpfe verteilt ist.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 09.09.2013, 15:10    Titel: Antworten mit Zitat

Ein möglicher Ansatz könnte es sein, den jetzigen Funktionsumfang bzw. den gesamten Unterbau mit den Hauptfunktionen der Software OpenSource Dual zu lizenzieren und die restlichen Zusatzfunktionen Closed Source zu machen, z.B. ein Berichts und ein Druckformular Modul.

Ein gutes Beispiel was mit Software so passieren kann:
http://www.blog-rundum.de/cao-faktura-was-fuer-ein-drama/

Und hier was man so auf Modulebene trennen kann.
http://www.cao-wawi.de/produkte/cao-faktura


Staroffice ist ein gutes Beispiel das gute OpenSource Software mit guter Basis kaum tot zu kriegen ist: http://de.wikipedia.org/wiki/StarOffice
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Neuling



Anmeldungsdatum: 19.08.2013
Beiträge: 12
Wohnort: Baienfurt (DE)

BeitragVerfasst am: 14.09.2013, 13:11    Titel: Einstieg finden Antworten mit Zitat

Kurzes Hallo für etwas (Nach)hilfe,

in den letzten Tagen habe ich weiter gelernt am Beispiel: Daten_konvert.zip <<https://www.hightail.com/download/OGhmS3hjNDJqY3B4Tk1UQw>>

existierende Daten einlesen und in andere Datei mit geänderter Struktur schreiben. Die vorher gemachten Erfahrungen haben mich ja vorsichtig werden lassen bezüglich des schnellen Fortschritts. Das hat sich bewahrheitet. Ich hänge hier gewaltig.

Meine Tests gingen um
OPEN FOR RANDOM, OPEN FOR BINARY, TYPE, FIELD, Datenstrukturen im Allgemeinen und schließlich noch um REDIM. Die Sache mit der Satzlänge ganz schön kniffelig. Addiert man die definierten (explizit und implizit) Längen und vergleicht das Ergebnis von SizeOf, kommt man mit der Angabe der Länge von SizeOf nicht mal annähernd an ein vernünftiges Ergebnis. Im vorliegenden Beispiel ist die gespeicherte Satzlänge (Short = 2 Byte, String = wie angegeben) 120 Bytes, SizeOf (eFir) bringt 6 Bytes mehr, was für jeden String ein NULL-Byte ist. Beim Einlesen der Daten darf dieses NULL-Byte aber keines Falls erscheinen. Ab der 2. String-Variable (eStrasse) ist der Inhalt um jeweils 1 Byte nach "vorne" verschoben. Gibt es eine einfache Möglichkeit, diesen Versatz zu vermeiden? Wenn möglich mit Verwendung der Variable "eFir" als Einheit.
Wenn es keine Möglichkeit gibt, muss ich umständlicher werden und mit SEEK arbeiten. Ist aufwändig, aber dann wohl unumgänglich. Hat aber gleichzeitig das Potential, mehr über Datenmanipulationen zu erfahren - schaden wird es sicher nicht. Bei REDIM habe ich anscheinend noch nicht ganz verstanden, was der genaue Zweck (Hintergrund) ist.

Ein weiteres Problem hat sich auf beim Konvertieren der eingelesenen Daten in die neue Variable "aFir", die mittels TYPE definiert ist. Wenn ich aFir.aNName = eFir.eNName zuweise, hat die Variable aFir.aNName Inhalte, die auf eine Übergabe von zusätzlichen Teilen von eFir hindeuten. Aber warum wird nicht nur der reine Inhalt von eFir.eNName übergeben?

Eine weitere Unklarheit:
Kann der Aufruf der SUB MySub1 (Var1, Var2, Var3, Var4) so gesehen werden, dass "MySub1" eine Variable mit dem Inhalt "Var1Var2Var3Var4" und in genau dieser Folge und Darstellung ist? Logischerweise ist "Var2" im Falle einer Zahl entsprechend "umzusetzen" und "Var1" im Falle eines Strings "as it is" zu sehen.

Die Strukturierung, die RokTheSchock zurecht angemahnt hat, habe ich in diesem Beispiel noch nicht umgesetzt. Die verwendeten SUB habe ich deshalb "angelegt", damit ich gleich noch die Verfügbarkeit und Übergabe von Werten in und aus SUB/FUNCTION bedenken muss. Es soll aber auch eine "Vorstrukturierung" sein, um dann in Richtung .bi usw. weiterzukommen. Auch hier sind mir ein paar Lichtlein aufgegangen, aber auch (s. oben) noch "dunkel".

Die "FIRMEN.DIR" ist die ursprüngliche Datei (erstellt von PDS7.x), aber mittels HEXEditor im Inhalt geändert. Die originale Daten sind natürlich als Kopie gesichert.

Ich arbeite vorwiegend mit FbEdit 1.0.7.6c, in dem es eine Auswahl an Einstellungen gibt: Windows GUI, Windows GUI (debug), Windows Console, Windows Console (debug) usw. Was bewirken hier die Änderungen in meinem derzeitigen Kenntnislevel? Welche Auswahl soll ich treffen?

Herzlichen Dank im voraus.
Dietmar

@RockTheScock: Auf deinen Post vom 09.09.2013 15:10 gehe ich später mal ein, wenn ich ein bisschen weiter bin.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 110

BeitragVerfasst am: 14.09.2013, 14:31    Titel: Antworten mit Zitat

Nur als Info / Anregung
Es gibt Alternativen zu Freebasic.

Dieser Hexdump (siehe 5.9.)
Code:

01 00 4f 74 74 6f 20 4d 61 79 65 72 20 56 65 72    
6c 61 67 20 48 48 20 20 20 20 20 20 20 20 20 20
48 61 75 73 20 61 6d 20 42 61 63 68 20 32 32 20
20 20 20 20 20 20 20 20 20 31 32 33 34 35 20 4e
69 72 67 65 6e 64 68 61 75 73 65 6e 20 20 20 20
20 20 48 61 6e 73 69 73 20 48 61 75 73 62 61 6e
6b 20 42 65 72 6c 38 37 36 35 34 33 32 31 30 30
38 35 32 34 36 33 35 37


stammt aus der Datei "SAVETEST.DIR" die mit folgendem Programm erstellt wurde:

Code:

'--------------------------------------
'PowerBASIC Consolen Compiler
'PB/CC 5
'--------------------------------------

#COMPILE EXE
#DIM ALL        ' Alles DIMmen

TYPE FirmenDatei
    DFirmaNr  AS INTEGER
    DName     AS STRING * 30
    DStrasse  AS STRING * 25
    DOrt      AS STRING * 25
    DBankname AS STRING * 20
    DBLZ      AS STRING * 8
    DKontoNr  AS STRING * 10
END TYPE

GLOBAL Fir AS FirmenDatei '  Länge = 120

GLOBAL EFirmaNr AS INTEGER   ' Auch möglich: GLOBAL EFirmaNr%
GLOBAL EName AS STRING       ' Auch möglich: GLOBAL EName$
GLOBAL EStrasse AS STRING
GLOBAL EOrt AS STRING
GLOBAL EBankname AS STRING
GLOBAL EBLZ AS STRING
GLOBAL EKontoNr AS STRING
GLOBAL FirmaNr AS INTEGER
GLOBAL XS AS STRING
GLOBAL xe AS STRING

FUNCTION PBMAIN () AS LONG    '<---- Hautprogramm

    OPEN "SAVETEST.DIR" FOR RANDOM AS #1 LEN = 120       'Len (Fir)

    EFirmaNr = 1
    EName = "Otto Mayer Verlag HH"
    EStrasse = "Haus am Bach 22"
    EOrt = "12345 Nirgendhausen"
    EBankname = "Hansis Hausbank Berlin"
    EBLZ = "87654321"
    EKontoNr = "0085246357"

    PRINT EFirmaNr
    PRINT EName
    PRINT EStrasse
    PRINT EOrt
    PRINT EBankname
    PRINT EBLZ
    PRINT EKontoNr

    DateiSchreiben

    PRINT: PRINT: PRINT "<";Fir.DFirmaNr;"|"; Fir.DName;"|"; Fir.DStrasse;"|"; Fir.DOrt;"|"; Fir.DBankname;"|"; Fir.DBLZ;"|"; Fir.DKontoNr;">"
    PRINT: PRINT
    PRINT "Print Fir:"
    PRINT Fir

    CLOSE #1

    MOUSE 3 : MOUSE ON : WAITKEY$  'warten auf Tastendruck
END FUNCTION

' *****   Daten in Datei schreiben   *****
SUB DateiSchreiben
    FirmaNr = EFirmaNr   
    Fir.DFirmaNr = EFirmaNr
    Fir.DName = EName
    Fir.DStrasse = EStrasse
    Fir.DOrt = EOrt
    Fir.DBankname = EBankname
    Fir.DBLZ = EBLZ
    Fir.DKontoNr = EKontoNr
    PUT #1, FirmaNr, Fir
END SUB
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 14.09.2013, 14:38    Titel: Antworten mit Zitat

So kompliziert wird es mit dem SEEK nicht. UDT-Länge * Datensatznummer (beginnend mit 0) + Offset des Records + 1 (weil das erste Byte nicht die Nummer 0, sondern 1 besitzt).

Warum darf das Nullbyte beim einlesen nicht erscheinen? Ein String hat intern doch an den Inhalt so oder so ein Nullbyte angehängt. Ob das Nullbyte "sowieso da" ist oder mit eingelesen wird, macht für mich keinen erkennbaren Unterschied. Muss die Datei noch von einem anderen Programm eingelesen werden? (Und wenn ja, warum kann dieses Programm dann nicht einfach den eingelesenen String um 1 kürzen? happy )

Man kann das mit dem Nullbyte schon per Hand irgendwie lösen; dazu wäre es aber erst wichtig zu wissen, warum es stört.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Neuling



Anmeldungsdatum: 19.08.2013
Beiträge: 12
Wohnort: Baienfurt (DE)

BeitragVerfasst am: 14.09.2013, 18:08    Titel: Einstieg finden Antworten mit Zitat

@Horst:
Ich habe zur Kenntnis genommen, dass PowerBasic existiert. Allerdings habe ich keinen Download-Link gefunden, mit dem eine kostenlose Version zu bekommen war. Alle von mir gefundenen Wege führten dazu, dass zuerst ein Bezahlvorgang abgeschlossen werden musste, bevor ein Download möglich war. Und - just for fun - mal $199,- ausgeben, das möchte ich im Augenblick nicht. Als uneingeschränkte Version habe ich nichts gefunden; FirstBasic hat genau die Einschränkungen, die nicht sein dürfen. Auf <<http://www.qbasic.de/pb/#pbdown>>habe gerade nochmals nachgesehen, die Ausführungen zu PB sind interessant. Es geht mir nicht darum, alles kostenlos zu bekommen. Nur zu "Lernzwecken" möchte ich kein Geld investieren. Wenn ich mal den genaueren Weg und das endgültige Ziel kenne, ist das nicht der Knackpunkt.
Wenn wir gerade dabei sind: Falls ich mich für PowerBasic entscheiden sollte, müsste ich kaufen?
1. PowerBASIC Compiler 10.0 for Windows
und/oder
2. PowerBASIC Console Compiler 6.0 for Windows

@nemored:
Kompliziert wäre das nicht, nur aufwändig. Es gibt eine Datei, in der sind pro Datensatz (1415 Bytes) ca. 30 Variablen, davon ca. 10 als Arrays - teils STRINGs, teils numerisch (2 Byte & 4 Bytes) gespeichert. Und das zwischen vielen INTEGER (2 Byte) bzw. LONG (4 Byte) - bezogen auf den "alten" QB-Code.
Es geht um das Einlesen bestehender, alter Daten, das nicht richtig tut. Damals wurde das Stopp-Byte (NULL-Byte) nicht benötigt. Bei der Definition, wie ich sie in der ZIP-Datei verwendet habe, gibt es das Problem, dass ab der 2. STRING-Variablen der Anfang um jeweils 1 Byte abgeschnitten wird. Die TYPE DateiName FIELD = 1 erzeugt automatisch dieses NULL-Byte. Warum sonst verschiebt sich der Inhalt um genau 1 Byte pro STRING-Variable? Und dabei sind die 1. Variable (SHORT) und die 2. (1. STRING) noch korrekt. Mit der EXE-Datei im Download kannst du das leicht nachprüfen - und zwar 1:1 wie ich es erlebt habe. Mit der BAS-Datei könnte - je nach Compiler? - dieses Problem nicht mehr auftauchen.

Deine einfache Formel UDT-Länge * Datensatznummer + Offset des Records + 1 funktioniert aus dem Grund nicht, weil ja innerhalb eines eingelesenen Datensatzes ja bereits eine Verschiebung statt findet. Es bliebe da nur das variablenweise Einlesen, was im vorliegenden Beispiel (gerade) noch überschaubar ist. Aber bei einem Datensatz wie beschrieben und obiger Definition kaum noch überschaubar - auch mit sehr guten Mathekenntnissen. Die ganze Arbeit würde dann im Erstellen von Formeln und händischem Tippen von Variablennamen bestehen. Wenn du willst, kann ich die Datendefinition gerne hier einstellen.

Schau bitte mal mein Programm an. Danke schön und schönen Abend.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 14.09.2013, 18:25    Titel: Re: Einstieg finden Antworten mit Zitat

Neuling hat Folgendes geschrieben:
Deine einfache Formel UDT-Länge * Datensatznummer + Offset des Records + 1 funktioniert aus dem Grund nicht, weil ja innerhalb eines eingelesenen Datensatzes ja bereits eine Verschiebung statt findet.

Diese Verschiebung ist eigentlich entweder in "UDT-Länge" (gerechnet nach der alten verwendeten Länge) oder in "Offset des Records" drin. grinsen Es funktioniert nur nicht, wenn die Datensätze nicht alle gleich lang sind. Dann bleibt dir wirklich nichts anderes als einzeln auslesen.

Wenn es nur um das (einmalige) Importieren alter Datensätze geht, wäre es vielleicht denkbar, diese mit einem mit -lang qb compilierten Programm einzulesen (sollte sich ja wie in QBasic verhalten) und anders, z. B. erst mal nur rein sequentiell abzuspeichern. Dann die sequenziellen Daten mit einem regulären FB-Programm einlesen und als UDT-Struktur mittels BINARY abspeichern. So würde ich das zumindest machen. lächeln

edit: Falls du Lust hast, kannst du mal in die patwort.bas reinschauen, wie ich da die Spielstände lade (SUB spielLaden) - allein schon pro Feld 26 Variablen einschließlich Strings variabler(!) Länge, ein Array und sechs Listen variabler Länge, die wiederum aus UDTs mit mehreren Records bestehen. Viel Text, aber rechnen musste ich dafür nichts - nur in der richtigen Reihenfolge auslesen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 14.09.2013, 21:31    Titel: Antworten mit Zitat

@Neuling: Ich wuerde die Konvertierung mit QuickBASIC durchfuehren und zwar so, das man die Daten in FB erst mal verwenden kann. Wenn du dann die Struktur veraendern willst hast du's nicht mehr so schwer. Ich hab mal deine Beispiel-Firmendatei aus deiner Zip in eine FB-Kompatible Datei Konvertieret. Ich hab die Strings im Datentyp fuer FB um ein Byte verlaengert, und diese struktur dann in einer neuen Datei gespeichert. Im FB-Programm muss dann wieder die alte strukturlaenge verwendet werden, funktioniert gut. Das Programm fuer QuickBASIC sieht so aus:
Code:

DECLARE SUB SpeichernBinaer (SatzNr AS INTEGER, Adr AS ANY)
DECLARE SUB DatenZeigenN (Adr AS ANY)
DECLARE SUB SatzKonvertieren (aAdr AS ANY, nAdr AS ANY)
DECLARE SUB LadenBinaer (SatzNr AS INTEGER, Adr AS ANY)

TYPE aFirmenDatei            'Field = 1
    eFirmaNr AS INTEGER '= 0
    eNName AS STRING * 30
    eStrasse AS STRING * 25
    eOrt AS STRING * 25
    eBankname AS STRING * 20
    eBLZ AS STRING * 8
    eKontoNr AS STRING * 10
END TYPE
   
TYPE nFirmenDatei            'Field = 1
    eFirmaNr AS INTEGER '= 0
    eNName AS STRING * 31
    eStrasse AS STRING * 26
    eOrt AS STRING * 26
    eBankname AS STRING * 21
    eBLZ AS STRING * 9
    eKontoNr AS STRING * 11
END TYPE
 

DIM aFir AS aFirmenDatei
DIM nFir AS nFirmenDatei
DIM i AS INTEGER

CLS
PRINT LEN(aFir)
PRINT LEN(nFir)

FOR i = 1 TO 2
   LadenBinaer i, aFir
   SatzKonvertieren aFir, nFir
   PRINT
   DatenZeigenN nFir
   SpeichernBinaer i, nFir
NEXT i
SLEEP

SUB SpeichernBinaer (SatzNr AS INTEGER, Adr AS nFirmenDatei)
   DIM hFile AS INTEGER
   DIM SatzPos AS LONG
   SatzPos = (SatzNr - 1) * LEN(Adr) + 1
   hFile = FREEFILE
   OPEN "Firmen.neu" FOR BINARY AS #hFile
   PUT #hFile, SatzPos, Adr
   CLOSE #hFile
END SUB

SUB DatenZeigenN (Adr AS nFirmenDatei)
      PRINT "FirmaNr..: "; Adr.eFirmaNr
      PRINT "Name.....: "; Adr.eNName
      PRINT "Strasse..: "; Adr.eStrasse
      PRINT "Ort......: "; Adr.eOrt
      PRINT "Bankname.: "; Adr.eBankname
      PRINT "BIC......: "; Adr.eBLZ
      PRINT "IBAN.....: "; Adr.eKontoNr
END SUB

SUB LadenBinaer (SatzNr AS INTEGER, Adr AS aFirmenDatei)
   DIM hFile AS INTEGER
   hFile = FREEFILE
   DIM SatzPosition AS LONG
   SatzPosition = (SatzNr - 1) * LEN(Adr) + 1
   OPEN "FIRMEN.DIR" FOR BINARY AS #hFile
   GET #hFile, SatzPosition, Adr
   CLOSE #hFile

END SUB

SUB SatzKonvertieren (aAdr AS aFirmenDatei, nAdr AS nFirmenDatei)
 nAdr.eFirmaNr = aAdr.eFirmaNr
 nAdr.eNName = aAdr.eNName
 nAdr.eStrasse = aAdr.eStrasse
 nAdr.eOrt = aAdr.eOrt
 nAdr.eBankname = aAdr.eBankname
 nAdr.eBLZ = aAdr.eBLZ
 nAdr.eKontoNr = aAdr.eKontoNr
END SUB

Schau dir die unterschiede der Datentypen an, im Testprogramm fuer FB wird wieder der normale Type verwendet.
Ich hoffe mir springt keiner an den Hals, aber hier das FB-Programm.
Code:

Type aFirmenDatei            Field = 1
   eFirmaNr AS Short = 0
   eNName AS String * 30
   eStrasse AS String * 25
   eOrt AS String * 25
   eBankname AS String * 20
   eBLZ AS String * 8
   eKontoNr AS String * 10
End Type
 
Sub DatenZeigen(ByRef Adr As aFirmendatei)
   With Adr
      Print "FirmaNr..: "; .eFirmaNr
      Print "Name.....: "; .eNName
      Print "Strasse..: "; .eStrasse
      Print "Ort......: "; .eOrt
      Print "Bankname.: "; .eBankname
      Print "BIC......: "; .eBLZ
      Print "IBAN.....: "; .eKontoNr
   End With
End Sub

Sub LadenBinaer(ByVal SatzNr As Integer,  ByRef Adr As aFirmenDatei)
   Dim As Integer hFile = FreeFile
   Dim As LongInt SatzPosition
   SatzPosition = (SatzNr-1) * SizeOf(aFirmenDatei) + 1
   Open "FIRMEN.NEU" For Binary As #hFile
   Get #hFile, SatzPosition, Adr
   Close #hFile
End Sub

Dim aFir As aFirmenDatei

Print SizeOf(aFirmenDatei)

for i as integer = 1 to 2
  LadenBinaer(i, aFir)
  DatenZeigen(aFir)
  print
next i
GetKey ()

Ob das fuer alle deine Daten verwendbar ist weis ich nicht, aber ist eine moeglichkeit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Neuling



Anmeldungsdatum: 19.08.2013
Beiträge: 12
Wohnort: Baienfurt (DE)

BeitragVerfasst am: 15.09.2013, 16:51    Titel: Einstieg finden Antworten mit Zitat

@nemored:
Durch die Definition
Code:
TYPE Dateiname
   Var1 AS INTEGER (SHORT in FB)
   Var2 AS STRING * 30
   Var3 AS STRING * 25
   .....
END TYPE

ist die Länge des Datensatzes automatisch immer gleich, auch wenn eine Variable mal nur teilweise mit "Inhalt" gefüllt wurde. Das kann ich mittels HEX-Dump belegen. Hast du die Möglichkeit, mit einem HEX-Editor mal die .DIR-Datei anzuschauen? Dann wirst du sehen, dass die Daten vorliegen wie folgt:
Code:

10 00 48 61 75 73 76 65  72 77 61 6C 74 75 6E 67       ..Hausverwaltung   .. = 01 für Satz# 1
73 47 6D 62 48 20 2E 2E  2E 76 65 72 47 6D 62 48       sGmbH ...verGmbH
53 74 72 61 73 73 65 6E  2D 57 65 67 2D 4E 72 2E       Strassen-Weg-Nr.
53 74 72 61 73 73 65 39  39 50 4C 5A 2F 4F 72 74       Strasse99PLZ/Ort
20 50 4C 5A 2F 4F 72 74  20 50 4C 5A 2F 4F 72 74        PLZ/Ort PLZ/Ort
20 50 42 61 6E 6B 6E 61  6D 65 20 64 65 72 20 46        PBankname der F
69 6C 69 61 6C 65 42 4C  5A 42 4C 5A 42 4C 4B 74       ilialeBLZBLZBLKt
6F 2D 4E 72 20 4B 74 6F  02 00 46 72 61 6E 7A 20       o-Nr Kto..Franz   .. = 02 für Satz# 2

Datensatz 2 ist strukturell exakt identisch mit Satz 1.

Zitat:

Wenn es nur um das (einmalige) Importieren alter Datensätze geht, wäre es vielleicht denkbar, diese mit einem mit -lang qb compilierten Programm einzulesen (sollte sich ja wie in QBasic verhalten) und anders, z. B. erst mal nur rein sequentiell abzuspeichern. Dann die sequenziellen Daten mit einem regulären FB-Programm einlesen und als UDT-Struktur mittels BINARY abspeichern. So würde ich das zumindest machen.

Daran habe ich auch schon gedacht, aber vorläufig wieder verworfen. Klar: Einlesen -- ein NULL-Byte anhhängen -- speichern. Aber kann QuickBasic damit umgehen? Mit QuickBasic meine ich wirklich das PDS 7.x als DOS. Ein Versuch wäre es wert, wenn ich anders nicht weiter komme.

@Elor:
Irgendwie haben wir beide nicht dasselbe Handwerkszeug im Einsatz. Deinen Code für QB habe ich benutzt und das Ergebnis <<https://www.hightail.com/download/OGhjdFdSZEtLVlY4SjhUQw>> erhalten. Bild 1 zeigt, dass <FirmaNr> und <Name> korrekt gelesen werden. <Strasse> wird um das "S" gekürzt und mit "P" aus <Ort> ergänzt. Bei <Ort> fehlt das "P" und zusätzlich wieder das "L" usw. <IBAN> müsste "Kto-Nr Kto" = 10 Byte zeigen. Der 2. Teil von Bild 1 zeigt die Feldinhalte nach SUB SatzKonvertieren. Bei <Name> erscheint das fehlende "S" am Ende, bei <Strasse> kommt das "L" von "PLZ/Ort..." usw. Bild 2 zeigt dann Satz 2 mit den bekannten Verschiebungen plus "unsinniger" Satznummer, was aber logisch ist.
Bei Bild 3 habe ich den Code verändert bei:
Code:
TYPE aFirmenDatei   FIELD = 1
....
SatzPosition = (SatzNr - 1) * 120 + 1    'statt  * Len (Adr) + 1
...
OPEN "FIRMEN.DIR" FOR BINARY AS #hFile Len = 120          'um  Len = 120 ergänzt
...
SUB SpeichernBinaer (..) ist * LEN (Adr) + 1  ersetzt durch * 126 + 1 und OPEN ... analog ergänzt.

Bild 4 ist wie Bild 2, aber mit der Code-Änderung.
Bild 5 zeigt das Ergebnis des FB-Codes. Man sieht deutlich die "ausgelassenen" Bytes bzw. die Verschiebung.

Betrachtet man "FIRMEN.NEU", so ist definitiv das NULL-Byte eingefügt - und zwar an der falschen Stelle. Nicht nach "..GmbH" sondern bei "..GmbHS00", wobei "00" das NULL-Byte darstellt. Also eingefügt, aber an der "verschobenen" Stelle. Kannst du mal den HEX-Dump der <FIRMEN.NEU> oder die Datei selbst einstellen?

Warum erscheint bei mir immer noch die Verschiebung und bei dir nicht. Es ist rätselhaft.

@alle:
Solange dieses Problem auftaucht - egal unter welcher -lang - ist ein Weiterdenken nicht wirklich sinnvoll, oder? Ich erwarte von euch keine perfekte Lösung in Form eines lauffähigen Codes. Vielmehr bin ich für Erklärungen dieses Problems betreffend sehr dankbar.

Danke schön für die Unterstützung.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 15.09.2013, 18:56    Titel: Antworten mit Zitat

Hallo... ich hab mir die Bilder angeschaut und werde das gefuehl nicht los,
das du beide Programmcodes mit FB Ausgefuehrt hast, das Funktioniert nicht. Ich habe folgendes verwendet.

1. Fuer das QuickBASIC Programm, den Konverter, habe ich QuickBASIC
4.5 verwendet, es geht aber auch mit der Version 7.1.
2. Als Datendatei habe ich deine Beispiel Datei "FIRMEN.DIR" aus deiner
Daten_Konvert.zip verwendet.
3. Die Konvertierte Datei "FIRMEN.NEU" wird dann mit dem zweitem
Programm fuer FB gelesen und Angezeigt.
Und bitte... nicht mit den Typlaengen herum Spielen, der Datentyp ist nun mal 120 Byte unter QuickBASIC und 126 Byte unter FB.

Es geht doch darum: QuickBASIC verwendet (im gegensatz zu FB) keine zwischenraumzeichen bei einem UDT-Datentyp mit Strings. FB Interpretiert aber jedes Zeichen nach der Stringlaengendeklaration als trennbyte. Das ist der grund warum da immer das erste Zeichen vom folgenden String fehlt und das Addiert sich je groesser der Datensatz b.z.w. je mehr Strings enthalten sind.
Mit QuickBASIC kann mann diese Datensatze aber richtig einlesen.
Die Idee die hinter meinem Programmcode steckt, ist einfach der, das man in der UDT-Kopie jeden String um ein Byte verlaengert und FB so ein zwischenraumzeichen zur verfuehgung stellt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 110

BeitragVerfasst am: 15.09.2013, 20:24    Titel: Antworten mit Zitat

Zitat:
Solange dieses Problem auftaucht - egal unter welcher -lang - ist ein Weiterdenken nicht wirklich sinnvoll, oder?


Dann solltest du meinen Tipp bezüglich PowerBasic im Hinterkopf behalten.

- Deine Random-Dateien kannst du unverändert bearbeiten.
- Integer bleibt Integer

Hauptsächlich erforderliche Änderungen:
- Shared --> Global
- Locate muss teilweise angepasst werden. (Siehe Sub KopfZeile).
- Variablennamen müssen eindeutig sein. (c%, c$, SUB c() ist nicht erlaubt).

Nächster Punkt: Drucken auf beliebigen Windowsdrucker.

PB kann mit LPRINT auf einen an LPTx angeschlossenen Drucker drucken.
Mit XPRINT auf jeden Windowsdrucker.

Hier kannst du eine kuze Demo runterladen:
http://www.file-upload.net/download-8080853/neuling.zip.html


----------------------------------------------------------
Datum:15.09.2013

Dateigröße:0.02 MB

Downloads:1

---> Download <-------- Nur hier 1-mal klicken und warten!
(Erscheint verzögert!)
---------------------------------------------------------

Zitat:
Wenn wir gerade dabei sind: Falls ich mich für PowerBasic entscheiden sollte, müsste ich kaufen?


Für deine Umsetzung reicht erstmal die PB/CC Version 5.
Kostet als Classic-Version 79,- € (powerbasic.de).

PB/CC für Consolen-Programme
PB/Win für 'echte' Windows Programme.
Wichtigste Änderungen bei PBCC 6 / PBWIN 10: Vollständige Unicode Unterstützung.
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
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
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