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:

Verbessrungs vorschläge an eigener Input Funktion

 
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
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 19.02.2012, 19:57    Titel: Verbessrungs vorschläge an eigener Input Funktion Antworten mit Zitat

Hallo Leute ich hab versucht eine eigene eingabe Funktion zu schreiben , was auch soweit geklappt hat nun Wollte ich 1). ein paar Verbesserungs vorschläge bekommen was ihr besser machen würdet und dann hätte ich noch eine frage.

Hier erstmal die Funktion

Code:

Function xInput (ByVal txt As String, ByVal x as integer, byval y as integer)
Dim taste As String
Locate x,y
Print txt
Do
taste = InKey
Locate x,y+Len(txt),1
Select Case  taste
   CASE Chr(29) TO Chr(255)
   y = y + 1
   If y>=79 Then x = x + 1: y = 1
   Case Chr(8)
      If Len(taste)>0 Then
       taste = Left(taste, Len(taste) - 1)
       taste = taste + " "
       y = y - 1
      If y < 1 And x >1 Then x = x - 1: y = 80
      If y < 1 Then y = 1
      EndIf
   Case Chr(13)
      x = x + 1
      y = 1
   Case Chr(255,59)
    Exit Do
End Select
Print taste;
Loop
End Function



wie man sieht ist es noch recht rudimentär und alles andere als sauber programmiert nichts desto trotz wäre es nett wenn ihr euch mal durcharbeiten würdet.

Nun zu meiner Frage die ich habe, bei dem Aufruf der selbst gebastelten input Funktion soll es ja auch möglich seine eine variable anzugeben die mann dann weiter verarbeiten kann wie beim orginal Input ..nur sehe ich den Wald vor lauter Bäumen nicht und bekomme das nicht hin.

Also schaut mal drüber sagt was ihr denkt und danke im vorraus zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



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

BeitragVerfasst am: 19.02.2012, 20:32    Titel: Antworten mit Zitat

suchst du so etwas??
(nicht das beste seiner art)
Wobei im Forum mit Sicherheit unter den Helferlein auch etwas zu finden ist

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 (optional)


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: nein wirklich nicht die Sahne... grinsen Ich muß mal in meine GUI schauen
kann sein das diese hier mit Linux probleme hat
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



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

BeitragVerfasst am: 19.02.2012, 20:41    Titel: Antworten mit Zitat

Code:
Do
taste = InKey
' ...
Loop

halte ich nicht für sehr zweckdienlich, insbesondere wenn du bei jedem Schleifendurchlauf einen LOCATE-Aufruf vornimmst. INKEY wartet ja nicht auf eine Eingabe. Ich würde eher GETKEY empfehlen, welches dann bis zum Tastendruck pausiert. Der Rückgabewert ist allerdings kein String, sondern der Ascii-Code der gedrückten Taste.

Wenn das ein FreeBASIC-Code ist, dann braucht die Funktion eine Definition der Rückgabe:
Code:
Function xInput (ByVal txt As String, ByVal x as integer, byval y as integer) AS STRING

