[Done] PB_Event_GadgetDrop mit BindGadgetEvent verarbeitbar?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1621
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

[Done] PB_Event_GadgetDrop mit BindGadgetEvent verarbeitbar?

Beitrag von Kurzer »

Ich würde das Eventmanagement in meinem Programm gern ausschließlich mit den (mittlerweile nicht mehr ganz so) neuen BindgadgetEvent() Befehlen realisieren.

Allerdings zermartere mir schon den einige Zeit den Kopf, ob und wenn ja, wie das mit den Drag & Drop Ereignissen funktioniert. Bisher habe ich keine Möglichkeit gefunden, um ein #PB_Event_GadgetDrop Ereignis z.B. an ein Editor-Gadget zu binden. Die Drag & Drop Events scheinen ausschließlich mittels des regulären eventloops realisierbar zu sein.

Oder kennt jemand eine Lösung, die das ganze mit direkter Bindung realisiert?

Hier die bisherige Lösung im Eventloop (den ich abschaffen will)

Code: Alles auswählen

	Repeat
		iEvent = WaitWindowEvent()
		iEventGadget = EventGadget()
		iEventType = EventType() 
		
		Select iEvent
			Case #PB_Event_SizeWindow
				; [...]
			Case #PB_Event_GadgetDrop
				Select iEventGadget
					Case EditorGadget
						If EventDropType() = #PB_Drop_Files And EventDropAction() = #PB_Drag_Copy
							sFilename = StringField(EventDropFiles() + Chr(10), 1, Chr(10))
						  Debug sFilename
						EndIf
				EndSelect
			Case #PB_Event_CloseWindow
				iQuit = 1
		EndSelect
	Until iQuit = 1
In der Hilfe steht zu BindGadgetEvent() zwar folgendes:
Die regulären Funktionen wie EventGadget(), EventWindow(), EventMenu(), EventType() und EventData() sind innerhalb des Callbacks verfügbar, um weitere Informationen über das Ereignis zu erhalten.

Hinweis: WindowEvent() und WaitWindowEvent() sollten niemals von innerhalb eines Callbacks aufgerufen werden, oder das Programm könnte gesperrt ("locked") werden oder ein falsches Verhalten zeigen.
Aber zur Benutzung von EventDropType() und EventDropAction() findet man leider nichts.

Wenn ich dem Gadget alle Events zuordne...
BindGadgetEvent(EditorGadget, @EditorGadget_DropFile(), #PB_All)
... dann muss ich innerhalb des Callbacks EventDropType() und EventDropAction() prüfen. Das schlägt aber fehl, sobald der Callback von einem anderen Event, der nicht #PB_Event_GadgetDrop entspricht, aufgerufen wird. Da heißt es dann "ERROR es hat kein Drag&Drop Ereignis stattgefunden".
Zuletzt geändert von Kurzer am 28.10.2015 01:49, insgesamt 2-mal geändert.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: #PB_Event_GadgetDrop mit BindGadgetEvent verarbeitbar?

Beitrag von Bisonte »

Schon versucht, mit mehreren "BindGadgetEvent" Callbacks ?
Also einen für jedes Event auf das Dein Gadget reagieren soll ?
Funktioniert. Also die Sache mit den mehreren BindGadgetEvents für ein Gadget....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Kurzer
Beiträge: 1621
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: #PB_Event_GadgetDrop mit BindGadgetEvent verarbeitbar?

Beitrag von Kurzer »

Das Problem dabei ist, dass das Editor Gadget nur drei EventTypes unterstützt:

Code: Alles auswählen

#PB_EventType_Change   : der Text wurde durch den Anwender geändert.
  #PB_EventType_Focus    : der Editor hat den Fokus erhalten.
  #PB_EventType_LostFocus: der Editor hat den Fokus verloren.
Es gibt keinen Type, der irgendwas mit dem Drag & Drop zu tun hat. Man kann mit BindGagdgetEvent ja leider nur EventTypes als optionales Filterkriterium angeben und keine Events.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: #PB_Event_GadgetDrop mit BindGadgetEvent verarbeitbar?

Beitrag von Bisonte »

Da wäre dann noch BindEvent(), das man auch mit einem Gadget koppeln kann.

BindEvent(#PB_Event_GadgetDrop, @Callback() , Window , EditorGadgetNr )
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Kurzer
Beiträge: 1621
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: #PB_Event_GadgetDrop mit BindGadgetEvent verarbeitbar?

Beitrag von Kurzer »

:allright:

Fantastisch, das war es. Passt, wackelt und hat Luft.
Firma 'Konfus' dankt! :)

Code: Alles auswählen

BindEvent(#PB_Event_GadgetDrop, @Main_Editor_Historie_DropFile(), Window_Main, Window_Main_Editor_Historie)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: [Done] PB_Event_GadgetDrop mit BindGadgetEvent verarbeit

Beitrag von TheCube »

Ich hänge mich mal einfach hier dran, ich befürchte es ist aber nur ein Anfängerproblem:
Wieso kann ich bei folgendem Code nichts/nirgends eine Datei xyz.txt "droppen" ? (Angezeigtes Mausicon zeigt das auch ...)

Code: Alles auswählen

Procedure SizeWindowHandler()
    Debug "Size event on window #" + EventWindow()
  EndProcedure

 Procedure Drophandler()
    Debug "Drop on Editor"
 EndProcedure

If OpenWindow(0, 0, 0, 400, 200, "EditorGadget", #PB_Window_SizeGadget |#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(1, 8, 150, 100, 20, "Here!")
    EditorGadget(0, 8, 8, 306, 133)
    For a = 0 To 5 : AddGadgetItem(0, a, "Zeile "+Str(a)) : Next
    
    EnableWindowDrop(0, #PB_Drop_Text, #PB_Drag_Copy)
    EnableGadgetDrop(0, #PB_Drop_Text, #PB_Drag_Copy)
    EnableGadgetDrop(1, #PB_Drop_Text, #PB_Drag_Copy)
    BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())

    ;BindEvent(#PB_Event_GadgetDrop, @Drophandler() , Window , EditorGadgetNr)
    BindEvent(#PB_Event_GadgetDrop, @Drophandler(), 0, 0 )    
     
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: [Done] PB_Event_GadgetDrop mit BindGadgetEvent verarbeit

Beitrag von RSBasic »

Möchtest du eine Zeile aus dem EditorGadget auf den Button "Here!" droppen?
Wenn ja, dann achte bitte auf den optionalen Parameter "Object" von BindEvent(), den du nutzt. Du übergibst da eine 0.
Du musst die richtige Gadgetnummer übergeben. Also nicht 0, sondern 1:

Code: Alles auswählen

BindEvent(#PB_Event_GadgetDrop, @Drophandler(), 0, 1)
Oder falls du auf alle Gadgets droppen lassen möchtest, dann entweder den Parameter entfernen oder #PB_All übergeben.
Also:

Code: Alles auswählen

BindEvent(#PB_Event_GadgetDrop, @Drophandler(), 0)
Oder:

Code: Alles auswählen

BindEvent(#PB_Event_GadgetDrop, @Drophandler(), 0, #PB_All)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: [Done] PB_Event_GadgetDrop mit BindGadgetEvent verarbeit

Beitrag von TheCube »

Danke, war schon hilfreich. Aber an das droppen innerhalb des Programms (aus dem Editorgadget auf Button "Here!")
habe ich gar nicht gedacht. Interessant.
Ich wollte zum ersten testen einfach ein Textfile aus dem Windowsexplorer auf mein Editorgadget oder Button droppen
um es z.B. anzeigen zu lassen oder (wenn auf den Button) weiter zu verarbeiten.
Das geht aber nicht, Mauszeiger verändert sich zu "geht nicht" (Kreis durchgestrichen)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: [Done] PB_Event_GadgetDrop mit BindGadgetEvent verarbeit

Beitrag von RSBasic »

Code: Alles auswählen

EnableGadgetDrop(0, #PB_Drop_Text, #PB_Drag_Copy)
Bild

Code: Alles auswählen

EnableGadgetDrop(0, #PB_Drop_Files, #PB_Drag_Copy)
Weitere Informationen: http://www.purearea.net/pb/german/manua ... tdrop.html
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: [Done] PB_Event_GadgetDrop mit BindGadgetEvent verarbeit

Beitrag von TheCube »

Ja, das wars natürlich :oops:
Hatte ich in der Hilfe falsch verstanden, ich dachte #PB_Drop_Text heisst :
Das zu droppende File muss .txt sein, bzw. wird so interpretiert.


Jetzt sind wir hier im Thread aber echt [Done].
Antworten