Autoscroll

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pure-r-Freak
Beiträge: 74
Registriert: 08.03.2005 13:40

Autoscroll

Beitrag 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 :allright:
danke..... :freak:

:praise:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Autoscroll

Beitrag 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
Benutzeravatar
Pure-r-Freak
Beiträge: 74
Registriert: 08.03.2005 13:40

Beitrag 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..
:coderselixir:
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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
Benutzeravatar
Pure-r-Freak
Beiträge: 74
Registriert: 08.03.2005 13:40

Beitrag 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

:freak:
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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 ? :-)
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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...
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten