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:

Eingabe-Routine benötigt

 
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
Stefan1



Anmeldungsdatum: 26.12.2007
Beiträge: 5
Wohnort: 20 km westlich Frankfurt/Main

BeitragVerfasst am: 28.12.2009, 01:23    Titel: Eingabe-Routine benötigt Antworten mit Zitat

Nachdem ich mich jahrelang mit Omikron-Basic unter der Atari-Oberfläche
von Magic_PC rungeärgert habe, habe ich mich nach einem anderen Basic
umgesehen und bin jetzt bei Freebasic gelandet. Gerne würde ich -lang qb
nutzen, da Quick-Basic am ähnlichsten ist, aber wie stellt man das ein?
Ich arbeite mit fbedit 1.0.7.3b und freebasic 0.20.0b-win32
Ich benötige eine Eingabe-Routine, um in einer Adressenkartei z.B. Namen
eingeben zu können. Gibt es diese hier?
Gruß Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 28.12.2009, 01:33    Titel: Antworten mit Zitat

-lang qb muss entweder dem compiler als kommandozeilenparameter übergeben werden, oder (das stellt sicher, dass es überall garantiert richtig kompilliert wird) per metabefehl: #lang

Eine einfache Eingaberoutine wäre input
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 28.12.2009, 01:40    Titel: Antworten mit Zitat

Zu FBEdit kann ich leider nichts sagen; du kannst mal unter freebasic-portal.de in den Tutorials suchen, vielleicht gibt es da was. Allerdings würde ich eher empfehlen, bei der Standardeinstellung -lang fb zu bleiben; wenn du ein Programm neu schreiben musst, sind die zusätzlichen Umstellungen zwischen QuickBASIC und FreeBASIC nicht sehr groß (und von Omikron BASIC aus wirst du definitiv neu schreiben müssen).

Die Frage nach der Eingabe-Routine müsstest du etwas präzisieren: Was genau hast du gegeben, was willst du haben?

edit: jepp, stimmt, #lang wäre gut.
_________________
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
Stefan1



Anmeldungsdatum: 26.12.2007
Beiträge: 5
Wohnort: 20 km westlich Frankfurt/Main

BeitragVerfasst am: 28.12.2009, 15:49    Titel: Antworten mit Zitat

Ich habe Anfang der 1990er Jahre die folgende komfortable Eingabe-Routine von einer Qbasic-Seite runtergeladen und hoffte, dass es das auch für Freebasic gibt. Oder kann sie einer umschreiben?
Gruß Stefan

DEFINT A-Z
FUNCTION eingab$ (ze, sp, lg, alt$)
LOCATE , , 1
ex = 0: spt = sp: spe = sp + lg: ins = 1: l = 1: f$ = "_": f1$ = "__"
IF spe > 80 THEN lg = 80 - sp: spe = sp + lg
LOCATE ze, sp: PRINT STRING$(lg, f$);
LOCATE ze, sp: PRINT alt$;
LOCATE ze, sp, 1
DO
IF ex = 1 THEN EXIT DO
a$ = ""
DO WHILE a$ = ""
a$ = INKEY$
LOOP
a = ASC(LEFT$(a$, 1))
IF a = 13 THEN EXIT DO
IF a = 0 THEN
b = ASC(RIGHT$(a$, 1))
GOSUB spezial
ELSEIF a = 7 OR a = 8 THEN
GOSUB spezial
ELSEIF a >= &H20 OR a = &H15 THEN
GOSUB normal
END IF
LOOP

i = sp + lg - 1
s$ = ""
z1 = ASC(f$)
DO WHILE i >= sp
z = SCREEN(ze, i)
s$ = CHR$(z) + s$
i = i - 1
LOOP
J1 = INSTR(s$, f$)
J2 = INSTR(s$, f1$)
IF J1 = 1 THEN s$ = "": GOTO a1
IF J1 = lg THEN s$ = LEFT$(s$, lg - 1): GOTO a0
IF J1 = 8 THEN s$ = LEFT$(s$, 7): GOTO a0
IF J2 > 0 THEN s$ = LEFT$(s$, J2 - 1)
IF J1 < lg THEN GOTO a01
GOTO a0
a01:
s1$ = MID$(s$, J1 + 1, LEN(s$))
j3 = INSTR(s1$, f$)
IF j3 + J1 = lg THEN s$ = LEFT$(s$, lg - 1)
a0:
eingab$ = s$
a1:
J1 = 0: J2 = 0
EXIT FUNCTION

