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

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.07.2007, 10:53 Titel: Bytes verschieben |
|
|
Hi,
gibt es eine moeglichkeit innerhalb eines Pointers und/oder eines ZStrings von einer bestimmten position an die Bytes ohne grossen aufwand von mid oder for/next schleifen nach nach oben/unten zu verschieben? _________________
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 24.07.2007, 13:39 Titel: |
|
|
nein, shl und shr verschieben Bits. Um Bytes zu verschieben fällt mir auch kein einfacherer Weg ein (höchstens ein schnellerer: asm) |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.07.2007, 13:46 Titel: |
|
|
Was ich machen wollte bzw gemacht hab ist ein eingabefeld mit editier moeglichkeit. Der eingegebende String ist ein ZString, da es einfach ist ein einzelnes zeichen an eine bestimmte position zu setzen.
Das verschieben des Strings nach rechts bei eingabe bzw nach links bei Del hab ich erst einmal mit einer For/Next schleife gemacht, ich hoffte allerdings auf etwas eleganteres.... _________________
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.07.2007, 14:39 Titel: |
|
|
Na klar, ich mach in der For/Next die ich gern vermieden haette einfach noch eine die absolut sinnfrei ist
davon abgesehen kann man einen ZString auch als Array sehen, da hilft mir shl shr rein gar nichts... _________________
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 24.07.2007, 16:46 Titel: |
|
|
Normale Strings lassen sich übrigens direckt in Zstiring Convertieren
Code: | dim as string Eingabe
Input "Hier was eingeben ";Eingabe
dim as zstring*1024 Ausgabe=Eingabe
print
print Ausgabe
print
sleep
|
Villeicht hilft das ja weiter?? _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.07.2007, 22:12 Titel: |
|
|
nein, wirklich nicht, zur verdeutlichung mein Anfang...
Code: |
Const InterfaceName="!Interface"
Const Interface_width = 90
Const Interface_height = 30
Width Interface_width, Interface_height
'Dim Send2Interface as Interface_message_
Dim CursPos as Integer 'Cursor Position
Dim ViewLen as Integer '
Dim EditString as String
Dim EditS as ZString*451
Dim ViewString as String
Dim CursOn as UByte=1
Dim CursOff as UByte=0
Dim CursMode as Ubyte
Dim EKey as String
Dim VS as Integer
Dim VE as Integer
Do
EditString=EditS
'--
VS=CursPos
VE=CursPos+Interface_width
If VE>Len(EditString)Then VE=Len(EditString):VS=VE-Interface_width
VS=IIf (VS<1,1,VS)
'--
ViewString=Mid(EditString,VS,VE)+Space(Interface_width-Len(Mid(EditString,VS,VE)))
'--
CursPos=IIf (CursPos< 1, 1, CursPos)
CursPos=IIf (CursPos>449,449, CursPos)
Color 0,15 'Eingabe Farbe (Schwarzer Text, weisser Hintergrund)
Locate Interface_height,1,0
Print ViewString;
If CursMode=CursOn Then Locate Interface_height,CursPos,0:?"_";
EKey=Inkey
'''******************************
''-----
'Enter
If Multikey (&h1C) Then
for l as integer=0 to 450
EditS[l]=0
CursPos=1
next l
End If
'Normale Eingabe
If asc(EKey)>31 and asc(EKey)<125 and Len(EditString)<449 Then
'CursPos=IIF(CursPos<2,2,CursPos)
for l as integer=449 to CursPos step-1
EditS[l]=EditS[l-1]
next l
EditS[450]=0
EditS[CursPos-1]=asc(EKey)
CursPos+=1
sleep(5)
End If
'Home
If Multikey(&h47) Then CursPos=1:sleep(5)
'End
If MultiKey(&h4F) Then CursPos=Len(EditString)+1:sleep(5)
'Del
If MultiKey(&h53) Then
for l as integer=CursPos to 449
EditS[l-1]=EditS[l]
next l
EditS[450]=0
sleep(5)
End If
'BackSpace
If MultiKey(&h0E) and CursPos>1 Then
for l as integer=CursPos-1 to 449
EditS[l-1]=EditS[l]
next l
EditS[450]=0
CursPos-=1
sleep(5)
End If
'Left
If MultiKey(&h4B) Then CursPos-=1:sleep(5)
'Right
If MultiKey(&h4D) Then CursPos+=1:sleep(5)
'ESC (Clear)
If Multikey(&h01) Then
for l as integer=0 to 450
EditS[l]=0
CursPos=1
next l
End If
''-----
'''******************************
sleep (33),1
CursMode=IIF(CursMode=CursOn,CursOff,CursOn)
Loop Until Multikey(&h01)
|
_________________
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 25.07.2007, 11:06 Titel: |
|
|
Mit Mid gehts doch leicht:
Code: |
dim as String Text,X
DO
X=INKEY
IF X="" THEN
ELSE
Text+=X
locate 1,1
Print Text+" "
End IF
IF X=CHR(8) THEN LOCATE 1,1:Text=MID(Text,1,Len(Text)-2) ' Wenn das Zeichen entfernt werden soll
sleep 1
LOOP UNTIL X=CHR(27)
| [/code] _________________ Bis irgendwann... 
Zuletzt bearbeitet von AndT am 25.07.2007, 11:49, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 25.07.2007, 11:49 Titel: |
|
|
... _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 25.07.2007, 11:56 Titel: |
|
|
sorry _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 25.07.2007, 11:58 Titel: |
|
|
Es erfuellt leider auch nicht ganz seinen zweck... da ich eine Maximale Stringlaenge von 450 Zeichen verwenden will und diese kaum komplett in einer Zeile sichtbar sind ect..
Inwischen habe ich auch schon wieder eine neue Function daraus gemacht, da diese eingabe routine als eigenstaendiger Thread laufen soll, was mit color/locate und Print leider nicht so hinaut wie ich es gerne gehabt haette.
Im Prinzip muss ich nur noch das Timing richtig machen...
Ausserdem beschaeftigt mich die Frage, warum ich bei ein ScreenRes Zeichen von 8*8 habe waerend ich sonst immer mit Zeichen von 8*16 habe...
Code: |
Const InterfaceName="!Interface"
Const Interface_width = 90
Const Interface_height = 60
'Width Interface_width, Interface_height
ScreenRes Interface_width*8,Interface_height*8,32
Dim ViewString As String
Dim EditString As ZString*450
Dim StrLenBuffer As String
'-------------------------'
Dim CursPos as Integer
Dim CursMode as UByte
Dim CursOn as UByte=1
Dim CursOff as UByte=0
Dim VCursPos as Integer
Dim CursS as String
'-------------------------'
Dim ViewBuffer as Any Ptr
ViewBuffer=ImageCreate(1+(Interface_width*8),8)
'-------------------------'
Dim VS as Integer
Dim VE as Integer
'-------------------------'
Dim EKey as String
''---------------------------------------''
Do
CursPos=IIF(CursPos< 1, 1, CursPos)
CursPos=IIF(CursPos> 449, 449, CursPos)
VS=CursPos-(Interface_width-1)
VS=IIF(VS< 1, 1, VS)
VE=VS+Interface_width
VE=IIF(VE> 449, 449, VE)
VCursPos=CursPos-(VS-1)
VCursPos=IIF(VCursPos<1,1,VCursPos)
ViewString=mid(EditString,VS,VE)
StrLenBuffer=EditString
Line ViewBuffer,(0,0)-(Interface_width*8,15),&hFFFF00,BF
Draw String ViewBuffer,(0,0),ViewString,0
If CursMode=CursOn Then CursS="_" Else CursS=""
Draw String ViewBuffer,((VCursPos-1)*8,0),CursS,0
Put (0,(Interface_height-1)*8),ViewBuffer,PSet
EKey=Inkey
'''******************************
''-----
'Enter
If Multikey (&h1C) Then
for l as integer=0 to 450
EditString[l]=0
CursPos=1
next l
End If
'Normale Eingabe
If asc(EKey)>31 and asc(EKey)<125 and Len(StrLenBuffer)<449 Then
'CursPos=IIF(CursPos<2,2,CursPos)
for l as integer=450 to CursPos step-1
EditString[l]=EditString[l-1]
next l
EditString[450]=0
EditString[CursPos-1]=asc(EKey)
CursPos+=1
End If
'Home
If Multikey(&h47) Then CursPos=1
'End
If MultiKey(&h4F) Then CursPos=Len(StrLenBuffer)+1
'Del
If MultiKey(&h53) Then
for l as integer=CursPos to 449
EditString[l-1]=EditString[l]
next l
EditString[450]=0
sleep(5)
End If
'BackSpace
If MultiKey(&h0E) and CursPos>1 Then
for l as integer=CursPos-1 to 449
EditString[l-1]=EditString[l]
next l
EditString[450]=0
CursPos-=1
sleep(5)
End If
'Left
If MultiKey(&h4B) Then CursPos-=1:sleep(5)
'Right
If MultiKey(&h4D) Then CursPos+=1:sleep(5)
'ESC (Clear)
If Multikey(&h01) Then
for l as integer=0 to 450
EditString[l]=0
CursPos=1
next l
End If
''-----
'''******************************
sleep (111),1
CursMode=IIF(CursMode=CursOn,CursOff,CursOn)
Loop Until Multikey(&h01)
|
_________________
 |
|
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.
|
|