PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как можно передать мои данные используя Drag&Drop. Не текст.


Как можно передать мои данные используя Drag&Drop. Не текст.

Сообщений 1 страница 30 из 44

1

Давно не был тут, еле вошёл. :crazyfun:

Привет :flag:  Пётр, AZJIO,newJS и другим.

Вопрос ко всем.
Короче у меня есть прога с деревом. И нужно перемещать данные например на другую аналогичную прогу. Например скопировать ветку. Но там не только название ветки, но ещё и куча даных которые висят в каждом итеме.
Вот как их передать и принять.

Пробую что-то разобрать у Фреда DragOSFormats(), но не вижу как получить данные хотя бы адрес. То что возвращает не корректно.

0

2

balex1978 написал(а):

Короче у меня есть прога с деревом.

TreeGadget?

balex1978 написал(а):

И нужно перемещать данные например на другую аналогичную прогу. Например скопировать ветку.

DragDrop работает между процессами.
Можно прочитать всю ветку, и передать ее как текст функцией DragText(). В другом приложении принять функцией EventDropText() и добавить в TreeGadget.

0

3

Да ТрееГаджет.

Дело в том что там на каждый итем стоит структура, а в каждом итеме разный текст как в названии таки и в структуре.

По факту там нужно передавать бинарные данные, потому что там есть нули и байты мюзначения которых меньше пробела 32.

Отредактировано balex1978 (06.08.2022 18:04:14)

0

4

Если данные можно поместить в структуру, то ее можно преобразовать в JSON, а после в строку.
Бинарные данные можно преобразовать в строку с помощью Base64.

0

5

Я уже подумывал про Базе64...

До чего же изворотливые программисты :rofl:

Благодарю Пётр.

0

6

Если TreeGadget построен на структурах, то есть копия TreeGadget в памяти, то можно передать адрес структуры и сгенерировать ветвь на тех же данных.

0

7

AZJIO написал(а):

можно передать адрес структуры

Нужно передавать между процессами.
Проще преобразовать в JSON и передать как строку.

0

8

mk-soft предлагал между процессами использовать UdpServer. Хотя я до сих пор не понимаю почему нельзя прочитать данные другого процесса. Разве чтение с указателя кому то известно кому принадлежат данные, кроме диспетчера памяти, который выделяет память и помечает принадлежность процессу (вроде). То есть теоретически я могу по указателю прочитать любое место из памяти, а не только то что принадлежит моему процессу. ArtMoney ведь это умеет.

0

9

AZJIO написал(а):

mk-soft предлагал между процессами использовать UdpServer.

Для DragDrop есть стандартные средства доставки данных.

AZJIO написал(а):

Хотя я до сих пор не понимаю почему нельзя прочитать данные другого процесса.

Потому что процессы изолированы между собой. Память локальная и указатель из текущего процесса будет недействительным в остальных.

AZJIO написал(а):

То есть теоретически я могу по указателю прочитать любое место из памяти, а не только то что принадлежит моему процессу.

Из процесса (режима пользователя) физическая память недоступна. Доступ к ней можно получить только из ядра ОС.

AZJIO написал(а):

ArtMoney ведь это умеет.

Использует функцию ReadProcessMemory копирующую данные из памяти других процессов и память текущего процесса.

0

10

Пётр
ArtMoney должна заменить память в оригинале а не копии, иначе не подействует на игру.

0

11

Запись выполняется функцией WriteProcessMemory Она копирует данные из текущего процесса в выбранный.
Но вероятно в ArtMoney чтение/запись работает через внедрение dll в процесс. Это быстрее чем функции ReadProcessMemory и WriteProcessMemory. Работа с памятью выполняется в пределах процесса (внедренная dll выполняется в выбранном процессе), а приложению ArtMoney передается только результат.

0

12

AZJIO написал(а):

Если TreeGadget построен на структурах, то есть копия TreeGadget в памяти, то можно передать адрес структуры и сгенерировать ветвь на тех же данных.

И как передать другой проге. Точнее как вычитать эти данные не хакерским методом, без косых взглядов со стороны антивирусов.
:D

0

13

Но я бы стандартными методами дропа читал на АПИ, если есть какй нибудь пример.