normal:
'Eingabe "lesbarer" Zeichen
'Insert-Modus aus
IF ins = 0 THEN
LOCATE ze, spt, 1
spt = spt + 1: l = l + 1
IF spt > spe THEN ex = 1: RETURN
PRINT a$;

'Insert-Modus ein
ELSEIF ins = 1 THEN
i = sp + lg - 2
DO WHILE i >= spt
z = SCREEN(ze, i)
LOCATE ze, i + 1
PRINT CHR$(z);
i = i - 1
LOOP
LOCATE ze, spt
spt = spt + 1
l = l + 1
IF spt > spe THEN ex = 1: RETURN
PRINT a$;
LOCATE ze, spt
END IF
RETURN

spezial:
'Verarbeitung "nichtlesbarer" Zeichen
'Zeichen unter Cursor l”schen (Entf-Taste)
IF a = 7 OR b = 83 THEN
flag = 0
i = spt + 1
DO UNTIL i = (sp + lg)
IF i > sp + lg - 1 THEN flag = 1: EXIT DO
z = SCREEN(ze, i)
LOCATE ze, i - 1
PRINT CHR$(z);
i = i + 1
LOOP
IF flag = 0 THEN LOCATE ze, sp + lg - 1: PRINT f$;
LOCATE ze, spt

'Zeichen links vom Cursor löschen (Back-Taste)
ELSEIF a = 8 AND i > 1 THEN
IF spt > sp THEN
spt = spt - 1
l = l - 1
i = spt + 1
END IF
DO UNTIL i = (sp + lg)
IF i > sp + lg - 1 THEN flag = 1: EXIT DO
z = SCREEN(ze, i)
LOCATE ze, i - 1
PRINT CHR$(z);
i = i + 1
LOOP
LOCATE ze, sp + lg - 1: PRINT f$;
LOCATE ze, spt

'Cursor nach links
ELSEIF b = 75 AND l > 1 THEN
l = l - 1
spt = spt - 1
LOCATE ze, spt
:
' Cursor nach rechts
ELSEIF b = 77 AND l < lg THEN
l = l + 1
spt = spt + 1
LOCATE ze, spt

'Insertmodus ein/aus
ELSEIF b = 82 THEN
ins = ins XOR 1
END IF
RETURN
END FUNCTION
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 28.12.2009, 16:51    Titel: Antworten mit Zitat

Da vermisst wohl jemand INPUT USING? happy

Das Hauptproblem in diesem Code sind die unnötigen GOTOs und GOSUBs; ich hoffe, ich habe sie alle korrekt umschifft. Desweitern gibt es in FreeBASIC keine Suffixe mehr, weshalb mein unten stehender Code unter FreeBASIC, aber nicht mehr unter QBASIC läuft. Bitte ausführlich testen; ich habe nur einen grundsätzlichen Funktionscheck durchgeführt.