Dann kannst du zu Beginn der Funktion eine Variable rueckgabe AS STRING definieren, die zunächst mit dem Wert von txt belegt wird und die bei Tastendruck modifiziert wird. Im Augenblick versuchst du der Variablen taste eine Doppelbedeutung aufzudrücken: einmal zum Tasten-Abfragen und einmal zum Speichern des gesamten Eingabetextes.
Code:
   CASE 29 TO 255  ' wenn du meinen GETKEY-Vorschlag einsetzt
      y = y + 1
      If y>=79 Then x = x + 1: y = 1
      rueckgabe &= CHR(taste)
   Case 8
      If Len(rueckgabe)>0 Then
      rueckgabe = Left(rueckgabe, Len(rueckgabe) - 1)
      ` ...

so in der Art; das muss natürlich noch entsprechend angepasst werden.

@Muttonhead, apropos GUI: wie weit ist denn mein Feature-Request umgesetzt? grinsen
_________________
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
Muttonhead



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

BeitragVerfasst am: 19.02.2012, 20:47    Titel: Antworten mit Zitat

Zitat:
@Muttonhead, apropos GUI: wie weit ist denn mein Feature-Request umgesetzt?


*hust* verdammt ich hab hier grad so ein Kratzen im Hals..... verlegen
peinlich
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


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

BeitragVerfasst am: 19.02.2012, 21:06    Titel: Antworten mit Zitat

Schon ein etwas älterer Artikel, aber vom Grundprinzip her alles auch in FreeBasic umsetzbar:

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

Sonst meine Ratschläge: Ausser der Enter/Return-Taste auch an folgende Sachen denken:
- Längebegrenzung
- Defaultwert + Cursor vorpositionieren
- Feld auch mittes Pfeiltasten hoch/runter sowie <Tab> / <Shift>+<Tab> verlassen
- Dito auch für <Esc> oder Funktionstaste (z.B. <F1>-Hilfefunktion) FreeBasic extra (=damals in QB nicht realisierbar): Hilfeanzeigeprozedur als Pointer mitgeben, wobei dieser Wert = NULL = keine Onlinehilfe
- FreeBasic Extra gegenüber meinem QB-Vorschlag: Mausunterstützung so, dass man den Cursor per Mausklick positionieren kann, dabei an die beiden Fälle innerhalb vom aktiven Feld (=man kann in der Prozedur bleiben) + Cursor ganz anderswo platzieren (=muss analog Pfeil hoch/runter usw. geeigneter Return-Value liefern) denken.
- Ebenfalls FreeBasic+: So implementieren, dass der Prozess während des Wartens auf eine Taste/Mausklick keine CPU konsumiert.

=> Ziel: Soll sich schlussendlich auch für Bildschirmmasken eignen!
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 19.02.2012, 21:06    Titel: Antworten mit Zitat

danke schonmal für die antworten aber das mit getkey versteh ich jetzt noch nich wirklich ... mit dem Kopf durch die Mauer wollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



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

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

@dreal:
http://forum.qbasic.at/viewtopic.php?t=6922&start=0&postdays=0&postorder=asc&highlight=

hab ein dejawüü grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



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

BeitragVerfasst am: 19.02.2012, 21:22    Titel: Antworten mit Zitat

hitori04 hat Folgendes geschrieben:
danke schonmal für die antworten aber das mit getkey versteh ich jetzt noch nich wirklich ... mit dem Kopf durch die Mauer wollen

Code:
DIM AS INTEGER taste
taste = GETKEY
SELECT CASE taste
  '...
END SELECT

Alles wie gehabt, nur dass du den Prozessor schonst. 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
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 19.02.2012, 21:27    Titel: Antworten mit Zitat

dass ich damit den Prozessor schone ist mir auch gerade aufgefallen grinsen

allerdings wenn ich nun deinen getkey vorschlag einsetzen möchte spinnt meine funktion völlig rum verwundert

Code:

Function xInput (ByVal txt As String, ByVal x as integer, byval y as integer)
Dim taste As Integer
Dim ausgabe As String
Locate x,y
Print txt
Do
taste = GetKey
Locate x,y+Len(txt),1
Select Case  taste
   CASE 29 TO 255
   y = y + 1
   If y>=79 Then x = x + 1: y = 1
   Case 8
      If Len(ausgabe)>0 Then
       ausgabe = Left(ausgabe, Len(ausgabe) - 1)
       ausgabe = ausgabe + " "
       y = y - 1
      If y < 1 And x >1 Then x = x - 1: y
      If y < 1 Then y = 1
      EndIf
   Case 13
      x = x + 1
      y = 1
   Case 27
    Exit Do
End Select
ausgabe = ausgabe + Chr(taste)
Print ausgabe;
Loop
End Function
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 19.02.2012, 21:35    Titel: Antworten mit Zitat

Wie kompilierst du das denn eigentlich, dass du am Ende der ersten Zeile kein AS STRING und am Ende keinen Rückgabewert angeben musst? Wir sind schon bei FreeBASIC und nicht bei QBASIC, oder? Oder hast du irgendeine Uralt-Compilerversion?
_________________
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
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 19.02.2012, 21:38    Titel: Antworten mit Zitat

deprecated console, fb version ist die 0.24 .. ist aber ne frühe version durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 19.02.2012, 21:50    Titel: Antworten mit Zitat

Na dann ... grinsen
Für das was du im Augenblick machst, wäre das aber eher eine SUB statt einer FUNCTION.

Code:
If y < 1 And x >1 Then x = x - 1: y

Hmm? happy

Code:
PRINT ausgabe

kann so nicht funktionieren, da du immer den gesamten Ausgabetext an die aktuelle Position schreibst. Entweder du schreibst ihn an die Anfangsposition oder du schreibst an die aktuelle Position nur das aktuelle Zeichen,
_________________
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
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