Seite 1 von 1
Autoscroll
Verfasst: 29.03.2005 14:55
von Pure-r-Freak
kann man nicht irgendwie ein autoscroll in eine konsole einbauen?
ich habe immer das problem, dass wenn ich eine große liste (z.b. ordnerinhalte..) anzeige, dass man die ersten zeilen nicht mehr sehen kann. ich hab auch schon überall nach einer lösung dafür gesucht, aber leider noch nichts gefunden.
kennt von euch vielleicht jemand eine lösung???
dann bitte sofort posten
danke.....

Re: Autoscroll
Verfasst: 29.03.2005 15:31
von Kiffi
Pure-r-Freak hat geschrieben:kann man nicht irgendwie ein autoscroll in eine konsole einbauen?
hast Du das nicht schon hier gefragt?:
http://forums.purebasic.com/german/viewtopic.php?t=2599
Grüße ... Kiffi
Verfasst: 29.03.2005 18:34
von Pure-r-Freak
ja tut mir leid, aber ich habe immer noch keine lösung!
und es kann doch nicht sein, dass keiner eine kennt oder???
also ich hoffe, dass sich trotzdem noch jemand meldet..

Verfasst: 29.03.2005 18:45
von MLK
ich lass mir einen ordnerinhalt so anzeigen:
Code: Alles auswählen
For x = 1 To AnzahlZeilenDieGeschriebenWerdenMüssen
PrintN(Zeile$)
If x%20 = 0 And NochMehrZeilenDaDieGeschriebenWerdenMüssen
PrintN("")
Print("push return to continue..")
Input()
PrintN("")
PrintN("")
EndIf
Next
Verfasst: 29.03.2005 18:51
von Pure-r-Freak
ja danke das ist ne lösung für ordnerinhalte, aber sonst....
trotzdem es muss doch etwas geben, womit man in der konsole scrollen kann??????????????
das gibts doch nicht

Verfasst: 29.03.2005 18:57
von MLK
erstell dir doch nen buffer per linkedlist() oder scrollingbegrenzendem array in den du alles reinschreibst was eigentlich in die konsole soll und schreib dann die letzten paar elemente in die konsole. dann fängst du ein eventuelles #key_up ab und setzt den startpunkt und endpunkt des ausgabebereiches innerhalb der liste/array um eins nach oben, löscht die konsole und schreibst diesen bereich rein, usw.. verstanden ?

Verfasst: 29.03.2005 22:48
von MLK
da es mir nach spaß aussah, habe ich mich rangesetzt und wurde auch nicht enttäuscht. hier ein kleines beispiel das ich gemacht habe:
Code: Alles auswählen
NewList PrintBuffer$()
;testwerte
For i = 1 To 100
AddElement(PrintBuffer$())
PrintBuffer$() = "Eintrag " + Str(i)
Next i
Procedure PrintFromBuffer(Pos)
Shared LinesToPrint
If Pos >= 0 And Pos <= CountList(PrintBuffer$()) - LinesToPrint
SelectElement(PrintBuffer$(), Pos)
ClearConsole()
For i = 1 To LinesToPrint
PrintN(PrintBuffer$())
NextElement(PrintBuffer$())
Next i
EndIf
EndProcedure
LinesToPrint = 24
PrintBufferPos = CountList(PrintBuffer$() ) - LinesToPrint
OpenConsole()
PrintFromBuffer(PrintBufferPos)
Repeat
key$ = Inkey()
If key$
If Asc(key$) = 255
Select PeekB(@key$ + 1) & $FF
Case 72 ;up
If PrintBufferPos - 1 >= 0
PrintBufferPos - 1
PrintFromBuffer(PrintBufferPos)
EndIf
Case 80 ;down
If PrintBufferPos <= CountList(PrintBuffer$()) - LinesToPrint
PrintBufferPos + 1
PrintFromBuffer(PrintBufferPos)
EndIf
Case 73 ;pageup
If PrintBufferPos - LinesToPrint >= 0
PrintBufferPos - LinesToPrint
PrintFromBuffer(PrintBufferPos)
ElseIf PrintBufferPos > 0
PrintBufferPos = 0
PrintFromBuffer(PrintBufferPos)
EndIf
Case 81 ;pagedown
If PrintBufferPos + LinesToPrint <= CountList(PrintBuffer$()) - LinesToPrint
PrintBufferPos + LinesToPrint
PrintFromBuffer(PrintBufferPos)
ElseIf PrintBufferPos < CountList(PrintBuffer$()) - LinesToPrint
PrintBufferPos = CountList(PrintBuffer$()) - LinesToPrint
PrintFromBuffer(PrintBufferPos)
EndIf
Case 71 ;pos1
PrintBufferPos = 0
PrintFromBuffer(PrintBufferPos)
Case 79 ;ende
PrintBufferPos = CountList(PrintBuffer$()) - LinesToPrint
PrintFromBuffer(PrintBufferPos)
EndSelect
EndIf
EndIf
Delay(1)
Until Left(key$, 1) = Chr(27)
vielleicht nützt es dir ja irgendwie.
mich persönlich würde interessieren wie ich der prozedur die liste per pointer übergeben könnte und dann dort vorgehen müsste. wäre nett wenn das, und bitte nicht mehr, jemand posten könnte.
Verfasst: 31.03.2005 10:56
von Kaeru Gaman
> wie ich der prozedur die liste per pointer übergeben könnte
generell sehr knifflig, da eine liste keinen einzelnen pointer benutzt, sondern für jedes element einen...
Verfasst: 31.03.2005 13:12
von MLK
jupp, und in der hilfe steht:
Die Hilfe hat geschrieben:
Structure Element
*Next.Element ; Zeiger auf das nächste Element in der Liste oder Null, wenn es das letzte Element ist
*Previous.Element ; Zeiger auf das vorherige Element in der Liste oder Null, wenn es das erste Element ist
; Die Datentypen des Anwenders, mit denen die Liste erstellt wurde, folgen nach diesen
; zwei Variablen (was bedeutet, das die Anwenderdaten wie folgt gefunden werden können:
; Adresse des neuen Elements + 8
EndStructure
wobei @liste() den pointer zum anfang der datensektion ausgibt, also -8 zum anfang des 4 byte langen pointers zum nächsten element führt oder den wert 0 hat wenn es das letzte element ist.
weiter als zu einem code der abstürzt bin ich aber nicht gekommen:
Code: Alles auswählen
NewList List.s()
For i = 1 To 100
AddElement(List())
List() = "Eintrag " + Str(i)
Next i
Procedure CountPointedList(*List.LONG)
*List - 8
While *List\l
CountedElements + 1
*List = *List\l - 8
Wend
ProcedureReturn CountedElements
EndProcedure
Debug "CountedElements: " + Str(CountPointedList(@List()))
;Debug CountList(List())
vielleicht kann ja deeem mal was dazu sagen. er hat sich damit ja schon intensiv auseinandergesetzt. allerdings will ich das ganze ohne vorher strukturen definieren zu müssen.
ansonsten schreib ichs halt auf eine lösung ohne liste um.
Verfasst: 01.04.2005 22:42
von Deeem2031
Das Problem bei deinem Code ist das @List() nicht die Adresse des Elementes sondern die Adresse des Strings zurückgibt. Normalerweise ist das ja auch sinnvoll, aber dadurch bekommt man nichtmehr die Adresse des Elements und ich weiß auch keinen Weg um das zu umgehen...