Code:
function eingab(ze as integer, sp as integer, lg as integer, alt as string) as string
  locate , , 1
  dim as integer ex = 0, spt = sp, spe = sp + lg, ins = 1, l = 1
  dim as integer a, b, i, z1, j1, j2, j3, flag, z
  dim as string taste, f = "_", f1 = "__", s, s1
  if spe > 80 then lg = 80 - sp: spe = sp + lg
  locate ze, sp: print string(lg, f);
  locate ze, sp: print alt;
  locate ze, sp, 1
  do
    if ex = 1 then exit do
    dim as string taste = ""
    do while taste = ""
      taste = inkey
      sleep 1
    loop
    a = asc(left(taste, 1))
    if a = 13 then exit do
    if a = 255 then
      b = asc(right(taste, 1))
    end if
    if a = 255 or a = 7 or a = 8 then
      'Verarbeitung "nichtlesbarer" Zeichen
      'Zeichen unter Cursor löschen (Entf-Taste)
      if a = 7 or b = 83 then
        flag = 0
        i = spt + 1
        do until i = (sp + lg)
          if i > sp + lg - 1 then flag = 1: exit do
          z = screen(ze, i)
          locate ze, i - 1
          print chr(z);
          i = i + 1
        loop
        if flag = 0 then locate ze, sp + lg - 1: print f;
        locate ze, spt
      'Zeichen links vom Cursor löschen (Back-Taste)
      elseif a = 8 and i > 1 then
        if spt > sp then
          spt = spt - 1
          l = l - 1
          i = spt + 1
        end if
        do until i = (sp + lg)
          if i > sp + lg - 1 then flag = 1: exit do
          z = screen(ze, i)
          locate ze, i - 1
          print chr(z);
          i = i + 1
        loop
        locate ze, sp + lg - 1: print f;
        locate ze, spt
      'Cursor nach links
      elseif b = 75 and l > 1 then
        l = l - 1
        spt = spt - 1
        locate ze, spt
      ' Cursor nach rechts
      elseif b = 77 and l < lg then
        l = l + 1
        spt = spt + 1
        locate ze, spt
      'Insertmodus ein/aus
      elseif b = 82 then
        ins = ins xor 1
      end if
    elseif a >= &H20 OR a = &H15 THEN
      'Eingabe "lesbarer" Zeichen
      'Insert-Modus aus
      if ins = 0 then
        locate ze, spt, 1
        spt = spt + 1: l = l + 1
        if spt > spe then
          ex = 1
        else
          print taste;
        end if
      'Insert-Modus ein
      elseif ins = 1 then
        i = sp + lg - 2
        do while i >= spt
          z = screen(ze, i)
          locate ze, i + 1
          print chr(z);
          i = i - 1
        loop
        locate ze, spt
        spt = spt + 1
        l = l + 1
        if spt > spe then
          ex = 1
        else
          print taste;
          locate ze, spt
        end if
      end if
    end if
  loop

  i = sp + lg - 1
  s = ""
  z1 = asc(f)
  do while i >= sp
    z = screen(ze, i)
    s = chr(z) + s
    i = i - 1
  loop
  j1 = instr(s, f)
  j2 = instr(s, f1)
  if j1 = 1 then
    s = ""
  else
    if j1 = lg then
      s = left(s, lg - 1)
    elseif j1 = 8 then
      s = left(s, 7)
    else
      if j2 > 0 then s = left(s, j2 - 1)
      if j1 < lg then
        s1 = mid(s, j1 + 1, len(s))
        j3 = instr(s1, f)
        if j3 + j1 = lg THEN s = LEFT(s, lg - 1)
      end if
    end if
    eingab = s
  end if
  j1 = 0
  j2 = 0
end function

print eingab(7,10,5, "Test")



edit: der Code ist ein Musterbeispiel für schwer durchschaubare Variablenkürzel ... ich habe fast alle Variablennamen einfach übernommen (bis auf "taste"). Ich habe auch keine Optimierungsversuche unternommen.
_________________
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
Stefan1



Anmeldungsdatum: 26.12.2007
Beiträge: 5
Wohnort: 20 km westlich Frankfurt/Main

BeitragVerfasst am: 28.12.2009, 18:25    Titel: Antworten mit Zitat

Ich habe Anfang der 1990er Jahre die folgende komfortable Eingabe-Routine von einer Qbasic-Seite runtergeladen und hoffte, dass es das auch für Freebasic gibt. Oder kann sie einer umschreiben?
Gruß Stefan

DEFINT A-Z
FUNCTION eingab$ (ze, sp, lg, alt$)
LOCATE , , 1
ex = 0: spt = sp: spe = sp + lg: ins = 1: l = 1: f$ = "_": f1$ = "__"
IF spe > 80 THEN lg = 80 - sp: spe = sp + lg
LOCATE ze, sp: PRINT STRING$(lg, f$);
LOCATE ze, sp: PRINT alt$;
LOCATE ze, sp, 1
DO
IF ex = 1 THEN EXIT DO
a$ = ""
DO WHILE a$ = ""
a$ = INKEY$
LOOP
a = ASC(LEFT$(a$, 1))
IF a = 13 THEN EXIT DO
IF a = 0 THEN
b = ASC(RIGHT$(a$, 1))
GOSUB spezial
ELSEIF a = 7 OR a = 8 THEN
GOSUB spezial
ELSEIF a >= &H20 OR a = &H15 THEN
GOSUB normal
END IF
LOOP

i = sp + lg - 1
s$ = ""
z1 = ASC(f$)
DO WHILE i >= sp
z = SCREEN(ze, i)
s$ = CHR$(z) + s$
i = i - 1
LOOP
J1 = INSTR(s$, f$)
J2 = INSTR(s$, f1$)
IF J1 = 1 THEN s$ = "": GOTO a1
IF J1 = lg THEN s$ = LEFT$(s$, lg - 1): GOTO a0
IF J1 = 8 THEN s$ = LEFT$(s$, 7): GOTO a0
IF J2 > 0 THEN s$ = LEFT$(s$, J2 - 1)
IF J1 < lg THEN GOTO a01
GOTO a0
a01:
s1$ = MID$(s$, J1 + 1, LEN(s$))
j3 = INSTR(s1$, f$)
IF j3 + J1 = lg THEN s$ = LEFT$(s$, lg - 1)
a0:
eingab$ = s$
a1:
J1 = 0: J2 = 0
EXIT FUNCTION

normal:
'Eingabe "lesbarer" Zeichen
'Insert-Modus aus
IF ins = 0 THEN
LOCATE ze, spt, 1
spt = spt + 1: l = l + 1
IF spt > spe THEN ex = 1: RETURN
PRINT a$;

'Insert-Modus ein
ELSEIF ins = 1 THEN
i = sp + lg - 2
DO WHILE i >= spt
z = SCREEN(ze, i)
LOCATE ze, i + 1
PRINT CHR$(z);
i = i - 1
LOOP
LOCATE ze, spt
spt = spt + 1
l = l + 1
IF spt > spe THEN ex = 1: RETURN
PRINT a$;
LOCATE ze, spt
END IF
RETURN

spezial:
'Verarbeitung "nichtlesbarer" Zeichen
'Zeichen unter Cursor l”schen (Entf-Taste)
IF a = 7 OR b = 83 THEN
flag = 0
i = spt + 1
DO UNTIL i = (sp + lg)
IF i > sp + lg - 1 THEN flag = 1: EXIT DO
z = SCREEN(ze, i)
LOCATE ze, i - 1
PRINT CHR$(z);
i = i + 1
LOOP
IF flag = 0 THEN LOCATE ze, sp + lg - 1: PRINT f$;
LOCATE ze, spt

'Zeichen links vom Cursor löschen (Back-Taste)
ELSEIF a = 8 AND i > 1 THEN
IF spt > sp THEN
spt = spt - 1
l = l - 1
i = spt + 1
END IF
DO UNTIL i = (sp + lg)
IF i > sp + lg - 1 THEN flag = 1: EXIT DO
z = SCREEN(ze, i)
LOCATE ze, i - 1
PRINT CHR$(z);
i = i + 1
LOOP
LOCATE ze, sp + lg - 1: PRINT f$;
LOCATE ze, spt

'Cursor nach links
ELSEIF b = 75 AND l > 1 THEN
l = l - 1
spt = spt - 1
LOCATE ze, spt
:
' Cursor nach rechts
ELSEIF b = 77 AND l < lg THEN
l = l + 1
spt = spt + 1
LOCATE ze, spt

'Insertmodus ein/aus
ELSEIF b = 82 THEN
ins = ins XOR 1
END IF
RETURN
END FUNCTION
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 28.12.2009, 18:55    Titel: Antworten mit Zitat

Hallo,

wozu ist das Doppelposting gedacht? nemored hat den Quelltext der Eingaberoutine bereits für FreeBASIC umgeschrieben.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stefan1



Anmeldungsdatum: 26.12.2007
Beiträge: 5
Wohnort: 20 km westlich Frankfurt/Main

BeitragVerfasst am: 28.12.2009, 19:12    Titel: Antworten mit Zitat

Das doppelte Senden war mir aus Versehen passiert beim Rückwärtsgehen im Browser, kann man das löschen?

Vielen Dank an nemored, ich bin schon beim Testen. es kommen noch Fehlermeldungen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 28.12.2009, 19:19    Titel: Antworten mit Zitat

Hoppla, Fehlermeldungen hatte ich keine. Welche?
(Muss jetzt als -lang fb (Standardeinstellung) compiliert werden)
_________________
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
Stefan1



