 |
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 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 19.02.2012, 19:57 Titel: Verbessrungs vorschläge an eigener Input Funktion |
|
|
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  |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 19.02.2012, 20:32 Titel: |
|
|
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... Ich muß mal in meine GUI schauen
kann sein das diese hier mit Linux probleme hat |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 19.02.2012, 20:41 Titel: |
|
|
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?  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 19.02.2012, 20:47 Titel: |
|
|
Zitat: | @Muttonhead, apropos GUI: wie weit ist denn mein Feature-Request umgesetzt? |
*hust* verdammt ich hab hier grad so ein Kratzen im Hals.....
peinlich |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 19.02.2012, 21:06 Titel: |
|
|
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 19.02.2012, 21:06 Titel: |
|
|
danke schonmal für die antworten aber das mit getkey versteh ich jetzt noch nich wirklich ...  |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 19.02.2012, 21:22 Titel: |
|
|
hitori04 hat Folgendes geschrieben: | danke schonmal für die antworten aber das mit getkey versteh ich jetzt noch nich wirklich ...  |
Code: | DIM AS INTEGER taste
taste = GETKEY
SELECT CASE taste
'...
END SELECT |
Alles wie gehabt, nur dass du den Prozessor schonst.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 19.02.2012, 21:27 Titel: |
|
|
dass ich damit den Prozessor schone ist mir auch gerade aufgefallen
allerdings wenn ich nun deinen getkey vorschlag einsetzen möchte spinnt meine funktion völlig rum
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 19.02.2012, 21:35 Titel: |
|
|
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 19.02.2012, 21:38 Titel: |
|
|
deprecated console, fb version ist die 0.24 .. ist aber ne frühe version  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 19.02.2012, 21:50 Titel: |
|
|
Na dann ...
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?
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 |
|
 |
|
|
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.
|
|