0

14

balex1978
Я лишь сделал предположение в надежде, что можно через указатель.
В своё время я делал захват TreeGadget в древовидный текст с помощью AutoIt3 используя рекурсивный перебор дерева, в программе CaptureText, там есть исходник (функция __TreeViewToText). То есть получить дескриптор окна, дескриптор гаджета и функциями запроса элементов дерева, дочерних элементов дерева сгенерировать копию в другом TreeGadget, запрашивая текст каждого пункта. Но пример я делать не готов. У TreeGadget есть WinAPI-функции. Вот пример рекурсивной обработки дерева.

0

15

AZJIO написал(а):

mk-soft предлагал между процессами использовать UdpServer

Что только люди не придумают, лишь бы только документацию не читать  :D

balex1978
То, что Вам нужно, называется "межпроцессорное взаимодействие".
https://ru.wikipedia.org/wiki/Межпроцес … модействие
https://www.rsdn.org/article/baseserv/ipc.xml
Я бы использовал именованные пайпы (каналы)

0

16

Smitis написал(а):

Что только люди не придумают, лишь бы только документацию не читать

mk-soft достаточно хорошо разбирается, у него много хороших разработок. Насколько я понял, так как mk-soft старается делать кроссплатформенный код, то поэтому и выбрал этот вариант. Недавно он предложил мне код для обновления гаджетов в Linux, так как там проблема с потоками в отличии от Windows. На AutoIt3 часто для межпрограммной передачи данных люди давали примеры с использованием WM_COPYDATA, думаю чтобы передать текст это не вызовет задержки, разве что обсчёт дерева, но он же будет вызван до WM_COPYDATA, так что вполне можно это использовать. Наверно лучше создать память общую для обоих процессов, тогда ничего не надо передавать, просто взять указатель структуры и использовать его.

Погуглив пример с pipe, опять же mk-soft предлагает UDP в той же теме, говоря что это проще.

Отредактировано AZJIO (10.08.2022 00:02:48)

0

17

AZJIO написал(а):

mk-soft достаточно хорошо разбирается, у него много хороших разработок.

Не суть. Windows и linux системы НАСТОЛЬКО разные, что заниматься в подобной "кроссплатформенностью" сущий маразм. Может у mk-soft просто идефикс такая - добиться кросплатформменности любой ценой?

0

18

AZJIO написал(а):

думаю чтобы передать текст

Текст нормально передается через DragText(). Зачем для DragDrop использовать другие методы?

0

19

Пётр
Для автора придётся изучать json. Я как-то пытался в GoogleTranslator, пришлось напрячься. И надо сначала запаковать в json, потом распаковать, а если бы сделать общую память и использовать исходную структуру, то не надо было бы тратить время на изучение json и время на преобразования в программе.

Smitis
у меня много кроссплатформенных прог (16), не так уж и сложно делать один исходник, можно инклуды разные включать взависимости от ОС.

Отредактировано AZJIO (10.08.2022 22:16:33)

0

20

AZJIO написал(а):

можно инклуды разные включать взависимости от ОС

Разные способы под разные оси, возможно, с одинаковой обёрткой, это я понимаю. Это нормально. Но отказываться от таких способов ради худшего только лишь потому, что он (худший) доступен во всех осях (udp), имхо, это уже не нормально.

0

21

AZJIO написал(а):

Для автора придётся изучать json.

да что там изучать InsertJSONStructure переводишь структуру с данными в JSON
ExtractJSONStructure - потом обратно..

0

22

AZJIO написал(а):

И надо сначала запаковать в json, потом распаковать

Это не сложно

Код:
Structure Person
  FirstName$
  LastName$
  Age.l
  List Books.s()
EndStructure

Define P.Person,  x.Person, JsonData.s
P\FirstName$ = "John"
P\LastName$  = "Smith"
P\Age        = 42
AddElement(P\Books()) : P\Books() = "Investing For Dummies"
AddElement(P\Books()) : P\Books() = "English Grammar For Dummies"
AddElement(P\Books()) : P\Books() = "A Little Bit of Everything For Dummies"

Debug "Упаковка в JSON"+#CRLF$+#CRLF$

