Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2017, 21:13   #21
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
то на рутрекере вроде и последняя лежит
Не знаю, может быть и так. Просто сам использую 5.31, хватает. Видел я все эти новые версии, в основном примочки для 3D игрушек и векторной графики. Мне этого не надо.
kvitaliy вне форума Ответить с цитированием
Старый 16.02.2017, 20:11   #22
mawotimug
Пользователь
 
Регистрация: 14.02.2017
Сообщений: 16
По умолчанию

Цитата:
Сообщение от kvitaliy Посмотреть сообщение
Не знаю, может быть и так. Просто сам использую 5.31, хватает. Видел я все эти новые версии, в основном примочки для 3D игрушек и векторной графики. Мне этого не надо.
О варезе не подумал. Получается, в зависимости от задачи могу использовать PureBasic, Hiasm, Autoit.
mawotimug вне форума Ответить с цитированием
Старый 22.02.2017, 20:24   #23
mawotimug
Пользователь
 
Регистрация: 14.02.2017
Сообщений: 16
По умолчанию

Попробовал запрограммировалть первую задачу на PureBasic. Оказалось, что функция слежения за изменением буфера обмена не только отсутствует в PB, но из Windows API её непосредственно не вызовешь. Код приводить не буду, достаточно будет сказать, что он весьма напоминает С, представляет из себя прграммирование на низком уровне и занимает некоторое количество строк. Может быть, моя задача случайно попала на слабое место PB, не знаю. Но для данной конкретной задачи он не подходит. К сожалению.

Попытаюсь сделать на нескольких языках: Python, C#, F#, Hiasm. Кстати, последний справился с выводом буфера обмена элементарно.
mawotimug вне форума Ответить с цитированием
Старый 22.02.2017, 20:32   #24
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

F# вряд ли будет простым если нет опыта в функциональном программировании )
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 22.02.2017, 21:49   #25
mawotimug
Пользователь
 
Регистрация: 14.02.2017
Сообщений: 16
По умолчанию

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

Последний раз редактировалось mawotimug; 22.02.2017 в 22:17. Причина: дополнение
mawotimug вне форума Ответить с цитированием
Старый 23.02.2017, 08:23   #26
mawotimug
Пользователь
 
Регистрация: 14.02.2017
Сообщений: 16
По умолчанию

Закончил программу на Hiasm и стало очевидно, что сравнение языков программирования (или, точнее, способов проектирования ПО) для решения данной задачи за явным преимуществом выиграет Hiasm. Привожу схему:



Всё исключительно просто, чуть посложнее только функция "Перенос" из-за того, что нужно проверять, есть ли в конце дефис, и если есть, то удалять его:



А так выглядит интерфейс:


Последний раз редактировалось mawotimug; 23.02.2017 в 10:02. Причина: изменение: интерфейс
mawotimug вне форума Ответить с цитированием
Старый 23.02.2017, 11:57   #27
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от mawotimug Посмотреть сообщение
Попробовал запрограммировалть первую задачу на PureBasic. Оказалось, что функция слежения за изменением буфера обмена не только отсутствует в PB, но из Windows API её непосредственно не вызовешь. Код приводить не буду, достаточно будет сказать, что он весьма напоминает С, представляет из себя прграммирование на низком уровне и занимает некоторое количество строк. Может быть, моя задача случайно попала на слабое место PB, не знаю. Но для данной конкретной задачи он не подходит..
Странно это слышать от человека который узнал о Пурике 3 дня назад. Я не напрягаясь напишу вашу программу за 10 минут. Руками, без всяких конструкторов.
kvitaliy вне форума Ответить с цитированием
Старый 23.02.2017, 16:00   #28
mawotimug
Пользователь
 
Регистрация: 14.02.2017
Сообщений: 16
По умолчанию

Цитата:
Сообщение от kvitaliy Посмотреть сообщение
Странно это слышать от человека который узнал о Пурике 3 дня назад. Я не напрягаясь напишу вашу программу за 10 минут. Руками, без всяких конструкторов.
Это от того, что я расстроился. Перед тем как писать программу, прочитал книжку про PB, и он мне понравился.

Проблема с буфером обмена. Хотя... можно написать так же, как я сделал на Autoit: проверять в цикле, изменилось ли содержимое буфера. За 10 минут у меня точно не получится -- рука не набита. Но Вы меня вдохновили. Сейчас попробую сделать.
mawotimug вне форума Ответить с цитированием
Старый 23.02.2017, 16:54   #29
mawotimug
Пользователь
 
Регистрация: 14.02.2017
Сообщений: 16
По умолчанию

Получилось так:

Код:
; ========= Переменные и константы =========

Event.l = 0 ; Хранит события ОС
sClip1.s = GetClipboardText()
sClip2.s = ""

