Problem mit Drag and Drop in Scrollareagadget

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Problem mit Drag and Drop in Scrollareagadget

Beitrag von Dostej »

Hallo zusammen

Hier ist mein Codeschnipsel. Es soll möglich sein, Daten (als TExt) von einem Licon auf ein anderes zu ziehen.
Geht aber nur von den Maschinenlicons auf das arbeiteslicon, nicht umgekehrt. Kann mir jemand sagen, warum oder was mein Fehler ist?
Oder ist das ein "Feature" :mrgreen:

Code: Alles auswählen

Structure Mschn
  BesitzerID_I.L 
  BesitzerArt_I.L
  Art_I.L Werkzeugmaschine
  MaschID_I.L ; ID der Maschine
  KaufPreis_I.L ; der Kaufpreis der Maschine
  Alter_I.L ; das Alter in Runden
  ZeitWert_I.L ; Der aktuelle (Buch)Wert der Maschine
  Abschreibung_I.L ; die Abschreibungen in dieser Runde 
  Produktion_I.L ; 1, wenn die Maschine diese Runde produzieren soll
  Produktionskosten_I.L ; Kosten pro Runde in der die Maschine etwas herstellt
  ProduktionsMenge_I.L ; Anzahl an max. herstellbaren Einheiten
  ProdZeit_I.L ; - z.Z. ungenutzt
  Arbeiter1_I.L ; Index Arbeiter
  Arbeiter2_I.L ; Index Arbeiter
  Arbeiter3_I.L ; Index Arbeiter
  SelectedInput_I.L ; Was ist eingestellt
  SelectedOutput_I.L ; Was ist eingestellt
  Input_I.L ; Was ist möglich - bitweise Ware_
  Output_I.L ; Was stellt es her - bitweise Ware_
  Status_I.L
  Effizienz_I.L
  Automatisierung_I.L 
  Rationalisierung_I.L 
  Detail1_I.L t
  Detail2_I.L
  Detail3_I.L 
EndStructure
Global NewList Maschinen.Mschn()
For x = 0 To 6
  AddElement(Maschinen())
  Maschinen()\BesitzerID_I = 1
  Maschinen()\BesitzerArt_I = 1
  Maschinen()\MaschID_I = x+1
Next


;- Window Constants
;
Enumeration
  #Window_ArbeiterZuweisen
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_ArbeiterZuweisen_Arbeiter
  #ListIcon_ArbeiterZuweisen_Arbeiter
  #Button_ArbeiterZuweisen_OK
  #Button_ArbeiterZuweisen_Quit
  #Text_ArbeiterZuweisen_Maschinen
  #ScrollArea_ArbeiterZuweisen_Maschinen
  
  
  #SourceText
  #TargetText
EndEnumeration


Global Dim Language$(6)