Anmeldungsdatum: 26.12.2007
Beiträge: 5
Wohnort: 20 km westlich Frankfurt/Main

BeitragVerfasst am: 28.12.2009, 19:27    Titel: Antworten mit Zitat

error 21: Type mismatch in 'FUNCTION eingabe(ze AS INTEGER, sp AS INTEGER, lg AS INTEGER, alt AS STRING) As string'

error 50: Illegal outside a CONSTRUCTOR, DESTRUCTOR, FUNCTION, OPERATOR, PROPERTY or SUB block, found '=' in 'eingabe = s'

warning 14(0): Function result was not explicitly set

Wie und wo man -lang fb eingibt, ist mir immer noch nicht klar.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 28.12.2009, 19:33    Titel: Antworten mit Zitat



Rechts oben, da wo "Windows GUI" steht muss "Windows Console" stehen, das ist so der Standardcompilierbefehl. Da kann man aber auch unabhängig vom Metabefehl "#lang" "QB Console" auswählen. Das ist ja der große Vorteil gegenüber FBIDE, weil die Option da so versteckt ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 28.12.2009, 20:18    Titel: Antworten mit Zitat

Code:
found '=' in 'eingabe = s'

ist definitiv falsch. Es sollte 'eingab = s' heißen. Kann sein, dass die anderen Fehler damit zusammen hängen.
_________________
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
dreael
Administrator


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

BeitragVerfasst am: 28.12.2009, 21:12    Titel: Antworten mit Zitat

Wieder einmal ein passender Artikel von mir zu diesem Thema:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/BildschirmMasken.html

Beispiele sollte sich für FreeBasic recht einfach portieren lassen. Lediglich noch ein passendes SLEEP-Ereignisabwarten bei der INKEY$-Schleife vorsehen, damit die Routine keine CPU unnötig konsumiert.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 28.12.2009, 22:08    Titel: Antworten mit Zitat

... jetzt wollt ich grad noch ne angepasste Konsolenversion von meinen Texteingabefeld(sGUI) zum besten geben, aber ... wie ich sehe...

Gott hat schon zugeschlagen und hat etwas aus seinem Schatzkästchen hervorgezaubert ! grinsen

Egal hier meine Variante:
Code:
declare function  EditString(row as integer,column as integer,displen as integer, txtlen as integer, txt as string="",passthrough as integer=0) as string

dim as string text="abc"
print text

text=EditString(10,40,15,40,text)

print
print text
sleep

'sollte auch in der Konsole funktionieren
'row          Position des Eingabefeldes Zeile
'column       Position des Eingabefeldes Spalte
'displen      Länge des Eingabefeldes in Zeichen
'txtlen       maximale Länge des einzugebenen Textes
'txt          übergebener Text(optional)
'passthrough  wenn 1 nur Darstellung des Eingabefeldes,kein editieren möglich (optinal)