Enumeration
  #WIN_MAIN
  #BUTTON_STRIP
  #BUTTON_DEJAT
  #BUTTON_PEREN
  #BUTTON_PEREN2
  #BUTTON_DERAZ
  #TEXT
EndEnumeration

; флаги главного окна
#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

; ========= Объявления процедур =========

Declare SelectEventGadget()
Declare Strip()
Declare Dejat()
Declare Peren()
Declare Peren2()
Declare Deraz()

; ========= Рисуем интерфейс =========
  
;координаты окна = 0, так как окно центрируется флагом
OpenWindow(#WIN_MAIN, 0, 0, 200, 180, "wsutils", #FLAGS)

ButtonGadget(#BUTTON_STRIP,  20,  10,  70,  25, "Стрип")
ButtonGadget(#BUTTON_DEJAT,  110, 10,  70,  25, "ВАР")
ButtonGadget(#BUTTON_PEREN,  20,  50,  70,  25, "Перенос")
ButtonGadget(#BUTTON_PEREN2, 110, 50,  70,  25, "Перенос2")
ButtonGadget(#BUTTON_DERAZ,  50,  90,  70,  25, "Деразрядка")
TextGadget(#TEXT,            20,  130, 160, 25, sClip1)

SetWindowPos_(#WIN_MAIN,#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)

; ========= Ждём действий =========

Repeat
  Event = WindowEvent()
  If Event = #PB_Event_Gadget
      SelectEventGadget()
  EndIf
  sClip2 = GetClipboardText()
  If sClip1 <> sClip2
      sClip1 = sClip2
      SetGadgetText(#TEXT, sClip2)
  EndIf
  Delay(10)
Until Event = #PB_Event_CloseWindow

End

; ==================================

; действия по нажатию кнопок
Procedure SelectEventGadget()
  Select EventGadget()
    Case #BUTTON_STRIP
      Strip()
    Case #BUTTON_DEJAT
      Dejat()
    Case #BUTTON_PEREN
      Peren()
    Case #BUTTON_PEREN2
      Peren2()
    Case #BUTTON_DERAZ
      Deraz()    
  EndSelect
EndProcedure

; Чистим текст
Procedure Strip()
  MessageRequester("STRIP", "STRIP", #PB_MessageRequester_Ok)
EndProcedure

; шаблон ВАР и деятификация
Procedure Dejat()
  MessageRequester("DEJAT", "DEJAT", #PB_MessageRequester_Ok)
EndProcedure

; шаблон Перенос
Procedure Peren()
  MessageRequester("peren", "PERENOS", #PB_MessageRequester_Ok)
EndProcedure

; шаблон Перенос2
Procedure Peren2()
  MessageRequester("peren2", "PERENOS2", #PB_MessageRequester_Ok)
EndProcedure

; убираем разрядку выделенного текста
Procedure Deraz()
  MessageRequester("deraz", "DERAZ", #PB_MessageRequester_Ok)
EndProcedure
Почему-то не работает вызов функции API SetWindowPos. Что делаю не так?
mawotimug вне форума Ответить с цитированием
Старый 23.02.2017, 17:20   #30
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от mawotimug Посмотреть сообщение
функции API SetWindowPos. Что делаю не так?
У вас номер окна Пурика, а надо его HWND, это WindowID
Код:
SetWindowPos_(WindowID(#WIN_MAIN),#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
Но есть в Пурике "Всегда сверху" это StickyWindow(#WIN_MAIN,1)

Вот так правильно следить за изменениями буфера обмена (без проверок в цикле!)
Код:
#WM_CLIPBOARDUPDATE     =         $031D

Declare Winproc(hwnd, msg, wParam, lParam)

OpenLibrary(0, "user32.dll")
Prototype AddClipboardFormatListener(hwnd)
Global AddClipboardFormatListener_.AddClipboardFormatListener = GetFunction(0, "AddClipboardFormatListener")

OpenWindow(0,0,0,320,240,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ListViewGadget(0,10,10,200,200)
SetWindowCallback(@WinProc())
StickyWindow(0,1)
AddClipboardFormatListener_(WindowID(0))

Repeat
  EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow

CloseLibrary(0)

;---------------------------------------------
;        End of Main Loop Code
;---------------------------------------------

Procedure WinProc(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_CLIPBOARDUPDATE
     AddGadgetItem(0, -1, "Clipboard updated!")
  EndSelect
  ProcedureReturn result
EndProcedure
Удачи!

Последний раз редактировалось kvitaliy; 23.02.2017 в 17:23.
kvitaliy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Язык программирования С++. "Оконное приложение «Калькулятор»" emin1993 Помощь студентам 2 14.04.2012 23:35