Seite 1 von 2

editorgadget scrollen (gelöst)

Verfasst: 06.01.2010 23:43
von jpd
Hallo,

ich suche eine methode das das Scrollen zum letzen eintrag in ein Editorgadget unter Linux ermöglicht, unter windows ist dieser mit sendmessage möglich.

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Editor_0
  #Button_0
EndEnumeration


Procedure Open_Window_0()

  If OpenWindow(#Window_0, 220, 0, 491, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      EditorGadget(#Editor_0, 70, 30, 350, 160,#PB_Editor_ReadOnly)
      ButtonGadget(#Button_0, 80, 230, 60, 30, "last entry")
  EndIf
  
EndProcedure


Open_Window_0()

For x = 0 To 50
  AddGadgetItem(#Editor_0, -1, "Test_"+Str(x))
Next

Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  ;You can place code here, and use the result as parameters for the procedures
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #Editor_0
      
    ElseIf GadgetID = #Button_0
      
      SendMessage_(GadgetID(#Editor_0),#EM_SCROLL,#SB_BOTTOM,0)      
    EndIf
    
  EndIf
  
Until Event = #PB_Event_CloseWindow ; End of the event loop

End

Wie geht das unter Linux? ich verwende zur zeit Ubuntu 8.x

Danke

jpd

Re: editorgadget scrollen

Verfasst: 07.01.2010 10:20
von jpd
Hi,

habe die antwort im Englischen Forum gefunden.
Freak beschreibt wie man GTK scrolled window vewendet:

http://www.purebasic.fr/english/viewtop ... 24#p202224

Re: editorgadget scrollen (gelöst)

Verfasst: 23.02.2010 22:10
von pickelrobert
...und wenn ich einfach nur das ausgewählte Element in einem ListView- bzw. ListIconGadget anzeigen möchte?

Unter Windows ist es damit möglich

Code: Alles auswählen

SetGadgetState(#frmHaupt_lstTeil,i)
SendMessage_(GadgetID(#frmHaupt_lstTeil),#LVM_ENSUREVISIBLE,i,#True)

Re: editorgadget scrollen (gelöst)

Verfasst: 24.02.2010 14:12
von Shardik
Mit dem folgenden Beispiel kann in Windows und Linux in einem ListIconGadget
die gewünschte Zeile in der Mitte des angezeigten Teilbereichs positioniert werden
(für Linux ist zur Berechnung des anzuzeigenden Ausschnittes eine Zeilenhöhe von
22 Pixel eingesetzt worden, was je nach Distribution angepaßt werden muß; ich war
jetzt einfach zu faul, die Zeilenhöhe per GTK-API zu ermitteln :wink: ):

Code: Alles auswählen

OpenWindow(0, 0, 0, 130, 130, "ListView", #PB_Window_SystemMenu)
ListIconGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 40, "Spalte 1", 60)
SpinGadget(1, 10, WindowHeight(0) - 30, 40, 25, 1, 50)
SetGadgetState(1, 1)
SetGadgetText(1, Str(GetGadgetState(1)))
ButtonGadget(2, 50, WindowHeight(0) - 30, 70, 25, "Anzeigen")

For i= 1 To 50
  AddGadgetItem(0, -1, "Zeile " + Str(i))
Next

Repeat
  Event = WaitWindowEvent()

  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case 1
        SetGadgetText(1, Str(GetGadgetState(1)))
      Case 2
        CompilerSelect #PB_Compiler_OS
          CompilerCase #PB_OS_Linux
            gtk_tree_view_scroll_to_point_(GadgetID(0), -1, (GetGadgetState(1) - 1) * 22 - 20)
          CompilerCase #PB_OS_Windows
            SendMessage_(GadgetID(0), #LVM_ENSUREVISIBLE, GetGadgetState(1), #True)
        CompilerEndSelect
    EndSelect
  EndIf
Until Event = #PB_Event_CloseWindow

Re: editorgadget scrollen (gelöst)

Verfasst: 24.02.2010 20:37
von Waldixxl
DANKE! :) :)
suche ich schon lange.
Walter

Re: editorgadget scrollen (gelöst)

Verfasst: 27.02.2010 22:33
von pickelrobert
Danke. So in etwa hatte ich mir das vorgestellt. Hängt auch von der geladenen Schrift und ihrer Größe ab. Muß mal sehen, ob ich das Beipiel dazu wiederfinde...

Re: editorgadget scrollen (gelöst)

Verfasst: 19.05.2011 19:44
von Shardik
Ich habe mein Beispiel von oben jetzt auch noch für den Einsatz unter
MacOS X erweitert:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
  ImportC ""
    RevealDataBrowserItem(ControlRef.L, ItemID.L, PropertyID.L, RevealOptions.L)
  EndImport
CompilerEndIf

OpenWindow(0, 200, 100, 140, 150, "ListView", #PB_Window_SystemMenu)
ListIconGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 40, "Spalte 1", 70)
SpinGadget(1, 5, WindowHeight(0) - 30, 50, 25, 1, 50)
SetGadgetState(1, 1)
SetGadgetText(1, Str(GetGadgetState(1)))
ButtonGadget(2, 60, WindowHeight(0) - 30, 70, 25, "Anzeigen")

For i= 1 To 50
  AddGadgetItem(0, -1, "Zeile " + Str(i))
Next

Repeat
  Event = WaitWindowEvent()

  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case 1
        SetGadgetText(1, Str(GetGadgetState(1)))
      Case 2
        CompilerSelect #PB_Compiler_OS
          CompilerCase #PB_OS_Linux
            gtk_tree_view_scroll_to_point_(GadgetID(0), -1, (GetGadgetState(1) - 1) * 22 - 20)
          CompilerCase #PB_OS_MacOS
            RevealDataBrowserItem(GadgetID(0), GetGadgetState(1), 0, 1)
          CompilerCase #PB_OS_Windows
            SendMessage_(GadgetID(0), #LVM_ENSUREVISIBLE, GetGadgetState(1), #True)
        CompilerEndSelect
    EndSelect
  EndIf
Until Event = #PB_Event_CloseWindow

Re: editorgadget scrollen (gelöst)

Verfasst: 19.11.2015 19:28
von Kukulkan
Hallo,

das ist fast genau das was ich auch cross-platform benötige. Allerdings muss ich vorher noch die Positionen ermitteln, damit ich bei einem Restart des Programms an exakt die selbe Position scrollen kann. Hat jemand auch dazu die passenden Befehle um die Position zu ermitteln? Selbst in der GTK Doku finde ich die Funktion, aber kein Gegenstück um die Position zu ermitteln...

Danke,

Kukulkan

Re: editorgadget scrollen (gelöst)

Verfasst: 19.11.2015 21:35
von Omi
Hallo Kukulkan,
betrifft Deine Ansinnen das Editor- oder das ListIconGadget?

Fürs ListIconGadget kann man (zumindest in gtk2) das Adjustment (Slider) abfragen und setzen
Ein Rohling ohne Funktion ...

Code: Alles auswählen

ImportC ""
	gtk_adjustment_get_value.d(*adjustment.GtkAdjustment)
	gtk_adjustment_set_value(*adjustment.GtkAdjustment, value.d)
EndImport

Define *adjust.GtkAdjustment
Define vOffs.d
;holt das vertikale Adjustment ...
*adjust= gtk_tree_view_get_vadjustment_(GadgetID(ListIconGadget))
;holt die vert. Sliderstellung als double ...
vOffs= gtk_adjustment_get_value(*adjust)
;setzt die vert. Sliderstellung als double ...
gtk_adjustment_set_value(*adjust, vOffs)
In gtk3 läuft das Ganze nochmal über die Zwischenschicht GtkScrollable.

Falls der Rohling nicht reicht bastele ich Dir mal ein kleines Beispiel.

Gruß Charly

Re: editorgadget scrollen (gelöst)

Verfasst: 20.11.2015 09:03
von Kukulkan
Hallo Omi,

damit komm ich schonmal klar. Danke! :allright:

Jetzt noch für MacOS, dann hab ich es fast zusammen. Die API für Windows hab ich schon gefunden.