function EditString(row as integer,column as integer,displen as integer, txtlen as integer, txt as string="",passthrough as integer=0) as string
  if len(txt)>txtlen then txt=left(txt,txtlen)

  function=txt

  dim as string key,lpart,rpart
  dim as integer i,scan,ascii,cpos,opos,bgcolor,fgcolor,cursorcolor,oldcolor,oldfgcolor,oldbgcolor

  oldcolor   = color
  oldfgcolor = LOWORD(oldcolor)
  oldbgcolor = HIWORD(oldcolor)

  bgcolor=2
  fgcolor=15
  cursorcolor=10

  cpos=len(txt)+1                                         'Cursor ans Ende setzen
  if cpos>opos+displen then opos=cpos-displen else opos=0 'wenn Text länger als Eingabefenster Scrolloffset setzen

  if passthrough=0 then 'wenn 1 soll das Eingabefeld nur dargestellt werden jedoch nicht "funktionieren"
    do
      'Anzeige des Editierfeldes
      for i=0 to displen-1
        if i+1+opos=cpos then color fgcolor,cursorcolor else color fgcolor,bgcolor
        locate(row,column+i,0)
        if i+1+opos<=len(txt) then print mid(txt,i+1+opos,1); else print " ";
      next i
 
      'Zeichen holen
      do
        ascii=-1
        scan=-1
        key=""
        sleep 1
        key=inkey
 
        if len(key)=1 then
          ascii=asc(key)
        end if
        if len(key)=2 then
          ascii=asc(left(key,1))
          scan=asc(right(key,1))
        end if
      loop until key<>""
 
 
      'Cursorbewegung
      if scan=75 and cpos > 1 then cpos -=1
      if scan=77 and cpos < len(txt)+1 then cpos +=1
 
      'Backspace
      if cpos>1 then                        'wenn Cursor nicht an erster Stelle ist Backspace erlauben
        if scan=14 or ascii=8 then
          if cpos=len(txt)+1 then           'wenn Cursor hinterm Text
            txt=left(txt,len(txt)-1)
          elseif cpos=2 then
            txt=right(txt,len(txt)-1)       'wenn Cursor an 2.Stelle (vermutlich überflüssig)
          else
            lpart=left(txt,cpos-2)          'wenn Cursor an anderer Stelle
            rpart=right(txt,len(txt)-cpos+1)
            txt=lpart & rpart
          end if
          if opos>0 then opos -=1
          cpos -=1
        end if
      end if
 
      'Delete
      if cpos<=len(txt) then                       'wenn Cursor im Text und nicht dahinter delete möglich
        if scan=83  or ascii=127 then
          if cpos=len(txt) then                    'wenn Cursor auf letzem Zeichen
            txt=left(txt,len(txt)-1)               'letztes Zeichen weg
          elseif cpos=1 then                       'wenn Cursor auf erstem Zeichen
            txt=right(txt,len(txt)-1)              'erstes Zeichen weg
          else                                     'ansonsten (wenn) Cursor mittendrin
            lpart=left(txt,cpos-1)                 'String splitten CursorZeichen weg
            rpart=right(txt,len(txt)-cpos)
            txt=lpart & rpart                      'und wieder zusammenpappen
          end if                                   'Cursorposition bleibt erhalten!!!
        end if
      end if
 
 
      'Zeichen einfügen
      if len(txt)<txtlen then                      'nur wenn String kürzer als txtlen können wir noch was machen
        if ascii>=32 and ascii<>127 and ascii<>257 and ascii<>258 and ascii<>259 and ascii<>260 and ascii<255 then
        'Ausschluss folgender Zeichen: alle ASC codes <32
        ' sowie ESC,BACKSPACE,DEL,UP,DOWN,LEFT,RIGHT sowie ASC(255)
 
          if len(txt)>0 then                      'wenn kein Leerstring
            if cpos=1 then                        'wenn Curor an erster Stelle
              txt=chr(ascii)+txt                  'Zeichen vorn einfügen
            elseif cpos=len(txt)+1 then           'wenn Cursor hinter Text
              txt=txt & chr(ascii)                'Zeichen hinten anhängen
            else                                  'ansonsten (wenn) Cursor mittendrin
              lpart=left(txt,cpos-1)              'String splitten
              rpart=right(txt,len(txt)-cpos+1)
              txt=lpart & chr(ascii)  & rpart     'alle 3 Teile zusammenpappen
            end if
            cpos +=1                              'Cusorposition erhöhen
          end if
          if len(txt)=0 then                      'wenn Leerstring dann
            txt=chr(ascii)                        'erstes Zeichen setzen
            cpos +=1                              'Cusorposition erhöhen
          end if
        end if
      end if
 
      'Scrolling/Offset-Steuerung
      'wenn Text länger wird/ist als das Editierfeld
      if cpos<opos+1 then
        opos=cpos-1
      end if
      if cpos>opos+displen then
        opos=cpos-displen
      end if
    loop until ascii=13
  end if

  'Anzeige des Editierfeldes ohne Cursor
  color fgcolor,bgcolor
  opos=0
  for i=0 to displen-1 
  locate(row,column+i,0)
    if i+1+opos<=len(txt) then print mid(txt,i+1+opos,1); else print " ";
  next i

  color oldfgcolor,oldbgcolor 'Restaurieren der originalen Farben

  function=txt
end function


ps:
...ups, noch schnell ne Wanze im Code beseitigt..
und ähhmm... um Missverständnissen vorzubeugen: ich bin hier bestenfalls der Dorftrottel, mit Gott ist natürlich mein Vorposter gemeint lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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
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