Procedure Open_Window_ArbeiterZuweisen(FirmenID_I.I)
  Protected n.I, y.I, Drag_S.s, S.s
  NewList Licons.I()
  NewList MaschinenTmp.Mschn()
  
  ; erstelle Kopien der Maschinenliste
  ForEach Maschinen()
    If Maschinen()\BesitzerID_I = FirmenID_I And Maschinen()\BesitzerArt_I = 1
      AddElement(MaschinenTmp())
      MaschinenTmp() = Maschinen()
      ProdZeit_I = @Maschinen()
    EndIf
  Next
  ; Das gleiche für Arbeiter
  
  
  ; und des Arbeiterarrays
  
 
  
  
  If OpenWindow(#Window_ArbeiterZuweisen, 136, 80, 760, 660, "Arbeiter zuweisen",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    TextGadget(#Text_ArbeiterZuweisen_Arbeiter, 10, 10, 380, 20, Language$(0), #PB_Text_Center | #PB_Text_Border)
    ListIconGadget(#ListIcon_ArbeiterZuweisen_Arbeiter, 10, 30, 380, 390, Language$(1), 80, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
    AddGadgetColumn(#ListIcon_ArbeiterZuweisen_Arbeiter, 1, Language$(2), 200)
    AddGadgetColumn(#ListIcon_ArbeiterZuweisen_Arbeiter, 2, Language$(3), 90)
    ButtonGadget(#Button_ArbeiterZuweisen_OK, 680, 430, 70, 20, Language$(4))
    ButtonGadget(#Button_ArbeiterZuweisen_Quit, 590, 430, 70, 20, Language$(5))
    
    For x = 0 To 10
      AddGadgetItem(#ListIcon_ArbeiterZuweisen_Arbeiter, -1, "Neuarbeiter " + Str(x))
    Next
    EnableGadgetDrop(#ListIcon_ArbeiterZuweisen_Arbeiter, #PB_Drop_Text, #PB_Drag_Copy)
    
    ; Zähle die Maschinen
    n = 6
    
    ;- Maschinenliste
    TextGadget(#Text_ArbeiterZuweisen_Maschinen, 410, 10, 340, 20, Language$(6), #PB_Text_Center | #PB_Text_Border)
    ScrollAreaGadget(#ScrollArea_ArbeiterZuweisen_Maschinen, 410, 30, 340, 390, 315, 110 + n * 90, 90)
      ;{ gadgets setzen
      y = 5
      ForEach MaschinenTmp()
      ; Licon erstellen
      AddElement(Licons())
      Licons() = ListIconGadget(#PB_Any, 5, y, 300, 65, "Name " + Str(MaschinenTmp()\MaschID_I), 80, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      y + 90
      
      ; Licon mit den Arbeiterdaten füllen
      AddGadgetItem(Licons(), -1, "Arbeiter " + Str(ListIndex(MaschinenTmp())))
      
      ; drag and drop starten
      EnableGadgetDrop(Licons(), #PB_Drop_Text, #PB_Drag_Move)
      
    Next
      
      ;}
  CloseGadgetList()
  
    
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
        If EventGadget() = #ListIcon_ArbeiterZuweisen_Arbeiter
          Text$ = GetGadgetItemText(#ListIcon_ArbeiterZuweisen_Arbeiter, GetGadgetState(#ListIcon_ArbeiterZuweisen_Arbeiter))
          DragText(Text$)
          Debug "arb start "
        Else
          ForEach Licons()
            If EventGadget() = Licons()
              Drag_S = GetGadgetItemText(Licons(), GetGadgetState(Licons()))
              DragText(Drag_S)
              Debug "masch start " + Drag_S
            EndIf
          Next
          
        EndIf
        
        ; Drop event on the target gadgets, receive the dropped data
        ;
      ElseIf Event = #PB_Event_GadgetDrop
        If EventGadget() = #ListIcon_ArbeiterZuweisen_Arbeiter
          AddGadgetItem(#ListIcon_ArbeiterZuweisen_Arbeiter, -1, EventDropText())
          Debug "DROP"
        Else
          CallDebugger
          ForEach Licons()
            If EventGadget() = Licons()
              AddGadgetItem(Licons(), -1, EventDropText())
              Debug "masch drop " + Drag_S
            EndIf
          Next
        EndIf
        
      EndIf
      
    Until Event = #PB_Event_CloseWindow
  EndIf
EndProcedure

Restore BaseLanguage
For k=0 To 6
  Read.s Language$(k)
Next

Open_Window_ArbeiterZuweisen(1)

End

DataSection
  BaseLanguage:
  Data$ "Arbeiter"
  Data$ "Name"
  Data$ "Ausbildung"
  Data$ "Maschine"
  Data$ "OK"
  Data$ "Abbruch"
  Data$ "Maschinen"
EndDataSection



c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Problem mit Drag and Drop in Scrollareagadget

Beitrag von c4s »

So funktioniert es:

Code: Alles auswählen

Structure Mschn
	BesitzerID_I.L
	BesitzerArt_I.L
	Art_I.L ;Werkzeugmaschine
	MaschID_I.L ; ID der Maschine
	KaufPreis_I.L ; der Kaufpreis der Maschine
	Alter_I.L ; das Alter in Runden
	ZeitWert_I.L ; Der aktuelle (Buch)Wert der Maschine
	Abschreibung_I.L ; die Abschreibungen in dieser Runde
	Produktion_I.L ; 1, wenn die Maschine diese Runde produzieren soll
	Produktionskosten_I.L ; Kosten pro Runde in der die Maschine etwas herstellt
	ProduktionsMenge_I.L ; Anzahl an max. herstellbaren Einheiten
	ProdZeit_I.L ; - z.Z. ungenutzt
	Arbeiter1_I.L ; Index Arbeiter
	Arbeiter2_I.L ; Index Arbeiter
	Arbeiter3_I.L ; Index Arbeiter
	SelectedInput_I.L ; Was ist eingestellt
	SelectedOutput_I.L ; Was ist eingestellt
	Input_I.L ; Was ist möglich - bitweise Ware_
	Output_I.L ; Was stellt es her - bitweise Ware_
	Status_I.L
	Effizienz_I.L
	Automatisierung_I.L
	Rationalisierung_I.L
	Detail1_I.L
	Detail2_I.L
	Detail3_I.L
EndStructure
Global NewList Maschinen.Mschn()
For x = 0 To 6
	AddElement(Maschinen())
	Maschinen()\BesitzerID_I = 1
	Maschinen()\BesitzerArt_I = 1
	Maschinen()\MaschID_I = x+1
Next


;- Window Constants
;
Enumeration
	#Window_ArbeiterZuweisen
EndEnumeration

;- Gadget Constants
;
Enumeration
	#Text_ArbeiterZuweisen_Arbeiter
	#ListIcon_ArbeiterZuweisen_Arbeiter
	#Button_ArbeiterZuweisen_OK
	#Button_ArbeiterZuweisen_Quit
	#Text_ArbeiterZuweisen_Maschinen
	#ScrollArea_ArbeiterZuweisen_Maschinen
	
	
	#SourceText
	#TargetText
EndEnumeration


Global Dim Language$(6)


Procedure Open_Window_ArbeiterZuweisen(FirmenID_I.I)
	Protected n.I, y.I, Drag_S.s, S.s
	NewList Licons.I()
	NewList MaschinenTmp.Mschn()
	
	; erstelle Kopien der Maschinenliste
	ForEach Maschinen()
		If Maschinen()\BesitzerID_I = FirmenID_I And Maschinen()\BesitzerArt_I = 1
			AddElement(MaschinenTmp())
			MaschinenTmp() = Maschinen()
			ProdZeit_I = @Maschinen()
		EndIf
	Next
	; Das gleiche für Arbeiter
	
	
	; und des Arbeiterarrays
	
	
	
	
	If OpenWindow(#Window_ArbeiterZuweisen, 136, 80, 760, 660, "Arbeiter zuweisen",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
		TextGadget(#Text_ArbeiterZuweisen_Arbeiter, 10, 10, 380, 20, Language$(0), #PB_Text_Center | #PB_Text_Border)
		ListIconGadget(#ListIcon_ArbeiterZuweisen_Arbeiter, 10, 30, 380, 390, Language$(1), 80, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
		AddGadgetColumn(#ListIcon_ArbeiterZuweisen_Arbeiter, 1, Language$(2), 200)
		AddGadgetColumn(#ListIcon_ArbeiterZuweisen_Arbeiter, 2, Language$(3), 90)
		ButtonGadget(#Button_ArbeiterZuweisen_OK, 680, 430, 70, 20, Language$(4))
		ButtonGadget(#Button_ArbeiterZuweisen_Quit, 590, 430, 70, 20, Language$(5))
		
		For x = 0 To 10
			AddGadgetItem(#ListIcon_ArbeiterZuweisen_Arbeiter, -1, "Neuarbeiter " + Str(x))
		Next
		EnableGadgetDrop(#ListIcon_ArbeiterZuweisen_Arbeiter, #PB_Drop_Text, #PB_Drag_Copy)
		
		; Zähle die Maschinen
		n = 6
		
		;- Maschinenliste
		TextGadget(#Text_ArbeiterZuweisen_Maschinen, 410, 10, 340, 20, Language$(6), #PB_Text_Center | #PB_Text_Border)
		ScrollAreaGadget(#ScrollArea_ArbeiterZuweisen_Maschinen, 410, 30, 340, 390, 315, 110 + n * 90, 90)
		;DisableGadget(#ScrollArea_ArbeiterZuweisen_Maschinen, #True)
		;{ gadgets setzen
		y = 5
		ForEach MaschinenTmp()
			; Licon erstellen
			AddElement(Licons())
			Licons() = ListIconGadget(#PB_Any, 5, y, 300, 65, "Name " + Str(MaschinenTmp()\MaschID_I), 80, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
			y + 90
			
			; Licon mit den Arbeiterdaten füllen
			AddGadgetItem(Licons(), -1, "Arbeiter " + Str(ListIndex(MaschinenTmp())))
			
			; drag and drop starten
			EnableGadgetDrop(Licons(), #PB_Drop_Text, #PB_Drag_Copy)
			
		Next
		
		;}
		CloseGadgetList()
		
		
		Repeat
			Event = WaitWindowEvent()
			If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
				If EventGadget() = #ListIcon_ArbeiterZuweisen_Arbeiter
					Text$ = GetGadgetItemText(#ListIcon_ArbeiterZuweisen_Arbeiter, GetGadgetState(#ListIcon_ArbeiterZuweisen_Arbeiter))
					DragText(Text$)
					Debug "arb start "
				Else
					ForEach Licons()
						If EventGadget() = Licons()
							Drag_S = GetGadgetItemText(Licons(), GetGadgetState(Licons()))
							DragText(Drag_S)
							Debug "masch start " + Drag_S
						EndIf
					Next
					
				EndIf
				
				; Drop event on the target gadgets, receive the dropped data
				;
			ElseIf Event = #PB_Event_GadgetDrop
				If EventGadget() = #ListIcon_ArbeiterZuweisen_Arbeiter
					AddGadgetItem(#ListIcon_ArbeiterZuweisen_Arbeiter, -1, EventDropText())
					Debug "DROP"
				Else
					;CallDebugger
					ForEach Licons()
						If EventGadget() = Licons()
							AddGadgetItem(Licons(), -1, EventDropText())
							Debug "masch drop " + Drag_S
						EndIf
					Next
				EndIf
				
			EndIf
			
		Until Event = #PB_Event_CloseWindow
	EndIf
EndProcedure

Restore BaseLanguage
For k=0 To 6
	Read.s Language$(k)
Next

Open_Window_ArbeiterZuweisen(1)

End

DataSection
	BaseLanguage:
	Data$ "Arbeiter"
	Data$ "Name"
	Data$ "Ausbildung"
	Data$ "Maschine"
	Data$ "OK"
	Data$ "Abbruch"
	Data$ "Maschinen"
EndDataSection
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Re: Problem mit Drag and Drop in Scrollareagadget

Beitrag von Dostej »

Hm, ok, jetzt gehts... danke.
Habs glaube ich grundsätzlich begriffen.

Und so funktioniert es auch mit Move

Code: Alles auswählen

Structure Mschn
  BesitzerID_I.L ; FirmenID_I  /  0 = Zentralbank
  BesitzerArt_I.L
  Art_I.L
  MaschID_I.L ; ID der Maschine
  KaufPreis_I.L ; der Kaufpreis der Maschine
  Alter_I.L ; das Alter in Runden
  ZeitWert_I.L ; Der aktuelle (Buch)Wert der Maschine
  Abschreibung_I.L ; die Abschreibungen in dieser Runde 
  Produktion_I.L ; 1, wenn die Maschine diese Runde produzieren soll
  Produktionskosten_I.L ; Kosten pro Runde in der die Maschine etwas herstellt
  ProduktionsMenge_I.L ; Anzahl an max. herstellbaren Einheiten
  ProdZeit_I.L ; - z.Z. ungenutzt
  Arbeiter1_I.L ; Index Arbeiter
  Arbeiter2_I.L ; Index Arbeiter
  Arbeiter3_I.L ; Index Arbeiter
  SelectedInput_I.L ; Was ist eingestellt
  SelectedOutput_I.L ; Was ist eingestellt
  Input_I.L ; Was ist möglich - bitweise Ware_
  Output_I.L 
  Status_I.L 
  Effizienz_I.L 
  Automatisierung_I.L
  Rationalisierung_I.L
  Detail1_I.L ; Info zu sonstigem ; bei input "Abholzen"=Waldeinheit
  Detail2_I.L ; bei input "Abholzen"=Bitweise für Baumalter
  Detail3_I.L ; die Menge der zu produzierenden Teile / bei input "Abholzen"= Die Menge der zu fällenden Bäume
EndStructure
Global NewList Maschinen.Mschn()
For x = 0 To 6
  AddElement(Maschinen())
  Maschinen()\BesitzerID_I = 1
  Maschinen()\BesitzerArt_I = 1
  Maschinen()\MaschID_I = x+1
Next


;- Window Constants
;
Enumeration
  #Window_ArbeiterZuweisen
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_ArbeiterZuweisen_Arbeiter
  #ListIcon_ArbeiterZuweisen_Arbeiter
  #Button_ArbeiterZuweisen_OK
  #Button_ArbeiterZuweisen_Quit
  #Text_ArbeiterZuweisen_Maschinen
  #ScrollArea_ArbeiterZuweisen_Maschinen
EndEnumeration


Global Dim Language$(6)


Procedure Open_Window_ArbeiterZuweisen(FirmenID_I.I)
  Protected n.I, y.I, Drag_S.s, S.s
  NewList Licons.I()
  NewList MaschinenTmp.Mschn()
  
  ; erstelle Kopien der Maschinenliste
  ForEach Maschinen()
    If Maschinen()\BesitzerID_I = FirmenID_I And Maschinen()\BesitzerArt_I = 1
      AddElement(MaschinenTmp())
      MaschinenTmp() = Maschinen()
      ProdZeit_I = @Maschinen()
    EndIf
  Next
  ; Das gleiche für Arbeiter
  
  
  ; und des Arbeiterarrays
  
  
  
  
  If OpenWindow(#Window_ArbeiterZuweisen, 136, 80, 760, 660, "Arbeiter zuweisen",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    TextGadget(#Text_ArbeiterZuweisen_Arbeiter, 10, 10, 380, 20, Language$(0), #PB_Text_Center | #PB_Text_Border)
    ListIconGadget(#ListIcon_ArbeiterZuweisen_Arbeiter, 10, 30, 380, 390, Language$(1), 80, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
    AddGadgetColumn(#ListIcon_ArbeiterZuweisen_Arbeiter, 1, Language$(2), 200)
    AddGadgetColumn(#ListIcon_ArbeiterZuweisen_Arbeiter, 2, Language$(3), 90)
    ButtonGadget(#Button_ArbeiterZuweisen_OK, 680, 430, 70, 20, Language$(4))
    ButtonGadget(#Button_ArbeiterZuweisen_Quit, 590, 430, 70, 20, Language$(5))
    
    For x = 0 To 10
      AddGadgetItem(#ListIcon_ArbeiterZuweisen_Arbeiter, -1, "Neuarbeiter " + Str(x))
    Next
    EnableGadgetDrop(#ListIcon_ArbeiterZuweisen_Arbeiter, #PB_Drop_Text, #PB_Drag_Copy)
    
    ; Zähle die Maschinen
    n = 6
    
    ;- Maschinenliste
    TextGadget(#Text_ArbeiterZuweisen_Maschinen, 410, 10, 340, 20, Language$(6), #PB_Text_Center | #PB_Text_Border)
    ScrollAreaGadget(#ScrollArea_ArbeiterZuweisen_Maschinen, 410, 30, 340, 390, 315, 110 + n * 90, 90)
      ;{ gadgets setzen
      y = 5
      ForEach MaschinenTmp()
        ; Licon erstellen
        AddElement(Licons())
        Licons() = ListIconGadget(#PB_Any, 5, y, 300, 65, "Name " + Str(MaschinenTmp()\MaschID_I), 80, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
        y + 90
        
        ; Licon mit den Arbeiterdaten füllen
        AddGadgetItem(Licons(), -1, "Arbeiter " + Str(ListIndex(MaschinenTmp())))
        
        ; drag and drop starten
        EnableGadgetDrop(Licons(), #PB_Drop_Text, #PB_Drag_Move)
        
      Next
      
      ;}
    CloseGadgetList()
    
    
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
        If EventGadget() = #ListIcon_ArbeiterZuweisen_Arbeiter
          Drag_S = GetGadgetItemText(#ListIcon_ArbeiterZuweisen_Arbeiter, GetGadgetState(#ListIcon_ArbeiterZuweisen_Arbeiter))
          DragText(Drag_S, #PB_Drag_Move)
          Debug "arb start "
          RemoveGadgetItem(#ListIcon_ArbeiterZuweisen_Arbeiter, GetGadgetState(#ListIcon_ArbeiterZuweisen_Arbeiter))
        Else
          ForEach Licons()
            If EventGadget() = Licons()
              Drag_S = GetGadgetItemText(Licons(), GetGadgetState(Licons()))
              DragText(Drag_S, #PB_Drag_Move)
              Debug "masch start " + Drag_S
              RemoveGadgetItem(Licons(), GetGadgetState(Licons()))
            EndIf
          Next
          
        EndIf
        
        ; Drop event on the target gadgets, receive the dropped data
        ;
      ElseIf Event = #PB_Event_GadgetDrop
        If EventGadget() = #ListIcon_ArbeiterZuweisen_Arbeiter
          AddGadgetItem(#ListIcon_ArbeiterZuweisen_Arbeiter, -1, EventDropText())
          Debug "DROP"
        Else
          ForEach Licons()
            If EventGadget() = Licons()
              AddGadgetItem(Licons(), -1, EventDropText())
              Debug "masch drop " + Drag_S
            EndIf
          Next
        EndIf
        
      EndIf
      
    Until Event = #PB_Event_CloseWindow
  EndIf
EndProcedure

Restore BaseLanguage
For k=0 To 6
  Read.s Language$(k)
Next

Open_Window_ArbeiterZuweisen(1)

End

DataSection
  BaseLanguage:
  Data$ "Arbeiter"
  Data$ "Name"
  Data$ "Ausbildung"
  Data$ "Maschine"
  Data$ "OK"
  Data$ "Abbruch"
  Data$ "Maschinen"
EndDataSection



Antworten