Aktuelle Zeit: 27.07.2017 18:45

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 16.07.2017 22:46 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
Hallo.

Hier mal eine Frage an die Linuxgemeinde :

Ich habe ein StringGadget, dessen Inhalt selektiert werden soll, wenn es den Fokus erhält.

Wenn ich gtk_editable_select_region_() in der Haupt Event Schleife aufrufe, funktioniert es.
Wenn ich das ganze aber in eine Prozedur verfrachte und mit BindGadgetEvent() automatisch
aufrufen lassen möchte, klappt es nicht mehr. Weiss jemand wie ich das mit BindGadgetEvent()
hinbekomme ?

Unter Windows hatte ich ähnliches Problem, dort half es aus dem SendMessage_() ein PostMessage_()
Aufruf zu machen, evt. ist es hier das gleiche, nur kenne ich die ganze API Geschichte nicht wirklich ...

Code:
; Funktioniert !
OpenWindow(0, 0, 0, 200, 100, "Autoselect text", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 20, 20, "A")
StringGadget(2, 50, 40, 100, 20, "Test")
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 2
        If EventType() = #PB_EventType_Focus
          gtk_editable_select_region_(GadgetID(2), 0, Len(GetGadgetText(2)))
        EndIf
      EndIf
  EndSelect
ForEver

Code:
; Soll funktionieren ! (leider macht es nichts)
Procedure.i MyStringEvent()
 
  Gadget = EventGadget()
 
  Select EventType()
    Case #PB_EventType_Focus
      gtk_editable_select_region_(GadgetID(Gadget), 0, Len(GetGadgetText(Gadget)))   
  EndSelect
   
EndProcedure

OpenWindow(0, 0, 0, 200, 100, "Autoselect text", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 20, 20, "A")
StringGadget(2, 50, 40, 100, 20, "Test")
BindGadgetEvent(2, @MyStringEvent(), #PB_EventType_Focus)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver


Der Button ist zum Fokus verlieren da ;)

_________________
PureBasic 5.44 LTS / 5.60 (Windows x86/x64) | Windows10 Pro x64 | Z87-PLUS | i7 4770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 03:46 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Die beiden folgenden Codes funktionieren hier mit PB 5.44 LTS unter Linux Mint 18.1 Cinnamon 32 Bit.

Code:
OpenWindow(0, 0, 0, 200, 100, "Autoselect text", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 20, 20, "A")
StringGadget(2, 50, 40, 100, 20, "Test")

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_Gadget
         If EventGadget() = 2
            Select EventType()
               Case #PB_EventType_Focus
                  gtk_editable_select_region_(GadgetID(2), 0, Len(GetGadgetText(2)))
               Case #PB_EventType_LostFocus
                  gtk_editable_select_region_(GadgetID(2), 0, 0)
            EndSelect
         EndIf
         
      Case #PB_Event_CloseWindow
         Break
   EndSelect
ForEver



Code:
Procedure.i MyStringEvent()
   Select EventType()
      Case #PB_EventType_Focus
         gtk_editable_select_region_(GadgetID(2), 0, Len(GetGadgetText(2)))
      Case #PB_EventType_LostFocus
         gtk_editable_select_region_(GadgetID(2), 0, 0)
   EndSelect
EndProcedure


OpenWindow(0, 0, 0, 200, 100, "Autoselect text", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 20, 20, "A")
StringGadget(2, 50, 40, 100, 20, "Test")
BindGadgetEvent(2, @MyStringEvent())

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
         Break
   EndSelect
ForEver


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 09:23 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
Faszinierend. Ich habe allerdings Linux Mint 18.1 Cinammon 64Bit laufen und PB5.60

Der Code mit der Eventschleife funktioniert (wie im Eingangspost erwähnt.)
Der untere mit BindEventGadget nicht. Irgendwie seltsam...

Ich werde es glatt nachher mit der 5.44 probieren...

_________________
PureBasic 5.44 LTS / 5.60 (Windows x86/x64) | Windows10 Pro x64 | Z87-PLUS | i7 4770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 10:51 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
@Nino: die BindGadgetEvent()-Variante funktioniert bei mir auch nicht wirklich.

Wenn man in die Mitte von 'Test' klickt, so wird der gesamte Text kurzzeitig selektiert. Danach steht der Cursor dort, wo man hingeklickt hat und die Selektion ist weg.

Grüße ... Peter (Linux Mint 18.2 Cinnamon 64-bit / PB 5.60 x64)

_________________
Kalsarikännit


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 10:56 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
@Bisonte:
Meine Vermutung war/ist, dass das Problem evtl. durch diese Zeile bei Dir
Code:
BindGadgetEvent(2, @MyStringEvent(), #PB_EventType_Focus)
verursacht wird.

Deshalb habe ich BindGadgetEvent() ohne #PB_EventType_Focus aufgerufen.

@Kiffi:
Uuups, Mausklick hatte ich gar nicht getestet. :oops:
Ich hatte es nur mit Drücken der Tab-Taste probiert.

Im Moment (Büro-PC ohne Linux) kann ich's nicht neu testen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 10:57 
Offline
StudiAdmin oder sowas in der Art
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Bei mir wird es beim LeftButtonUp wieder deselektiert. Das heißt, wenn ich rein klicke und die Taste halte, dann ist der Text markiert. Wenn ich dann die Maus etwas verschiebe, bleibt es auch markiert. Lasse ich die Taste wieder los, ohne sie vorher verschoben zu haben, dann wird erst wieder deselektiert. Man müsste also vielleicht irgendwie LeftButtonUp abfangen können.

Mit Tab funktioniert es wunderbar.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Unser Anet A8 3D-Drucker und sein Zusammenbau
Ubuntu Gnome 16.04.2 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 12:47 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
@Nic: Stimmt. So ist mir das gar nicht aufgefallen. Unter Windows reicht ein Klick ins Gadget, und dadurch erhält
es den Fokus, somit wird es selektiert. Warum muss man denn hier nun die Maustaste gedrückt halten ?

Ich hab den code ja wie oben (also ohne das "deselektieren") und das Verhalten ist genau das gleiche.
Allerdings auch nur, wenn der Cursor irgendwo in dem Text steht. Wenn er am Ende steht passiert nichts.

Nun hab ich das Problem, das das StringGadget nur drei EventTypes unterstützt... "Was tun?" sprach Zeus....

_________________
PureBasic 5.44 LTS / 5.60 (Windows x86/x64) | Windows10 Pro x64 | Z87-PLUS | i7 4770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 17:48 
Offline

Registriert: 25.03.2013 09:59
Hi!
Unterm Linux-Gtk ist es so, dass für Mausklicks auf ein Widget (Gadget) immer eine Sequenz von Events abgearbeitet wird.
Wird z.B. ein Linksklick (besteht aus Press und Release) erkannt, wird gewartet ob nicht ein Doppelklick folgt,
wird dann ein Doppel-Linksklick erkannt wird nochmals gewartet, ob nicht ein 3-fach-Klick folgt.
Erst nach dieser Verzögerung steht der Typ endgültig fest.

Während dieser Zeit ist ein selbstmodifizierender Code auf das Widget, das die Mausklicks erhält leider kaum oder überhaupt nicht möglich - es wird stets auf den vorherigen Zustand zurückgesetzt. (zu was die heutigen OS nebenbei so alles Zeit haben :wink: )
Erst danach ist eine Änderung des betroffenen Gadgets möglich.

Ich hab mir kürzlich mit einem zusammengebastelten DelayedPostEvent() geholfen, um zum Beispiel ein SplitterGadget durch Doppelklick auf den Griff auf bestimmte Werte zu setzen. Innerhalb des/der Callbacks sprang er stets auf den vorherigen Werte zurück.
Ne andere Lösung wüßte ich im Moment auch nicht.

Gruß Charly

_________________
PureBasic Linux-API-Library: http://www.chabba.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 18:41 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Es scheint hier zu funktionieren, wenn Maus-Linksklicks in einer eigenen Ereignisprozedur entsprechend behandelt werden:

Code:
; PB 5.44 LTS unter Linux Mint 18.1 (32 Bit)

EnableExplicit

; Konstanten für den Fokus in Bezug auf das Stringgadget
Enumeration
   #Focus_Lost
   #Focus_Got
EndEnumeration

Global.i gFocusState = #Focus_Lost

Procedure MyStringEvent()
   Select EventType()
      Case #PB_EventType_Focus
         gtk_editable_select_region_(GadgetID(2), 0, Len(GetGadgetText(2)))
         gFocusState = #Focus_Got
      Case #PB_EventType_LostFocus
         gtk_editable_select_region_(GadgetID(2), 0, 0)
         gFocusState = #Focus_Lost
   EndSelect
EndProcedure

Procedure MyLeftClickEvent()
   Static.i isSelected = #False
   
   If gFocusState = #Focus_Got
      If isSelected = #False
         gtk_editable_select_region_(GadgetID(2), 0, Len(GetGadgetText(2)))
         isSelected = #True
      Else
         gtk_editable_select_region_(GadgetID(2), 0, 0)
         isSelected = #False
      EndIf
   EndIf   
EndProcedure


OpenWindow(0, 0, 0, 200, 100, "Autoselect text", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 20, 20, "A")
StringGadget(2, 50, 40, 100, 20, "Test")
BindGadgetEvent(2, @MyStringEvent())
BindEvent(#PB_Event_LeftClick, @MyLeftClickEvent())

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
         Break
   EndSelect
ForEver


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringGadgetInhalt Selektieren bei Fokuserhalt
BeitragVerfasst: 17.07.2017 20:09 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
Ok Da alles nicht so wirklich den erwünschten Effekt hat, muss es dann wohl doch die Haupt
Schleife sein. Und nochmal nebenbei : Wenn das "deselektieren" automatisch bei LostFocus
gemacht wird, kann man mit dem selektierten Inhalt nichts anfangen (Rechtsklick und kopieren
ist Fokusverlust, weil ein Popupmenu aufgeht!)

Also doch nach Abfrage ob das Event was reinkommt von einem Gadget kommt, allgemein nach String schauen
und bei Fokuserhalt den Text markieren. So klappt das.

Code:
Procedure.i AutoSelectString()
 
  If GadgetType(EventGadget()) = #PB_GadgetType_String
    If EventType() = #PB_EventType_Focus
      gtk_editable_select_region_(GadgetID(EventGadget()), 0, Len(GetGadgetText(EventGadget())))   
    EndIf
  EndIf
 
EndProcedure

OpenWindow(0, 0, 0, 200, 100, "Autoselect text", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 20, 20, "A")
StringGadget(2, 50, 40, 100, 20, "Test")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      AutoSelectString()
  EndSelect
ForEver


Schade eigentlich, weil das BindGadgetEvent ja eigentlich für genau sowas da ist ...

_________________
PureBasic 5.44 LTS / 5.60 (Windows x86/x64) | Windows10 Pro x64 | Z87-PLUS | i7 4770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye