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

Anmeldungsdatum: 22.07.2007 Beiträge: 957 Wohnort: Austria
|
Verfasst am: 16.09.2013, 00:27 Titel: |
|
|
Ich kann nicht ganz nachvollziehen, warum man die Daten nicht einfach manuell einliest anstatt unbedingt ganze UDTs einlesen zu wollen. z.B. so: Code: | #lang "fb"
Type FirmenDatei
As Short DFirmaNr
As String*30 DName
As String*25 DStrasse
As String*25 DOrt
As String*20 DBankname
As String*8 DBLZ
As String*10 DKontoNr
End Type
Declare Function DateiLesen(DatensatzNr As Integer) As FirmenDatei
Declare Sub DateiSchreiben(DatensatzNr As Integer, daten As FirmenDatei)
Dim Fir AS FirmenDatei
Fir.DFirmaNr = 1
Fir.DName = "Otto Mayer Verlag HH"
Fir.DStrasse = "Haus am Bach 22"
Fir.DOrt = "12345 Nirgendhausen"
Fir.DBankname = "Hansis Hausbank Berlin"
Fir.DBLZ = "87654321"
Fir.DKontoNr = "0085246357"
DateiSchreiben(0, Fir)
Fir = DateiLesen(0)
Print "<";Fir.DFirmaNr;"|"; Fir.DName;"|"; Fir.DStrasse;"|"; Fir.DOrt;"|"; Fir.DBankname;"|"; Fir.DBLZ;"|"; Fir.DKontoNr;">"
Sleep
Function DateiLesen(DatensatzNr As Integer) As FirmenDatei
Dim As Integer ff = FreeFile
Open "FIRMEN.DIR" For Binary As #ff
Dim As String dat = Space(120)
Get #ff, DatensatzNr*120, dat
Dim As FirmenDatei daten
daten.DFirmaNr = CVShort(Mid(dat, 1, 2))
daten.DName = Mid(dat, 3, 30)
daten.DStrasse = Mid(dat, 33, 25)
daten.DOrt = Mid(dat, 58, 25)
daten.DBankname = Mid(dat, 83, 20)
daten.DBLZ = Mid(dat, 103, 8)
daten.DKontoNr = Mid(dat, 111, 10)
Close #ff
Return daten
End Function
Sub DateiSchreiben(DatensatzNr As Integer, daten As FirmenDatei)
Dim As Integer ff = FreeFile
Open "FIRMEN.DIR" For Binary As #ff
Dim As String dat = Space(120)
Mid(dat, 1, 2) = MkShort(daten.DFirmaNr)
Mid(dat, 3, 30) = daten.DName
Mid(dat, 33, 25) = daten.DStrasse
Mid(dat, 58, 25) = daten.DOrt
Mid(dat, 83, 20) = daten.DBankname
Mid(dat, 103, 8) = daten.DBLZ
Mid(dat, 111, 10) = daten.DKontoNr
Put #ff, DatensatzNr*120, dat
Close #ff
End Sub |
bzgl. PowerBasic: nur wegen dieser Kleinigkeit (die man wie im Codebeispiel gezeigt auch leicht lösen können sollte) würde ich mir kein PowerBasic kaufen. Außerdem hast du bei FreeBasic den Vorteil dass es komplett quelloffen ist (du könntest dir theoretisch FreeBasic selbst so ändern, dass es die UDTs wie gewünscht speichert), eine große Community dahinter steht und es natürlich völlig kostenfrei ist. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 16.09.2013, 12:16 Titel: |
|
|
St_W hat Folgendes geschrieben: | Ich kann nicht ganz nachvollziehen, warum man die Daten nicht einfach manuell einliest anstatt unbedingt ganze UDTs einlesen zu wollen. z.B. so: [code]#lang "fb"
|
Ich glaube das UDT's u.a. fuer solche zwecke gemacht wurden. Ich kann z.B. nicht verstehen warum man die Positionen fuer die UDT Felder selber berechnen will wenn alles mit einem Byte/String erledigt werden kann. Warscheinlich hab ich mein Beispiel aber einfach nicht richtig erklaert. |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
|
Nach oben |
|
 |
Neuling
Anmeldungsdatum: 19.08.2013 Beiträge: 12 Wohnort: Baienfurt (DE)
|
Verfasst am: 16.09.2013, 17:18 Titel: Einstieg finden |
|
|
@Elor:
15.09.2013 18:56
Ich kann dir versichern, dass dieser Lapsus garantiert nicht passiert ist. Was allerdings zutrifft ist die Tatsache, dass ich weder mit PDS 7.x noch mit QuickBasic 4.5 gearbeitet habe. Beide Programme (DOS-Versionen) lassen sich bei mir auch mit allen möglichen Tricks nicht starten; dafür müsste ich auf Win XP wechseln. Ich habe beide Male FreeBasic verwendet; mit expliziter Angabe von '#lang "qb"' bzw. '#lang "fb"'. Falls hier ein Grund für die "falsche" Dateibehandlung liegt, ist ja eine mögliche Fehlerquelle entdeckt.
Zitat: |
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.
|
Super! Eine Erklärung wie diese ist Gold wert. Jetzt ist klar:
Einlesen als UDT auf kompletter Satzbasis ist mit FreeBasic nicht möglich, egal mit welcher Einstellung. Man muss einen "Umweg" machen. Dieses Gefühl habe ich seit etwa 2 Tagen; wollte diesen Gedanken aber nicht so einfach Raum greifen lassen, ohne eine fundierte Begründung. Diese hast du hier gebracht. Danke.
Zitat: |
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.
|
Aber genau das scheitert ja am Einlesen, so fern man wie bisher verfährt. Wenn das Lesen einwandfrei klappt, macht FB mit der Zuweisung neueVar1 = alteVar1 selbst. Selbstrtedend muss dabei die neueVar1 ein Byte länger sein als alteVar1.
16.09.2013 12:16
Dies war bis vorher auch mein Motto. Zumindest bis sich herausgestellt hat, dass der Weg von St_W der einzig gangbare mit FreeBasic ist. Inzwischen habe ich den Gedanken, eine andere Programmiersprache zu verwenden, so gut wie verworfen. Dank eurer Unterstützung.
@Horst:
Danke für die Vorschläge bezgl. PowerBasic. Zu gegebener Zeit komme ich darauf zurück, falls nötig. Erst mal möchte ich aber dieses Problem vom Tisch haben.
@St_W:
Auf den von dir gezeigten Weg bin ich nicht gekommen. So ähnlich, aber viel umständlicher, hätte ich eine Lösung (besser: einen Weg) gesucht. Mit SEEK und ähnlichen Befehlen wäre sicher ein gangbarer Weg herausgekommen. Da sehe ich, dass ich (noch/wieder) blutiger Anfänger bin. Die letzten gut 20 Jahre ohne Programmierung machen sich halt bemerkbar. Und der Weiterentwicklung von BASIC hinke ich auch noch hinterher. Aber ich gebe mir Mühe - versprochen.
@RockTheSchock:
Ich muss mir angewöhnen, die verwendeten Befehle nachzulesen. Die Ausführungen zu STRING (Datentyp) sagen ja Alles; da steht's ja schwarz auf weiß! Mit etwas Nachdenken hätte ich wissen können, das das Gesagte ja auch auf Strings in UDTs zutreffen muss.
@alle:
Den Vorschlag von St_W werde ich in FB testen und meine restlichen 6 Dateien untersuchen, was dabei rauskommt. Wenn das kappt, mache ich mich final dran, alle Programmteile so an FB anzupassen, dass ich lauffähige EXE-Dateien bekomme, die auch unter einem Windows x64-System problemlos laufen. Logischer weise bleibt es dann immer noch eine Konsolen-Anwendung mit den Vor- und Nachteilen, aber als 32Bit-Applikation.
Danke schön für die Unterstützung. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.09.2013, 17:47 Titel: |
|
|
Elor hat Folgendes geschrieben: | St_W hat Folgendes geschrieben: | Ich kann nicht ganz nachvollziehen, warum man die Daten nicht einfach manuell einliest anstatt unbedingt ganze UDTs einlesen zu wollen. z.B. so: [code]#lang "fb"
|
Ich glaube das UDT's u.a. fuer solche zwecke gemacht wurden. Ich kann z.B. nicht verstehen warum man die Positionen fuer die UDT Felder selber berechnen will wenn alles mit einem Byte/String erledigt werden kann. Warscheinlich hab ich mein Beispiel aber einfach nicht richtig erklaert. |
UDTs wurde allerdings auch nicht dafür geschaffen, um Legacy-Daten von QB jederzeit problemlos auslesen können. Es spricht ja vermutlich nichts dagegen, das alte QB-Layout "händisch" wie von St_W demonstriert zu importieren und dann für zukünftige Programmversionen in einem neuen Format abzuspeichern, das kein Problem mit Strings hat. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 16.09.2013, 20:06 Titel: |
|
|
Hallo,
man könnte die alte Quelldatei auch einfach Byte für Byte oder mit einem variablen Puffer einlesen, dessen Länge man je Feld individuell über SPACE(...) vorbereitet. Mit FreeBASIC kannst du jedes denkbare Dateiformat einlesen, genauso wie in C, VB oder wo auch immer.
FreeBASIC verwendet zur Speicherung und zum Laden von User Defined Types bloß nicht zwingend dasselbe Format wie QBasic oder irgendwelche anderen Sprachen bzw. Interpreter/Compiler. QBasics Methode zur Speicherung der UDTs ist ja keine DIN-Norm oder so, an die sich Compiler-Entwickler zu halten hätten. Wenn man mit den Komfortfunktionen, die die Sprache für sowas bietet, nicht zum Ziel kommt, weil sie nicht 100% kompatibel zu Jahrzehnte alter Software sind, muss man unterhalb dieser Abstraktionsschicht (UDT) ansetzen und selber die zu lesenden Byte-Anzahlen bestimmen.
Für das Programm besteht die Datei ja einfach nur aus einer Sequenz von Bytes. Diese Dateien als UDT einzulesen, ist eine Interpretation der Daten, die die Laufzeitbibliothek (von QB oder FB) für dich macht.
Früher hatten viele Anwendungen übrigens ganz eigene Binärformate. Gerne auch mit Unteraufteilung einzelner Bytes, sodass darin jedes Bit eine unterschiedliche Bedeutung (quasi Boolean) haben konnte. Das musste man auch manuell implementieren bzw. "auseinanderklamüsern" und konnte nicht die fertigen Easy-Go-Funktionen benutzen.
SEEK braucht man dafür aber dennoch nicht. Mit SEEK kannst du in der Datei an eine bestimmte Position springen. Du möchtest sie ja aber einfach nur in bestimmten "Portionen" komplett Stück für Stück nacheinander weg einlesen oder? Du kannst z. B. ungefähr Folgendes machen:
Code: | Dim b As UByte
Open "Binaer.dat" For Binary As #1
For i As Integer = 1 To 12
Get #1, , b
Print "Das " & i & ". Byte der Datei hat den ASCII-Code: " & b & "."
Next i
Close #1 |
Das liest dir exakt 12 Bytes ein. Und kein 13. weiteres oder so.
Oder du machst sowas:
Code: | Dim Puffer As String
Puffer = Space(12)
Open "Binaer.dat" For Binary As #1
Get #1, , Puffer
Close #1
Print "Laenge des Puffers: " & Len(Puffer) |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 16.09.2013, 20:52 Titel: |
|
|
@Jojo: Ich hab nicht gesagt das UDT's ein Allzweckmittel fuer die Datenkonvertierung ist, ich hab einfach nur ein QB Programm geschrieben das seine eigene Datendatei auf einfache weise in eine FB Kompatible Datei umwandelt, sonst nichts. Ich bin davon ausgegangen das Neuling ein DOS Programm Ausfuehren kann, da es ja um ein DOS Programm geht.
Ich weis nicht ob man meine Methode jetzt Kritisieren muss. |
|
Nach oben |
|
 |