If CreateJSON(0)
  InsertJSONStructure(JSONValue(0), @P, Person)
  JsonData = ComposeJSON(0, #PB_JSON_PrettyPrint)
  FreeJSON(0)
EndIf

Debug JsonData
Debug #CRLF$+#CRLF$+"--------------"+#CRLF$+#CRLF$+"Распаковка из JSON"+#CRLF$+#CRLF$

If ParseJSON(0, JsonData)
  ExtractJSONStructure(JSONValue(0), x, Person)
  FreeJSON(0)
  Debug x\FirstName$
  Debug x\LastName$
  Debug x\Age
  ForEach x\Books()
    Debug x\Books()
  Next
EndIf
AZJIO написал(а):

а если бы сделать общую память и использовать исходную структуру

Нужно вручную переносить данные по указателям (строки, массивы, списки и т. д.) из структуры в память.

AZJIO написал(а):

то не надо было бы тратить время на изучение json и время на преобразования в программе.

Попробуйте данные из стрруктуры передать в другой процесс.

Код:
Structure Person
  FirstName$
  LastName$
  Age.l
  List Books.s()
EndStructure

Потребуется гораздо больше времени чем на json. Все данные по указателями придется поместить в одну общую память и как-то обозначить что и где. В конечном итоге получится что-то типа json, но возможно в бинарном формате.

0

23

Пётр
На сколько я понимаю копирование структуры выполняется с копированием всего содержимого. Но надо провести эксперимент с кодом рекурсивного сканирования файлов, там всего лишь скопировать в новую структуру и сделать вывод и посмотреть всё ли скопировалось.

0

24

balex1978 написал(а):

Короче у меня есть прога с деревом. И нужно перемещать данные например на другую аналогичную прогу. Например скопировать ветку. Но там не только название ветки, но ещё и куча данных которые висят в каждом итеме.

Прошу автора ветки пояснить -" другая аналогичная прога", тоже ваша? Вы можете управлять её кодом? Или это прога другого разработчика?

0

25

Webarion написал(а):

Прошу автора ветки пояснить -" другая аналогичная прога", тоже ваша? Вы можете управлять её кодом? Или это прога другого разработчика?

Точно такую копию запущенную.

Если у других аналогичный способ используется для передачи, тогда нужно четко знать как передача информации происходит и формат данных.

Но я говорю о прогах между своими версиями.

AZJIO написал(а):

balex1978
В своё время я делал захват TreeGadget в древовидный текст с помощью AutoIt3 используя рекурсивный перебор дерева, в программе CaptureText, там есть исходник (функция __TreeViewToText).

Это прога под Винду?
Ее там скачать можно я так понял

Smitis написал(а):

Что только люди не придумают, лишь бы только документацию не читать 

balex1978
То, что Вам нужно, называется "межпроцессорное взаимодействие".
https://ru.wikipedia.org/wiki/Межпроцес … модействие
https://www.rsdn.org/article/baseserv/ipc.xml
Я бы использовал именованные пайпы (каналы)

Это больше похоже как лесть в дебри непонятного и неизвестного.
В общем понятно что нужен канал связи

AZJIO написал(а):

mk-soft достаточно хорошо разбирается, у него много хороших разработок. Насколько я понял, так как mk-soft старается делать кроссплатформенный код, то поэтому и выбрал этот вариант. Недавно он предложил мне код для обновления гаджетов в Linux, так как там проблема с потоками в отличии от Windows. На AutoIt3 часто для межпрограммной передачи данных люди давали примеры с использованием WM_COPYDATA, думаю чтобы передать текст это не вызовет задержки, разве что обсчёт дерева, но он же будет вызван до WM_COPYDATA, так что вполне можно это использовать. Наверно лучше создать память общую для обоих процессов, тогда ничего не надо передавать, просто взять указатель структуры и использовать его.

Погуглив пример с pipe, опять же mk-soft предлагает UDP в той же теме, говоря что это проще.

Отредактировано AZJIO (10.08.2022 00:02:48)

Я не увидел тут кроссплатформенности...
ConnectNamedPipe_(hPipe, 0) это уже АПИ.

Ну и если бы мой блокнот был таким универсальным, тогда прийдется много чего выбросить. Оно просто на пурике не реализуется без апи никак

Вот столкнулся с таким перлом, после чего понимаю что некоторые реализации в пурике не будут доступны никогда.

Например при создании Итемов пурик создаёт списки адресов Итемов. Если сделать сортировку ветки на АПИ, то номера и адреса уже у пурика не совпадают :D .

Я ещё полагаю что и разноцветные перлы пурика , когда текст строк цветной также хитро мудро сделан. Например на АПИ для дерева разноцветных строк не вижу.

Или вот...
Подключил возможность бросать файл на блокнот, а тут нужно и гаджеты задействовать.
И как результат для дерева все нормально, а для редактора теперь нужно самому на АПИ обрабатывать перетаскивание текста по редактору... Это же абзац. Оно и так само реализовано без моего участия. Но подключение Драг Дроп блокирует такую работу. Ну и как тут кроссплатформенности соблюдать...
Я о ней даже не парюсь. Не спорю что нужная весчь

Smitis написал(а):

Не суть. Windows и linux системы НАСТОЛЬКО разные, что заниматься в подобной "кроссплатформенностью" сущий маразм. Может у mk-soft просто идефикс такая - добиться кросплатформменности любой ценой?

Зато универсал... :cool: .

Зато можно создать простой блокнот своими руцями с возможность сохранить мемуары напечатанными на нем.  ^^  :whistle:

Ну конечно работа с обработкой текста часто важна и не сложность реализации. Но скорость резко падает с ростом размеров текста.
:jumping:

AZJIO написал(а):

Пётр
Для автора придётся изучать json. Я как-то пытался в GoogleTranslator, пришлось напрячься. И надо сначала запаковать в json, потом распаковать, а если бы сделать общую память и использовать исходную структуру, то не надо было бы тратить время на изучение json и время на преобразования в программе.

Smitis
у меня много кроссплатформенных прог (16), не так уж и сложно делать один исходник, можно инклуды разные включать взависимости от ОС.

Отредактировано AZJIO (10.08.2022 22:16:33)

Пойду гляну кто такой Джейсон %-)  :tired:

Наверное с общаками проблемы :disappointed:

Пётр написал(а):

Текст нормально передается через DragText(). Зачем для DragDrop использовать другие методы?

Главное что я знаю как его пересылать

Мне брат предлагал даже передавать данные через порт ... Типа клиент сервер.
Ну  вполне можно и так. Пробовал передавать тексты пока что :rofl:

К стати брат решил немного покопать команду что описана в заголовке....
Прикинь, он единственный кто дал ответ как это работает....
Правда он передавал картинку по байтно, и искаженно, ну это мелочи.
Я сидел и не мог понять почему моя прога не фурычет. Оказалось парочки ошибок достаточно чтобы испортить все :O  :c :tired: razyfun:

Зато теперь я смог передать текст навароченым способом и принять пуриковской командой. Правда по справке там должен быть Анси, а в реалии в зависимости од того в какой кодировке запущена прога :dontknow:

Я смог расшифровать прием списка файлов.
А значит можно передавать списки файлов  :D

Так что если не забуду, кину сюда код для расплода в нете, как передавать через Драг и Дроп бинарные и любые данные

0

26

balex1978 написал(а):

В общем понятно что нужен канал связи

Он уже есть. Много раз писал как можно сделать.

balex1978 написал(а):

Подключил возможность бросать файл на блокнот

DragFiles() нормально "бросает" файлы в блокнот из PB проги.
Проверить можно на примере из справки.

