; Drag&Drop ; РАБОТАЮ С ДЕРЕВОМ TreeGadget
;МОГУ ПЕРЕДАВАТЬ ТЕКСТ и переменную ЛОНГ ДАННЫЕ ЧЕРЕЗ Drag&Drop
; ДАТА ПЕРЕДЕЛКИ 2022.08...
Dim s1$(20) : For i=0 To 20 : s1$(i) = "1" : Next ;о булочках... создаю текст, а иначе там нулевой адрес.
Dim s1(20)
; ДЛЯ НАДЕЖНОСТИ МОЖНО ПРИСВОТЬ Nul1 = 2 ВО ВСЕХ ФОРМАТАХ. НА #PB_UTF8 И ОДНОГО ХВАТАЕТ
Nul1 = 2 ; ДЛЯ #PB_Unicode ; ЭТО КОЛИЧЕСТВО БАЙТ ПОСЛЕ ТЕКСТА, ОБЫЧНО ЭТО ЗАВЕРШЕНИЕ ТЕКСТА НУЛЯМИ.
Format = #PB_Unicode
#TreeViev = 0; номер гаджета дерева
#Edit = 1
#Window = 0;
OpenWindow(#Window, 300, 200, 600, 500, "TreeViev", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
hWndTreeViev=TreeGadget(#TreeViev, 0, 0, 300, 500, #PB_Tree_AlwaysShowSelection)
EditorGadget(#Edit, 320, 20, 250, 120 )
SetGadgetState(#TreeViev, 0 )
FormatTree = $1234
;EnableGadgetDrop(ГАДЖЕТ, ТИП ФОРМАТА, ЧТО СДЕЛАТЬ(копировать/переслать/линк) [, тип приватный])
;EnableGadgetDrop(#TreeViev, #PB_Drop_Text, #PB_Drag_Copy | #PB_Drag_Move | #PB_Drag_Link );
EnableGadgetDrop(#TreeViev, #PB_Drop_Text, #PB_Drag_Copy | #PB_Drag_Move )
EnableGadgetDrop(#Window , FormatTree , #PB_Drag_Copy | #PB_Drag_Move ); так можно бросать прямо на окно
*Buffer =AllocateMemory(1000); сюда будем писать наши данные, в даном случае наш текст и строку которую перемещаем
D.DragDataFormat ; создаем струтуру данных под наш формат. если данных несколько то они повторяются.Проще моздать в массиве и номер масива будет количеством.
D.DragDataFormat\Format.i=FormatTree ; (тут число от фонаря, может это не верно;-) )Определяемый OS идентификатор формата для перетаскивания (больше информации смотрите ниже)
D.DragDataFormat\Buffer =*Buffer ;AllocateMemory(1000) ; Буфер в памяти, содержащий данные в этом формате
D.DragDataFormat\Size.i =1000 ; Размер данных в буфере
; это типа аналог данных связанных с веткой, слово на ветку:
s1$= "скушай еще немного этих прекрасных вкусных ароматных булочек и не вздумай отказаться од этой вкуснятины "
For I=0 To CountString(s1$, " " )-1 ; ищет КОЛИЧЕСТВО СОВПАДЕНИЙ
s1$(I) = StringField(s1$, I+1, " " ) ; ВЫРЕЗАЕТ СЛОВО ИСПОЛЬЗУЯ РАЗДЕЛИТЕЛЬ
Debug s1$(I)
AddGadgetItem(#TreeViev, i,"Итем Item № " + Str(i) + ", #" + Str(i + 100) , 0, i/4 )
SetGadgetItemData(#TreeViev, I, i + 100 )
s1(I ) = $12000078 + (i * $100 )
Next
;-Repeat
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget ;выбран гаджет
Position = GetGadgetState(#TreeViev) ;ВОЗВРАЩАЕТ ТЕКУЩИЙ ВЫБРАННЫЙ пункт
Select EventGadget() ; Gadgets;выбран гаджет номер
Case #TreeViev ; сообщение от нашего дерева.
Select EventType(); событие мышки
Case #PB_EventType_Change ;768, сменился текст или сделан выьор новой строки.
; выводим данные о выделенном итеме в редактор #Edit:
nnn = GetGadgetState(#TreeViev)
Debug ""+ nnn+" = номер ВЫДЕЛЕНОЙ строки. EventType() = #PB_EventType_Change сменился выбор или название текста итема."
If nnn >=0
S2$= "" + nnn +" =номер выбраного итема" + #LF$
S2$+ GetGadgetText(#TreeViev) +" = текст итема" +#LF$
S2$+ GetGadgetItemAttribute(#TreeViev, nnn, #PB_Tree_SubLevel) +" = подуровень итема"+ #LF$; Со следующим атрибутом:
S2$+ GetGadgetItemData(#TreeViev, nnn ) +" = Data итема что присвоил" +#LF$
S2$+ S1$(nnn)+" = текстовые данные этого итема" +#LF$
S2$+ Hex( s1(nnn ), #PB_Long )+" = бинарное число как данные этого итема" +#LF$
SetGadgetText(#Edit , S2$ ) ; ИЗМЕНЯЕМ Text$
EndIf
Case #PB_EventType_DragStart ; событие мышки- DragStart начато перетаскивание.
Debug #LF$+ "+++++++++++++++++++++++++ПЕРЕДАЕМ . ПЕРЕТАСКИВАНИЕ НАЧАЛОСЬ EventType() = #PB_EventType_DragStart"
; Debug Str(DropNum)+ " = номер по порядку. DropNum ":DropNum+1
SelectNum = GetGadgetState(#TreeViev) ; запоминаем номер выбраной строки до команды DragText иначе будет тот на котором отпустили мышку.
If SelectNum >=0
;*m1.myDat = *Buffer
; записываем в память для передачи:
*B_ADR = *Buffer ; *B
R= PokeL( *B_ADR , $12045078 ) : ; ПЕРЕДАЛИ ЧИСЛО ОТ ФОНАРЯ.
*B_ADR + 4 ; 8
R= PokeL( *B_ADR , SelectNum ) : ;*m1.myDat\s1.l = SelectNum; +" =номер выбраного итема"; + #LF$
*B_ADR + 4 ; 8
*B_ADR+ Nul1 + PokeS( *B_ADR , GetGadgetText(#TreeViev) , -1 , Format );*m1.myDat\s2.s = GetGadgetText(#TreeViev); +" = текст итема"; +#LF$
; *m1.myDat\s3.l = GetGadgetItemAttribute(#TreeViev, SelectNum, #PB_Tree_SubLevel); +" = подуровень итема";+ #LF$; Со следующим атрибутом:
R= PokeL( *B_ADR , GetGadgetItemAttribute(#TreeViev, SelectNum, #PB_Tree_SubLevel) ) :
*B_ADR + 4
R= PokeL( *B_ADR , GetGadgetItemData(#TreeViev, SelectNum ) ) : ; *m1.myDat\s4.l = GetGadgetItemData(#TreeViev, SelectNum ); +" = Data итема что присвоил"; +#LF$
*B_ADR + 4
*B_ADR+ Nul1 + PokeS( *B_ADR , S1$(SelectNum) , -1 , Format ); *m1.myDat\s5.s = S1$(SelectNum);+" = текстовые данные этого итема"; +#LF$
R= PokeL( *B_ADR , s1 (SelectNum ) ) : ; *m1.myDat\s6.l = s1 (SelectNum ); Hex( s1(SelectNum ), #PB_Long )+" = бинарное число как данные этого итема" +#LF$
*B_ADR + 4
Rezultat = DragOSFormats( D.DragDataFormat, 1 )
EndIf
Debug Str(Rezultat)+" = результат передачи данных +++++DragText++++ результат перемещения Drag&Drop:"
If Rezultat = #PB_Drag_None
Debug "#PB_Drag_None пользователь отменил"
ElseIf Rezultat = #PB_Drag_Copy
Debug "#PB_Drag_Copy пользователь скопировал"
ElseIf Rezultat = #PB_Drag_Move
Debug "#PB_Drag_Move пользователь переместил, можно удалить у нас то что перемещено"
Debug ""+ SelectNum+" = номер ВЫДЕЛЕНОЙ строки." ; нужно запоминать номер выделеного до того как переместили. Иначе будем удалять тот на который отпустили.
RemoveGadgetItem(#TreeViev, SelectNum ) ; удаляем ту строку что переместили
ElseIf Rezultat = #PB_Drag_Link
Debug "#PB_Drag_Link пользователь создать ссылку"
EndIf
Debug "-------конец, ДАНЫЕ ПЕРЕДАНЫ"
Debug "выбран пункт в дереве, Position = "+Str(Position)
Debug "выбран пункт в дереве, GetGadgetState = "+Str(GetGadgetState(#TreeViev))
Debug "текст в дереве, GetGadgetText = "+GetGadgetText(#TreeViev)
; Debug "WindowMouseX()= "+Str(WindowMouseX(#Window));координата мышки
EndSelect
EndSelect
:
Case #PB_Event_GadgetDrop; принимаем что передано ;#Arbre_DragDrop_Deplacer=0=номера даных DragDrop
Debug #LF$+ "- +++++++++++++++++++++++++ПРИНИМАЕМ Drop даные от гаджета, #PB_Event_GadgetDrop"
; Debug Str(DropNum)+" = DropNum номер по порядку ":DropNum+1
Select EventGadget(); какой гаджет выбран.
Case #TreeViev; выбрано дерево.
Position = GetGadgetState(#TreeViev)
Debug Str(Position)+"=позиция в дереве GetGadgetState, наверное тут отпустили мышкой"
Debug "EventDropType() = " + EventDropType()
Select EventDropType(); Drag&Drop событие мышки
Case FormatTree; если получен наш новый навороченый формат данных с бинарными данными.
*Buff = EventDropBuffer(): Tab1$= Chr(9): Tab2$= Chr(9) + Chr(9)
Debug "FormatTree: адрес EventDropBuffer() = " + *Buff ;EventDropBuffer()
Debug "FormatTree: размер данных EventDropSize() = " + EventDropSize()
; ++++++++++++++++считываем с памяти. Размер трудно определять PeekL =4 байта
Debug #LF$+"считываем с буфера памяти в котором переслали данные..."
*B_ADR = *Buff ;
Debug ""+ Hex(PeekL( *B_ADR ) )+Tab1$+ " =некое число в Hex формате, для проверки"
*B_ADR+ 4 ; 8
Debug ""+ PeekL( *B_ADR ) +Tab2$+ " = номер выбраного итема который перетаскиваем";= "" + SelectNum; +" =номер выбраного итема"; + #LF$
*B_ADR+ 4
LP$ = PeekS( *B_ADR , -1 , Format )
Debug ""+ LP$ +Tab1$+ " = текст итема которого перетаскиваем";= GetGadgetText(#TreeViev); +" = текст итема"; +#LF$
L= StringByteLength( LP$ , Format ) ; узнаем сколько байт занято и прибавим 2 для формата #PB_Unicode и для надежности.
*B_ADR+ Nul1 + L
Debug ""+ PeekL( *B_ADR ) +Tab2$+ " = подуровень итема который перетаскиваем"; = GetGadgetItemAttribute(#TreeViev, SelectNum, #PB_Tree_SubLevel); +" = подуровень итема";+ #LF$; Со следующим атрибутом:
*B_ADR+ 4
Debug ""+ PeekL( *B_ADR ) +Tab2$+ " = Data итема который перетаскиваем"; = GetGadgetItemData(#TreeViev, SelectNum ); +" = Data итема что присвоил"; +#LF$
*B_ADR+ 4
LP$ = PeekS( *B_ADR , -1 , Format )
Debug ""+ LP$ +Tab2$+ " = текстовые данные c Dim этого итема который перетаскиваем(о булочках)";= S1$(SelectNum);+" = текстовые данные этого итема"; +#LF$
L= StringByteLength( LP$ , Format ) ; узнаем сколько байт занято и прибавим 2 для формата #PB_Unicode и для надежности.
*B_ADR+ Nul1 + L
Debug ""+Hex( PeekL( *B_ADR ) ) + Tab1$+ " = число c Dim(), в Hex формате итема который перетаскиваем" ;= s1(SelectNum ); Hex( s1(SelectNum ), #PB_Long )+" = бинарное число как данные этого итема" +#LF$
*B_ADR+ 4
Case #PB_Drop_Text; #PB_Drop_Private; событие мышки(наверное отпущено)
Debug "обработчик в процедуре "
Debug "копировать/переместить...EventDropAction() = " + EventDropAction(); #PB_Drag_Copy, #PB_Drag_Move
Debug "адрес EventDropBuffer() = " + EventDropBuffer()
Debug "размер данных EventDropSize() = " + EventDropSize()
Debug "EventDropText() = " + EventDropText()
Debug Str(GetGadgetState(#TreeViev) )+" = НОМЕР ВЫДЕЛЕНОго";возвращает НОМЕР ВЫДЕЛЕНОго
AddGadgetItem(#TreeViev, GetGadgetState(#TreeViev)+1, EventDropText() , 0, 0) ; текст отправлен так DragText().
Debug ""+ GetGadgetItemData(#TreeViev, GetGadgetState(#TreeViev) ) + " = номер который присвоен в начале"
Debug Str(CountGadgetItems(#TreeViev))+" = ВОЗВРАТИТ КОЛИЧЕСТВО итемов в дереве" ;ВОЗВРАТИТ КОЛИЧЕСТВО ПУНКТОВ
EndSelect
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow