Seite 1 von 1

Scrollbar programmgesteuert setzen

Verfasst: 28.03.2008 10:47
von Darkman1
Hallo alle zusammen. Nach einigen Versuchen mit anderen Programmiersprachen bin ich hier bei PureBasic gelandet und mache nun meine ersten Gehversuche. Das erste Problem das ich mit der Hilfe + Suche im Forum nicht lösen kann ist das (programmgesteuerte) Verschieben der rechten Scrollbar im Gadget. Es soll stets die letzte Zeile sichtbar sein, da weitere Zeilen durch ein externes Ereignis hinzugefügt werden. Damit klar ist was ich meine:

Code: Alles auswählen

version$="V2.00"
;Festlegung der Position + Größe des Hauptfensters
main_xpos.w      =100
main_ypos.w      =100
main_xwidth.w    =600
main_ywidth.w    =600
;Festlegung der Position + Größe der COM-Window
com_xpos.w      =20
com_ypos.w      =120
com_xwidth.w    =main_xwidth-2*com_xpos
com_ywidth.w    =main_ywidth-com_ypos-40
mainwin.w       =0
comwin.w        =10
If OpenWindow(mainwin, main_xpos, main_ypos, main_xwidth, main_ywidth, version$)And CreateGadgetList(WindowID(mainwin)) 
  If CreateMenu(mainwin, WindowID(mainwin))
    MenuTitle("File")
    ;Die 1 im nächsten Aufruf ist die ID des Events
    MenuItem(1, "Quit")
  EndIf
  EditorGadget(comwin, com_xpos, com_ypos, com_xwidth, com_ywidth,#PB_Editor_ReadOnly) 
  SetGadgetColor(comwin, #PB_Gadget_BackColor,RGB(230,230,255))
  SetGadgetColor(comwin, #PB_Gadget_FrontColor,RGB(0,0,255))
  ;TextGadget(comwin, 10, 90, 200, 40, "TEST"+Chr(10)+"hhh")
  For a = 0 To 500 
    AddGadgetItem(comwin, a, "Line "+Str(a)) 
  Next 
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1
            Quit=1
        EndSelect
      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1
    EndSelect
  Until Quit = 1
EndIf
Hab's probiert mit

SetGadgetAttribute(comwin, #PB_ScrollArea_Y, 150)

hat aber irgendwie nichts gebracht.
Wer ist so nett und hilft mir mit einem Tipp weiter?

Vielen Dank im Voraus 8)

Verfasst: 28.03.2008 10:49
von Andreas_S
Verwende bitte die die Code-Taks

Verfasst: 28.03.2008 10:50
von KeyKon
Erstmal: Willkommen im Forum und bei PureBasic...
Eine bitte hätte ich an dich, es is um einiges übersichtlicher wenn du deinen Code in die praktischen Code-Tags setzt - >

Code: Alles auswählen

 Dein Code 
=

Code: Alles auswählen

Dein Code
Editier doch mal deinen oberen Post mit den Code-Tags ;-)

Verfasst: 28.03.2008 10:54
von Darkman1
Sorry mit den code-Tags, zu spät bemerkt.

Code: Alles auswählen

Ich gelobe Besserung!

Verfasst: 28.03.2008 10:55
von Andreas_S
Nimm doch den hier: Bild

Verfasst: 28.03.2008 11:02
von KeyKon
Hier eine mögliche Lösung per API:

Code: Alles auswählen

SendMessage_(GadgetID(comwin),#EM_LINESCROLL,0,500)
Der letzte Parameter is der wos hinscrollt (in deinem Beispiel halt 500)

Ein Blick ins Code-Archiv auf PureArea.net lohnt sich immer
(http://www.purearea.net/pb/german/ -> CodeArchiv -> Gadget -> EditorGadget -> DefineVisibleArea)

Die Scrollbar im EditorGadget hat übrigens nix mit dem PureBasic Scrollbar-Gadget zu tun...

Re: Scrollbar programmgesteuert setzen

Verfasst: 28.03.2008 11:07
von Kiffi
Darkman1 hat geschrieben:Es soll stets die letzte Zeile sichtbar sein, da weitere Zeilen durch ein externes Ereignis hinzugefügt werden.
da würde sich eher ein ListViewGadget() oder ListIconGadget() eignen.

Code: Alles auswählen

[...]
  ListViewGadget(comwin, com_xpos, com_ypos, com_xwidth, com_ywidth)
[...]
  For a = 0 To 500
    AddGadgetItem(comwin, a, "Line "+Str(a))
    SetGadgetState(comwin, CountGadgetItems(comwin)-1)
  Next
  Repeat
[...]
Grüße ... Kiffi

Verfasst: 28.03.2008 11:53
von Darkman1
@Kiffi
Im Prinzip hast Du recht, hab ich auch dran gedacht, ich kann aber den blauen Balken des markierten Eintrags nicht gebrauchen.

@KeyKon
Noch hab ich eine Demo-Version. Schätze die Vollversion bekomme ich Anfang/Mitte nächster Woche. Bis dahin muss diese Lösung warten. Hört sich aber vielversprechend an.


Ich dachte halt, das es eine reine PureBasic-Lösung für das Verschieben der Scrollbar gibt und ich die Funktion einfach nicht gefunden habe, aber daran hat wohl kein Entwickler gedacht - was ja auch nicht sooo schlimm ist.
Ich lasse diese Baustelle für ein paar Tage ruhen und wende mich anderen Programmteilen zu, es gibt noch jede Menge zu lösen.

Also zunächst vielen Dank für eure Mühen!!!

Ich werde die Lösung des Problems hier posten, ich denke so Ende nächster Woche.

Verfasst: 28.03.2008 13:51
von mk-soft
So geht es besser (mit API)

Code: Alles auswählen

Procedure Info(Text.s)

  Protected count
  
  AddGadgetItem(#Window_Listview_Status, -1, Text)
  count = CountGadgetItems(#Window_Listview_Status) - 1
  SendMessage_(GadgetID(#Window_Listview_Status), #LB_SETTOPINDEX, count, 0)
  
EndProcedure
FF :wink:

Verfasst: 28.03.2008 14:07
von HeX0R

Code: Alles auswählen

version$="V2.00"
;Festlegung der Position + Größe des Hauptfensters
main_xpos.w      =100
main_ypos.w      =100
main_xwidth.w    =600
main_ywidth.w    =600
;Festlegung der Position + Größe der COM-Window
com_xpos.w      =20
com_ypos.w      =120
com_xwidth.w    =main_xwidth-2*com_xpos
com_ywidth.w    =main_ywidth-com_ypos-40
mainwin.w       =0
comwin.w        =10
If OpenWindow(mainwin, main_xpos, main_ypos, main_xwidth, main_ywidth, version$)And CreateGadgetList(WindowID(mainwin))
  If CreateMenu(mainwin, WindowID(mainwin))
    MenuTitle("File")
    ;Die 1 im nächsten Aufruf ist die ID des Events
    MenuItem(1, "Quit")
  EndIf
  ListViewGadget(comwin, com_xpos, com_ypos, com_xwidth, com_ywidth)
  SetGadgetColor(comwin, #PB_Gadget_BackColor,RGB(230,230,255))
  SetGadgetColor(comwin, #PB_Gadget_FrontColor,RGB(0,0,255))
  ;TextGadget(comwin, 10, 90, 200, 40, "TEST"+Chr(10)+"hhh")
  For a = 0 To 500
    AddGadgetItem(comwin, a, "Line "+Str(a))
    SetGadgetState(comwin, CountGadgetItems(comwin)-1)
  Next
  SetGadgetState(comwin, -1)
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1
            Quit=1
        EndSelect
      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1
    EndSelect
  Until Quit = 1
EndIf