Seite 2 von 2

Re: LeftDoubleClick bei TextGadget

Verfasst: 23.08.2010 15:26
von Lord
@NicknameFJ
Ich habe mich bei meiner voherigen Antwort wohl
etwas unglücklich ausgedrückt.
Ich will keine zwei Aktionen, die nicht in einem
Kontext stehen ausführen. Grob gesagt soll bei
einem Linksklick auf eines von mehreren Textgadgets
dieses markiert werden (Rahmen) und weitere Infos
angezeigt werden, während ein vorher markiertes
den Rahmen verliert. Bei einem Doppelklick wandert
der Textinhalt dieses Textgadgets in das zentrale
Textgadget, alle anderen Textgadgetinhalte werden
ebenfalls entsprechend verschoben (neu erstellt).
Man soll sich so durch einen Baum hangeln können.

Code: Alles auswählen

        |-------TG
 |------TG            <- dieses ist das 'zentrale' Textgadget
 |       |-------TG
TG
 |       |-------TG
 |------TG
        |-------TG
Mache ich jetzt z.B. einen Doppelklick auf das unterste
rechte Textgadget, würde zuerst ein Rahmen um dieses
gezeichnet werden, der alte Rahmen gelöscht und erst
dann die eigentliche Neudarstellung der Textgadgets
ausgelöst.

Das ganze hat zwar nur kosmetische Aspekte, den die
Funktionalität ist ja gegeben, aber das doppelte Neu-
zeichnen der Seite stört mich.

@TomS
Ich habe meine Frage bewußt ins Anfängerforum einge-
stellt, da ich sicherlich nicht über die nötigen Kenntnisse
verfüge, dieses Problem zu lösen.
Desweiteren muß ich noch einen Fehler meinerseits korri-
gieren:
Das verstehe ich nicht so ganz. Das BS kann doch
sehrwohl bei anderen Gadgets einen Doppelklick
feststellen und die entsprechende Nachricht generieren.
Diese Aussage ist falsch. So sendet z.B. das ListViewGadget
ebenfalls zwei Events, nämlich je einen #PB_EventType_LeftClick
und einen #PB_EventType_LeftDoubleClick.

@all
Danke für alle gutgemeinten Ratschläge.
Leider war (für mich) kein anfängertauglicher dabei.

Nachtrag:
Und so wie es aussieht, gibt es auch keine Profilösung
für das Problem:
http://www.purebasic.fr/english/viewtop ... textgadget

Re: LeftDoubleClick bei TextGadget

Verfasst: 23.08.2010 19:43
von TomS
Wenn ich dein Vorhaben richtig verstanden habe, behindert also die Einfachklick-Aktion nicht die Doppeklick-Aktion. Somit ist es ganz einfach möglich.
Ich mach mal ein kurzes Beispiel, wenn das Beispiel nicht das macht, was du vorhast, dann versuch es bitte nochmal genauer zu eklären.

Code: Alles auswählen

Dim info.s(3)

info(0) = "Das ist das zentrale TextGadget"
info(1) = "Das ist das erste TextGadget"
info(2) = "Das ist das zweite Textgadget"

OpenWindow(0,0,0,400,400,"TextGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

TextGadget(0, 5, 5, 390, 100, "Zentrales TextGadget",#PB_Text_Border|#SS_NOTIFY)

TextGadget(1, 5, 120, 100, 100, "TextGadget 1",#PB_Text_Border|#SS_NOTIFY)
TextGadget(2, 290, 120, 100, 100, "TextGadget 2",#PB_Text_Border|#SS_NOTIFY)

TextGadget(3,5,300,390,14,"Info")
Repeat
	event = WaitWindowEvent(20)
	eventType = EventType()
	
	If event = #PB_Event_Gadget		
		Select eventType				
			Case #PB_EventType_LeftClick
				For a =0 To 2
					SetGadgetColor(a, #PB_Gadget_BackColor, -1)
				Next
				SetGadgetColor(EventGadget(), #PB_Gadget_BackColor, $0000FF)
				SetGadgetText(3,"Info zu Gadget "+Str(EventGadget())+": "+info(EventGadget()))
				
			Case 1				
				SetGadgetText(0, GetGadgetText(0)+#CRLF$+GetGadgetText(EventGadget()))
				For a =0 To 2
					SetGadgetColor(a, #PB_Gadget_BackColor, -1)
				Next
				SetGadgetText(3, "Info")
				
		EndSelect 
	EndIf 
	
Until event = #PB_Event_CloseWindow
End 
So. Ist jetzt nur schnell "hingeschmiert".
Man sieht beim Doppelklick jetzt, dass das Feld kurz rot aufleuchtet.
Das zurücksetzen der Farbe beim Doppelklick könnte man auch weglassen, dann sieht man auch später noch, welches Feld kopiert wurde.

Was mir aufgefallen ist: #PB_EventType_LeftDoubleClick ist 2, allerdings kommt bei EventType beim Doppelklick 1 an...

Re: LeftDoubleClick bei TextGadget

Verfasst: 23.08.2010 20:55
von Falko
Zum einen wird laut der Hilfe das TextGadget() nicht über EventType() untestützt.
Mich wundert aber, das man dort in der Hilfe dort alle Gadgets ausser das TextGadget angibt,
aber unter dem Punkt EventGadget() nichts dergleichen einträgt.

Wenn ich den Code so umstelle und das EventTpye usw. weg lasse, wobei ich nur wissen will,
ob einer der beiden TextGadgets, 1 oder 2 angesprochen werden, kommt da nichts heraus.

Code: Alles auswählen

OpenWindow(0,0,0,200,400,"Test",#PB_Window_SystemMenu)


TextGadget(1, 10, 10, 180, 180,"TextGadget 1",#PB_Text_Center|#PB_Text_Border)
TextGadget(2, 10,210, 180, 180,"TextGadget 2",#PB_Text_Center|#PB_Text_Border)

Repeat
  
  Event=WaitWindowEvent()

  Select Event

   Case #PB_Event_Gadget
      
      Select EventGadget()
        Case 1 : Debug "Gadget1"
          Debug WindowEvent()
          ;Debug EventType
          ; kein Event
        Case 2 : Debug "Gadget2"
          Debug WindowEvent()
          ;Debug EventType
          ;0 bei LeftClick
          ;0 + 1 bei LeftDoubleClick
      EndSelect
      
   Case #PB_Event_CloseWindow
    
    Quit=#True
      
  EndSelect
 
Until Quit
Den Doppelklick könnte man ja über das Event direkt herausbekommen, da beim Debug Event eben beim Linksklick
513, beim Loslassen 514, bei Mausbewegung 512 und beim Doppelklick 515 heraus kommt. Nur wenn man
aber nicht das TextGadget(..) über dem EventGadget nachträglich herausbekommen kann ist es sinnlos. dort eine eigene WindowsEventabfrage() reinzuschreiben. Dieses Beispiel von Oben ist nach dem Beispiel aus der Hilfe von EventTypet() umgestellt. Nur das hier eben TextGadget(..) angegeben werden und ich die EventType() weggelassen habe.

Im folgenden Beispiel ist der Ablauf ähnlich, nur das dort noch zusätzlich das EventType abgefragt wird und
natürlich keine TextGadgets dort vorhanden sind.

Code: Alles auswählen

Beispiel: 

  If OpenWindow(0, 0, 0, 230, 120, "Eventtypes Beispiel...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
     ListIconGadget(1, 10, 10, 150, 100, "ListIcon", 140, #PB_ListIcon_GridLines) 
     For a= 1 To 4
       AddGadgetItem(1, -1, "Line "+Str(a))
     Next a
  
     Repeat
       Event = WaitWindowEvent()
       
       Select Event
       
         Case #PB_Event_Gadget
           Select EventGadget()
             Case 1 
               Select EventType()
                 Case #PB_EventType_LeftClick        : Debug "Klick mit der linken Maustaste"
                 Case #PB_EventType_RightClick       : Debug "Klick mit der rechten Maustaste"
                 Case #PB_EventType_LeftDoubleClick  : Debug "Doppelklick mit der linken Maustaste"
                 Case #PB_EventType_RightDoubleClick : Debug "Doppelklick mit der rechten Maustaste"
               EndSelect
           EndSelect
       
       EndSelect
     Until Event = #PB_Event_CloseWindow
  EndIf

Unterstützte OS 

Alle


Gruß Falko

Re: LeftDoubleClick bei TextGadget

Verfasst: 23.08.2010 21:53
von TomS
Ja. Textgadgets sind normalerweise statisch zum Textanzeigen da und nicht dafür gedacht, dass man auf ihnen rumklickt.
Das teht auch ganz am Anfang.
Deshalb hat er ja #SS_NOTIFY als Flag verwendet.
Ich dachte, dass dadurch alle normalen PB-Events weitergeleitet werden, deshalb war ich verwundert.

Re: LeftDoubleClick bei TextGadget

Verfasst: 24.08.2010 13:51
von Lord
@all:

Nochmals Danke für die vielen Hilfestellungen.
Ich habe das Problem für mich jetzt nach dem
Beispiel von TomS gelöst, indem ich als Mar-
kierung keinen Rahmen zeichne, sondern den
Hintergrund des ausgewählten Textgadgets
einfärbe. Hierbei wirken die zwei aufeinander-
folgenden Aktionen nicht störend.