Scrollbar programmgesteuert setzen

Anfängerfragen zum Programmieren mit PureBasic.
Darkman1
Beiträge: 13
Registriert: 28.03.2008 10:02
Wohnort: Bad Vilbel

Scrollbar programmgesteuert setzen

Beitrag 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)
Zuletzt geändert von Darkman1 am 28.03.2008 10:59, insgesamt 1-mal geändert.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Verwende bitte die die Code-Taks
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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 ;-)
Zuletzt geändert von KeyKon am 28.03.2008 10:55, insgesamt 1-mal geändert.
(\/) (°,,,°) (\/)
Darkman1
Beiträge: 13
Registriert: 28.03.2008 10:02
Wohnort: Bad Vilbel

Beitrag von Darkman1 »

Sorry mit den code-Tags, zu spät bemerkt.

Code: Alles auswählen

Ich gelobe Besserung!
Zuletzt geändert von Darkman1 am 28.03.2008 10:57, insgesamt 1-mal geändert.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Nimm doch den hier: Bild
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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...
(\/) (°,,,°) (\/)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Scrollbar programmgesteuert setzen

Beitrag 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
a²+b²=mc²
Darkman1
Beiträge: 13
Registriert: 28.03.2008 10:02
Wohnort: Bad Vilbel

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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
Antworten