Код:
If OpenWindow(1, 200, 200, 400, 400, "Drag & Drop", #PB_Window_SystemMenu)
  ExplorerListGadget(1, 10, 10, 380, 380, "*", #PB_Explorer_MultiSelect)
  
  Repeat
    Event = WaitWindowEvent()  
    
    If Event = #PB_Event_Gadget And EventGadget() = 1 And EventType() = #PB_EventType_DragStart
      Files$ = ""       
      For i = 0 To CountGadgetItems(1)-1
        If GetGadgetItemState(1, i) & #PB_Explorer_Selected
          Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
        EndIf
      Next i
      DragFiles(Files$)
    EndIf      
    
  Until Event = #PB_Event_CloseWindow
EndIf

0

27

Петр. Благодарю за помощь.

По поводу файлов и блокнота вы не поняли.
Я делаю древовидный блокнот. И когда я хочу открыть файл пользуясь простым перетаскиванием файла на своей блокнот, то тут возникает проблема.
Я подключаю функцию Дроп на окно. Но при этом гаджеты файл не принимают. И чтобы принимали нужно подключать функцию Дроп к гаджетам и обрабатывать полученный Линк. И если у большинства гаджетов нет проблем, к примеру у меня Дерево. То с Едит гаджетом возникает проблема, он не позволяет перемещать выделенный текст внутри этого гаджета. А без Дроп все отлично работает. Вот и говорю что нужно либо не использовать, либо делать вырезание и вставку текста на АПИ

0

28

balex1978 написал(а):

Я подключаю функцию Дроп на окно. Но при этом гаджеты файл не принимают. И чтобы принимали нужно подключать функцию Дроп к гаджетам и обрабатывать полученный Линк.

Не обязательно. В коде у ListViewGadget не включен DragDrop. Перетащите на него текст например из редактора PB.

Код:
Procedure DropCallback(TargetHandle, State, Format, Action, x, y)
  
  ProcedureReturn #True
EndProcedure

SetDropCallback(@DropCallback())

If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EnableWindowDrop(0, #PB_Drop_Text, #PB_Drag_Copy)
  ListViewGadget(0, 8, 8, 306, 133)
  For a = 0 To 5
    AddGadgetItem(0, a, "Line "+Str(a))
  Next
  Repeat 
    Event = WaitWindowEvent()
    If Event = #PB_Event_WindowDrop
      Debug "Window"
      Debug EventDropText()
    ElseIf Event = #PB_Event_GadgetDrop
      Debug EventGadget()
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

0

29

balex1978 написал(а):

По поводу файлов и блокнота вы не поняли.

А как понять, всё обтекаемо написаано, то нужно было одно дерево перекинуть в другое дерево, а теперь оказывается нужно файл в блокнот, из блокнота в деревой, списки файлов куда? В дерево? в блокнот? У меня есть готовые примеры бросание файлов в блокнот, возможно в дерево.

Если что, ранее я пользовался подобным древовидным блокнотом, посмотри, может понравится и будешь его использовать или из него почерпнёшь идеи. Только устанавливай не в "Program Files" так как он написан под WinXP и не сможет сохранять настройки в "Program Files", в отличии от других он не использует RTF, а простой текст. Имеет импорт/экспорт, имеет настройки цвета, то есть для меня практически идеален, создаёт бэкап при запуске. Я пользовался несколько лет, но сейчас я понял, что всё это можно писать в дереве файловой структуры, то есть проводник дерево, а в папках тестовые файлы и это гарантия что нет необходимости в программе, чтобы читать тексты. И при этом любой текстовый редактор на порядок имеет больше возможностей по работе с текстом. Тот же AkelPad, и имеет плаг, чтобы показать дерево файлов.

Отредактировано AZJIO (14.08.2022 00:53:50)

0

30

AZJIO написал(а):

А как понять, всё обтекаемо написаано, то нужно было одно дерево перекинуть в другое дерево, а теперь оказывается нужно файл в блокнот...

Согласен с AZJIO. По этой теме, просто ради интереса, экспериментировал с передачей структуры привязанной к Tree. Проще всего и кроссплатформенно, у меня получилось передавать преобразовав структуру в Json, даже вложенную неизвестное количество раз. Потом на всяк пожарный в Base64. А на приёмке - обратный процесс. Но это всё равно передача строки, хотя и с правильно скомпонованными данными, которые можно принять и распарсить в структуру, привязав в Tree в другом процессе. Но, почитал я эту переписку ребята и подумал: "у меня же блин дел более важных вагон и маленькая тележка", так и не доделал, остались баги. Чуть больше времени будет, выложу здесь передачу структуры, привязанную к Tree контролу, и приём её, в любом процессе. Хотя, к тому времени, возможно это уже будет не актуально.

Отредактировано Webarion (14.08.2022 02:47:25)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как можно передать мои данные используя Drag&Drop. Не текст.