Neuling
Anmeldungsdatum: 19.08.2013 Beiträge: 12 Wohnort: Baienfurt (DE)
|
Verfasst am: 30.09.2013, 18:18 Titel: Einstieg finden |
|
|
Hallo,
habe neben den übrigen Verpflichtungen jetzt alle Dateien erfolgreich konvertiert und dabei definitiv festgestellt, dass es nicht möglich ist, die mit QB 4.5 (PDS 7) erstellten Datendateien ohne diese Konvertierung zu nutzen. Spätestens beim ersten Speichern ist die Datei unbrauchbar. UDTs unter QB sind nicht gleich mit UDTs unter FreeBasic. Auch dann nicht, wenn man in FB die ehemaligen Integer-Variablen als SHORT deklariert. Sobald eine STRING-Variable gespeichert wird, ist der Inhalt "verschoben".
In den vergangenen Tagen habe ich mich auch noch intensiver mit UDTs, SUBs und FUNCTIONs beschäftigt. Man kann in FB deutlich sensibler damit umgehen, muss aber dafür die Konventionen gut kennen und entsprechend einsetzen. Die Befehle BYREF und BYVAL machen die Sensibilität und gleichzeitig Variabilität aus. In QB habe ich das nicht kennengelernt. Hier stecken sehr schöne Möglichkeiten drin, die man kennen sollte. Nochmal zur Erinnerung: Ich habe Programmieren nie (professionell) gelernt - es war learning by doing auf dem Hintergrund des BWL-Studiums gepaart mit sehr viel Interesse und Spaß an der Sache.
Im QB-Code habe ich zur Eingabesteuerung eine "Routine" gestellt bekommen, die ein Bekannter selbst geschrieben hat <<http://www.freebasic-portal.de/porticula/eingabe-in-qb-alt-1657.html>>. Die ermöglicht es, mittels Parameter die komplette Steuerung zu bewältigen. Cursor Up, down, links, rechts, Page up, down, ESC usw. können leicht abgefangen und umgesetzt werden. Diese Routine ist aber leider nicht FB-kompatibel. Und ein Anpassen ist mir nicht gelungen, da zu viele Variablen mit gleichem Bezeichner aber unterschiedlichen Typs in der SUB und dem Hauptprogramm verwendet werden. Und - QB-typisch - werden sie gerade verwendet wie sie kommen. In FB geht ohne Deklaration nichts. Das Alles ginge noch, aber es sind Befehle im Einsatz, die unter FB in dieser Form nicht arbeiten. In QB war es ursprünglich eine GOSUB und eine Anpassung an eine SUB will mir nicht gelingen. Das "Beste" daran ist aber, dass die Cursor-Steuerung "verschlüsselt" ist. Eine Abfrage nach z.B. Csr_Up (egal ob in IF ... ELSE... oder SELECT CASE ...) ist nicht möglich. Die einzelnen Codes sind umgesetzt in 1, 2, 4 usw. was ich nach der langen Zeit nicht mehr weiß. Auch der "Programmierer" kann es nicht mehr in angemessener Zeit entschlüsseln - wenn überhaupt.
Hierfür habe ich im FB-Portal ein verfügbares Programm gefunden, das ich fast bis ins letzte Detail verstanden zu haben glaube. Eines allerdings nicht. Das ist:
Code: | IF Variable1 AND Const ANDALSO Variable2 > Variable3 THEN ... |
Mit "Variable1 AND Const" kann ich nicht wirklich was anfangen. Ich weiß, dass das mit einer Bitverschiebung zu tun hat, aber mehr nicht. Warum kann das anders nicht ausgedrückt werden? Ist es so viel komplizierter - oder gar unmöglich? Vor allem dann, wenn es darum geht, ob "Csr_up" (&h48FF) oder "Csr_down" (&h50FF) zum Verlassen der Eingabe gedrückt wurde. Die Scan-Codes sind angewandt und nachvollziehbar.
Bis auf weiteres werde ich mich daran setzen, die Eingabe-GOSUB von QB durch eine "echte" SUB in FB so zu ersetzen, dass die Eingabe-Steuerung einwandfrei funktioniert. Das bedeutet, dass ich vorläufig auf der "DOS"-Ebene bleibe. Wohlgemerkt - ich nutze FreeBasic in der aktuellen Version, das Programm-Paket hat jedoch Konsol-Eigenschaften. Ich brauche diesen Zwischenschritt aus zweierlei Gründen. Zum einen komme ich dadurch besser in die Materie FreeBasic. Zum zweiten habe dann relativ unkompliziert lauffähige 32Bit-Programme. Danach kann ich mich an die Umsetzung in "echte" Windows-Anwendung(en) wagen.
Hat jemand eine (weitere) brauchbare und verständliche Eingabe-Routine für mein Anliegen? Wie eine typische Eingabe-Seite aussieht, könnt ihr hier sehen: <https://www.hightail.com/download/OGhkeFVTZ2dBNkVsYzlVag> . Jeweils der "Platz" zwischen den "<" und ">" begrenzen die Eingabe. Im "Hauptprogramm" gibt es eine Seite, die hat 5 Spalten, wovon 3 geändert werden können. Je Spalte kann rauf und runter gefahren werden, mit PageUp bzw. PageDown wird die vorherige / nachfolgende Seite angezeigt und der Cursor an vordefinierte Stellen gesetzt. Von Spalte zu Spalte wird mit TAB / SHIFT TAB gesprungen oder mit ENTER nach rechts, nicht aber nach links.
Vielen Dank für eure Unterstützung.
PS: Eure Vorschläge und Kommentare vom 16.09. haben mir gut geholfen. Aber bitte - nicht mehr gegenseitig anblaffen. Ist die Sache nicht wert. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 30.09.2013, 18:28 Titel: |
|
|
Zitat: | Cursor Up, down, links, rechts, Page up, down, ESC usw. können leicht abgefangen und umgesetzt werden. Diese Routine ist aber leider nicht FB-kompatibel. |
QBasic verwendet z. B. für Cursor up die Tastenspeicherung CHR(0) + CHR(72). Bei FreeBASIC ist es CHR(255) + CHR(72); der Unterschied besteht also (bei all diesen Sondertasten) darin, dass der erste Teil ein CHR(255) statt CHR(0) ist. Vielleicht hilft dir das weiter.
Zitat: | Mit "Variable1 AND Const" kann ich nicht wirklich was anfangen. |
Mit Bitverschiebung hat es nichts zu tun; es ist eher ein Bitfeld, von dem du einzelne Wert prüfst. Variable1 enthält (vermutlich) eine Reihe von Flags, die an- oder ausgeschaltet sein können; Const enthält das zu prüfende Bit. "Variable1 AND 4" z. B. würde einen Wahrheitswert (nämlich 4) zurückgeben, wenn das Bit Nr. 2 gesetzt ist (2^2 = 4; dabei fange ich jetzt natürlich bei Bit Nr. 0 zu zählen an). Eine andere Möglichkeit der Bitabfrage wäre das Schlüsselwort BIT.
Zitat: | Hat jemand eine (weitere) brauchbare und verständliche Eingabe-Routine für mein Anliegen? |
http://www.freebasic-portal.de/code-beispiele/maus-tastatur/inputusing-erweiterte-eingabemaske-257.html
Verständlich ... hmm ... also ich verstehe sie. Du kannst dich bei Fragen natürlich gern an mich wenden.
und prompt ist mir ein Rechtschreibfehler in einem Kommentar aufgefallen ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 110
|
Verfasst am: 30.09.2013, 22:53 Titel: |
|
|
Wenn es an dem CHR(255) statt CHR(0) liegt, versuch' mal folgendes:
Code: | ...
E2:
X = INKEY$
IF X = "" THEN ON UP GOTO E5: GOTO E2
D = ASC(X)
IF D < 255 THEN '<-------------------
GOTO E3
ELSE
D = ASC(MID$(X, 2))
...
... |
Hättest du meinen Tipp befolgt … |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
|
Nach oben |
|
 |
Neuling
Anmeldungsdatum: 19.08.2013 Beiträge: 12 Wohnort: Baienfurt (DE)
|
Verfasst am: 01.10.2013, 13:06 Titel: Einstieg finden |
|
|
@nemored:
Sorry, wusste nicht (mehr), dass das deine Eingabe-Routine ist, die ich mir angeschaut habe und auch gerne nutzen würde. Dafür muss ich sie allerdings ganz verstehen. Wenn Zeile 1 "function inputusing (y as .... " ist, sind die Zeilen 159 + 160 diejenigen, die ich zitiert habe. Und den Begriff "Bitverschiebung" habe ich verwechselt mit "Bitvergleich". Bitte um Nachsicht.
Zeile 159 : if leftright and 1 andalso cursor > length then retvar = chr(0) : exit do
Zeile 160 : if leftright and 2 andalso cursor < 1 then retvar = chr(0) : exit do
Zeile 94 : case 62 : leftright or= 1 ' Verlassen bei rechter Ueberschreitung
Zeile 95 : case 60 : leftright or= 2 ' Verlassen bei linker Ueberschreitung
Du lieferst ja eine Erklärung und auch einen entsprechenden Befehl. Aber wieso ist es nötig, diese Verknüpfungen vorzunehmen? Ist es eine Notwendigkeit oder eher Kosmetik, damit der Code "eleganter" i. S. von einfacher ist. Wie müsste die Zeile 159 aussehen, wenn in Zeile 94 die OR-Verknüpfung nicht gemacht würde?
Dass "meine" Eingabe-Routine nicht funktionieren kann, hast du ja erklärt. Wenn ich da die Korrekturen von CHR(0) auf CHR(255) vornehmen würde, wäre sie dennoch wertlos. Mir fehlen die Umsetzungstabellen, die mir sagen, welcher Wert dann z.B. sagt, dass in der aktuellen Eingabe Csr up, Csr down, Enter oder Page down dann wie zu behandeln ist. Ohne diese Tabelle ist eine Nutzung unmöglich, auch wenn der Code in allen Belangen FB-kompatibel ist. Verantwortlich für die Cursorsteuerung sind die Variablen i, c, c0, f und f0, wenn mich nicht alles täuscht. Ehrlich gesagt möchte ich mich da jetzt nicht mehr so tief einarbeiten; man könnte vllt. herausbekommen, wie das zusammenhängt. Aber eine "modernere" Lösung wäre mir lieber.
@HorstD:
Weiter oben habe ich erklärt, warum hier der Dialekt (QB, FBLITe, FB, DEPRECATED) keine Rolle spielt. Da ist auch PB keine Lösung.
@RockTHeSchock:
Das wird eine Herausforderung, die ich annehme und versuche zu beherzigen. Wird im ersten Schritt nicht einfach, aber ich werde daran arbeiten. Die Konstanten werde ich als erstes umsetzen, weil das Klarheit schafft.
@alle:
Kann ich mit MULTIKEY die Bitvergleiche umgehen?
Vielen Dank für eure Hilfe. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 01.10.2013, 14:52 Titel: |
|
|
Zum Thema Tastatur ein kleiner Testcode:
Code: | ScreenRes 400, 300
Dim t As String, i As Integer, h As Integer
Do
t=InKey$
If t="" Then
Sleep
Else
Print "!""";
For i=1 To Len(t)
h = Asc(Mid(t, i, 1))
If h<32 Or h>126 Then
Print Using "_\###"; h;
Else
Print Chr(h);
EndIf
Next i
Print """"
EndIf
Loop Until t = "x" |
=> am besten möglichst viele Tasten und Kombinationen damit testen, dann weisst Du, welchen Wert bei InKey welche Taste hat. Gleichzeitig auch nicht ganz unwichtig: FB erlaubt das direkte Schreiben von Stringliteralen mit beliebigen Zeichen. So lässt sich anstelle von
Code: | "Dies ist ein " + Chr(34) + "Test" + Chr(34) + " Saarbr" + Chr(129) + "cken" |
direkt ein
Code: | !"Dies ist ein \"Test\" Saarbr\129cken" |
verwenden (hat FB aus der C/C++/Java-Welt übernommen). Vorteil: Zur Compilerzeit wird alles geparst, im fertigen Programm befindet sich dann nur noch der fertige String im Speicher. Aus diesem Grund ist auch so etwas dann möglich:
Code: | Do
t = InKey
Select Case t
Case ""
' keine Taste gedrückt => Prozess schlafen legen
Sleep
Case !"\255H"
' Verarbeitung Pfeil hoch
Case !"\255K"
' Verarbeitung Pfeil links
Case !"\255M"
' Verarbeitung Pfeil rechts
Case !"\255P"
' Verarbeitung Pfeil nach unten
Case !"\013"
' Verarbeitung Eingabetaste
End Select
Loop Until t = !"\027" ' =Ende bei Esc-Taste |
_________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 01.10.2013, 17:08 Titel: |
|
|
Zitat: | Zeile 159 : if leftright and 1 andalso cursor > length then retvar = chr(0) : exit do
Zeile 160 : if leftright and 2 andalso cursor < 1 then retvar = chr(0) : exit do
Zeile 94 : case 62 : leftright or= 1 ' Verlassen bei rechter Ueberschreitung
Zeile 95 : case 60 : leftright or= 2 ' Verlassen bei linker Ueberschreitung
Du lieferst ja eine Erklärung und auch einen entsprechenden Befehl. Aber wieso ist es nötig, diese Verknüpfungen vorzunehmen? Ist es eine Notwendigkeit oder eher Kosmetik, damit der Code "eleganter" i. S. von einfacher ist. Wie müsste die Zeile 159 aussehen, wenn in Zeile 94 die OR-Verknüpfung nicht gemacht würde? |
Ich speichere in einer (einzigen) Variablen sowohl die linke als auch die rechte Überschreitung. Im vorliegenden Fall könnte man leicht darauf verzichten, indem man Linksüberschreitung und Rechtsüberschreitung ganz einfach in zwei verschiedenen Variablen speichert und abfrägt.
Code: | case 62 : links= -1
case 60 : rechts= -1
' ...
if links andalso cursor < 1 then ' ...
|
Es kostet halt dann den Speicherplatz einer weiteren Variablen. Das mag hier keine große Rolle spielen; wenn ich dagegen 32 einzelne Bit-Werte speichern wollte, würde ich das in einer einzelnen Variablen schaffen statt 32 Variablen anlegen zu müssen. Denke in diesem Zusammenhang auch an die Übergabe der Bitwerte an eine Funktion o. ä. - wenn sie alle in einer einzelnen Variablen übergeben werden können, ist das wesentlich besser. (Gut, kann man auch über Bitfelder machen - siehe TYPE.)
Wo mehrere Statuswerte gleichzeitig möglich sind, wird es schon wieder interessanter. Bei der Mausabfrage GETMOUSE z. B. wird als Buttonwert zurückgeliefert:
1 für links (Bit 0)
2 für rechts (Bit 1)
3 für links+rechts
4 für Mitte (Bit 2)
5 für Mitte+links
6 für Mitte+rechts
7 für Mitte+links+rechts
8 für 1. Zusatztaste (Bit 3)
9 für 1. Zusatztaste+links
usw.
Ich hoffe, es ist deutlich, dass es hier unsinnig wäre, jede Kombination "links+irgendwas" einzeln abzufragen. Deswegen wird, wenn nur der Status der linken Maustaste geprüft werden soll und der Zustand der anderen egal ist, mit (Button OR 1) = 1 getestet, ob der linke Button gedrückt ist, egal was die anderen Buttons gerade machen.
Nochmal zusammenfassend: In meinem Code könnte man auf diese Technik aufgrund der geringen Ausbeute getrost verzichten. Im Allgemeinen gibt es aber Fälle, wo es eine notwendige Vorgehensweise ist, will man nicht "in Variablen ersticken".
edit: In meinem Fall hat der Bitvergleich mit MULTIKEY nichts zu tun. MULTIKEY frägtdie Tastatur ab (ähnlich wie INKEY, aber mit wichtigen Unterschieden); mein leftright wird für die Auswertung des Kontrollstrings verwendet, taucht also an ganz anderer Stelle auf. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 01.10.2013, 17:34, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 01.10.2013, 17:16 Titel: |
|
|
Zitat: | Ich speichere in einer (einzigen) Variablen sowohl die linke als auch die rechte Überschreitung. Im vorliegenden Fall könnte man leicht darauf verzichten, indem Linksüberschreitung und Rechtsüberschreitung ganz einfach in zwei verschiedenen Variablen speichere und abfrage.
|
Dafür gibt es in Freebasic extra Bitfelder
http://www.freebasic-portal.de/befehlsreferenz/bitfelder-436.html
Code: |
TYPE LinksRechtsType
Links : 1 AS INTEGER
Rechts : 1 AS INTEGER
END TYPE
DIM Flag AS LinksRechtsType
' Status setzen:
Flag.Links = 1 ' aktiv
Flag.Rechts = 0 ' nicht aktiv
|
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 01.10.2013, 18:00 Titel: |
|
|
Ja, auf die habe ich ja verwiesen. (kann aber sein, dass du schon geschrieben hast, als cih noch am posten war, mein Thread ist mit der Zeit gewachsen ...) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 957 Wohnort: Austria
|
Verfasst am: 02.10.2013, 00:33 Titel: |
|
|
Wenn ich mir den Eingabe-Code so anschaue, frage ich mich wirklich, ob es nicht sinnvoller wäre das ganze Programm neu zu schreiben. So ein schlechter Programmierstil mit nichtssagenden Variablennamen, sehr vielen und ebenso nichtssagenden Sprungmarken (E1, E2, ... ; GOTO) sowie Konstanten als Werte direkt im Code (anstatt Konstanten mit Bezeichner zu definieren) wird dir eine Konvertierung in FreeBasic (aber wohl auch in PowerBasic oder andere halbwegs moderne Basic Dialekte) zur Qual machen. Es ist dadurch sehr schwierig die Funktionsweise schnell zu erfassen und den Code entsprechend anzupassen. Außerdem sind viele Konstrukte schlicht hoffnungslos veraltet und sollten komplett durch zeitgemäßen Code ersetzt werden.
Wenn der Rest des Programmes auch in diesem Stil programmiert ist würde ich definitiv vorschlagen, das Programm neu zu schreiben, wenn es irgendwie machbar ist. Wenn du dich z.B. für "Visual Basic.NET" entscheidest, bekommst du eine moderne, ausgereifte, funktionsreiche, kostenlose Programmiersprache und -umgebung, die zumindest hinsichtlich Syntax teilweise sehr ähnlich zu QBasic und FreeBasic ist. Technisch sind die Unterschiede jedoch sehr groß.
Dies würde dir erlauben grafische (Windows)Oberflächen mit dem enthaltenen Designer komfortabel zusammenzuklicken. Durch die Verwendung der vorhandenen Steuerelemente (Buttons, Eingabefelder, ...) entfallen auch manuelle Eingabebehandlungen zu großen Teilen. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
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.
|
|