Спасибо Петр! Вот и проблемы все ушли
Вопросы новичка
Сообщений 541 страница 570 из 1000
Поделиться54228.07.2010 17:26:21
Такой вопрос. Есть OpenSubMenu. Мне нужно сделать так, что бы в этом меню можно было бы отмечать только один из всех пунктов. Отметка делается так:
SetMenuItemState(#MenuBar_0,#MENU_5,1)
Но я не знаю как сделать именно один пункт. То есть при отметки другого первая отметка снимается, а вторая появляется и тп...
Поделиться54328.07.2010 18:05:52
Нужно пройтись циклом по всем пунктам меню, на котрых может быть отметка.
Прмерно так
If OpenWindow(0, 200, 200, 220, 100, "SubMenu Example") If CreateMenu(0, WindowID(0)) MenuTitle("Project") MenuItem(1, "Open") MenuItem(2, "Close") MenuBar() OpenSubMenu("Recent files") ; begin sub-menu MenuItem( 3, "C:\Autoexec.bat") MenuItem( 4, "D:\Test.txt") : SetMenuItemState(0,4,1) MenuItem( 5, "E:\2.txt") MenuItem( 6, "C:\1234.txt") CloseSubMenu() ; end sub-menu EndIf Repeat Event=WaitWindowEvent() Menu=EventMenu() If Event=#PB_Event_Menu Select Menu Case 1 Case 2 Case 3 To 6 For i=3 To 6 If i=Menu ; По этому пункту кликнули SetMenuItemState(0,i,1) Else SetMenuItemState(0,i,0) EndIf Next i EndSelect EndIf Until Event=#PB_Event_CloseWindow EndIf
Поделиться54428.07.2010 19:01:02
а если имена пунктов - это константы, то тут же цикл не поможет? Тогда как будет
Поделиться54528.07.2010 19:07:41
Если константы следуют друг за другом, что можно использовать цикл
Поделиться54628.07.2010 19:17:23
Все получилось
Поделиться54728.07.2010 19:31:36
А как узнать какой пункт меню выделен, если их много?
Добавил:почему то так не получается:
For i=#MENU_8 To #MENU_14 If GetMenuItemState(#MenuBar_0,i) = 1 PrefWin\galka_styl=i EndIf Next i
Отредактировано daiomik (28.07.2010 19:52:58)
Поделиться54828.07.2010 20:12:57
Что не получается?
Код правильный.
Я бы ещё после строки PrefWin\galka_styl=i добавил бы оператор Break, ведь когда нашли отмеченый пункт, уже нет смысла проверять остальные пункты меню.
Поделиться54928.07.2010 20:32:13
Петр, я совсем запутался. У меня есть список пунктов меню (стилей твоей библиотеки). Я сохраняю активный пункт в ini и при открытии файла все прекрасно работает. НО как мне автоматически выставить нужный мне стиль, если галка на том пункте уже стоит. Надеюсь понятно
Вот:
If OpenPreferences("inform.ini") PreferenceGroup("basic") PrefWin\galka_avtoz=ReadPreferenceLong("-1", 0) SetMenuItemState(#MenuBar_0,#MENU_5,PrefWin\galka_avtoz) PrefWin\galka_styl=ReadPreferenceLong("-2", 0) SetMenuItemState(#MenuBar_0,PrefWin\galka_styl,PrefWin\galka_styl) For i=#MENU_8 To #MENU_14 If GetMenuItemState(#MenuBar_0,i) = 1 nomer=i Break EndIf Next i тут нужен код, который бы менял стиль, в зависимости от того какой пункт щас автивен ClosePreferences()
Отредактировано daiomik (28.07.2010 20:37:40)
Поделиться55028.07.2010 20:39:36
Попробуй так
For i=#MENU_8 To #MENU_14 If GetMenuItemState(#MenuBar_0,i) = 1 PrefWin\galka_styl=i - #MENU_8 Break EndIf Next i
А при запуске программы, отмечай активный пункт так
For i=#MENU_8 To #MENU_14 If PrefWin\galka_styl+#MENU_8 = i SetMenuItemState(#MenuBar_0,i,1) Else SetMenuItemState(#MenuBar_0,i,0) EndIf Next i
Поделиться55128.07.2010 20:42:12
Вот:
Зачем после загрузки настроек из файла, проверять где галочка в меню?
Поделиться55228.07.2010 20:45:53
Зачем после загрузки настроек из файла, проверять где галочка в меню?
по неопытности)
Попробуй так
все ок. Кстати, зачем нужно было отнимать и складывать? Только теперь нужно дописать код, который бы менял стиль в зависимости от того какой пункт выбран. То есть нужно написать:
XP_SetMenuStyle([color=lime]стиль, в зависимости от выбранного пункта[/color]) XP_EnableDrawTitleBar(WindowID(#Window_0), 1)
Отредактировано daiomik (28.07.2010 20:47:17)
Поделиться55328.07.2010 20:54:36
Кстати, зачем нужно было отнимать и складывать?
Потому что номер стиля может быть в пределах 0 - 6, а идентификаторы пунктов меню, скорее всего имеют другие значения.
Только теперь нужно дописать код, который бы менял стиль в зависимости от того какой пункт выбран. То есть нужно написать
Да
Поделиться55428.07.2010 21:07:53
Да
А как определить стиль, в зависимости от выбранного пункта???Снова (в третий раз) условие придется писать? Или как то подкорректировать данное условие:
For i=#MENU_8 To #MENU_14 If PrefWin\galka_styl+#MENU_8 = i SetMenuItemState(#MenuBar_0,i,1) Else SetMenuItemState(#MenuBar_0,i,0) EndIf Next i If menu=#MENU_8 XP_SetMenuStyle(#XP_StyleNormal) XP_EnableDrawTitleBar(WindowID(#Window_0), 1) ElseIf menu=#MENU_9 XP_SetMenuStyle(#XP_StyleXP) XP_EnableDrawTitleBar(WindowID(#Window_0), 1) ElseIf menu=#MENU_10 XP_SetMenuStyle(#XP_Style2003) XP_EnableDrawTitleBar(WindowID(#Window_0), 1) ElseIf menu=#MENU_11 XP_SetMenuStyle(#XP_StyleViolet) XP_EnableDrawTitleBar(WindowID(#Window_0), 1) ElseIf menu=#MENU_12 XP_SetMenuStyle(#XP_StyleBlack) XP_EnableDrawTitleBar(WindowID(#Window_0), 1) ElseIf menu=#MENU_13 XP_SetMenuStyle(#XP_StyleGray) XP_EnableDrawTitleBar(WindowID(#Window_0), 1) ElseIf menu=#MENU_14 XP_SetMenuStyle(#XP_StyleGreen) XP_EnableDrawTitleBar(WindowID(#Window_0), 1) EndIf
Поделиться55528.07.2010 21:40:54
А как определить стиль, в зависимости от выбранного пункта???Снова (в третий раз) условие придется писать?
Нет.
Выше я ведь писал для чего мы прибавляем и отнимаем числа.
Это позволит задать стиль без условий, вот так
XP_SetMenuStyle(PrefWin\galka_styl) XP_EnableDrawTitleBar(WindowID(#Window_0), 1)
Если всё правильно сделано, то должно работать.
Поделиться55628.07.2010 21:55:20
то должно работать.
ты как всегда прав!
Поделиться55730.07.2010 20:43:46
Что бы написать программу по созданию тестов обязательно нужно в ней делать свой компилятор? Ведь созданный тест представляет из себя exe, следовательно для его создания нужен компилятор. Или я ошибаюсь? Тогда как во всех программах по созданию тестов все это происходит?
Поделиться55830.07.2010 21:25:23
Вопросы и результаты ответов можно хранить в архиве в конце исполняемого файла (уже проходили) или записывать в ресурсы программы. Ну в крайнем случае, держать в виде отдельного файла.
Так что есь способы обойтись без перекомпиляции программы.
Поделиться55930.07.2010 22:09:56
Видимо я неправильно объяснил. Существуют программы по созданию тестов...Так вот, заходишь в них и жмешь Создать новый тест: пишешь вопросы и даешь ответы и тд...потом в конце как все сделаешь жмешь, например, Создать и программа создает exe файл твоего теста. Вот вопрос в том как создать такой exe ПРОГРАММНО
Поделиться56030.07.2010 22:52:10
Если тест не сложный, без всяких там наворотов, просто окно с вопросом и несколькими вариантами ответов, то можно поступить так же как и при создани самораспаковывающегося архива.
Создаём программу, которая будет тестом. Она читает вопросы и ответы из себя же (ресурсы или закодированый спец файл, записаный в конец исполняемого файла).
Другая программа, просто записывает ей в ресурсы или в конец исполняемого файла, вопросы с вариантами ответа.
PS.
Дай ссылку на одну из прог, создающих тесты.
Поделиться56131.07.2010 11:41:41
Если тест не сложный
а если сложный)) Вообщем понятно, что для таких целей всеравно компилятор нужен..
PS.Дай ссылку на одну из прог, создающих тесты.
Не помню название той программы, но суть одна: компилятор там свой 100%. Кстати если слышал о Multimedia Builder, то как там вообще устроена компиляция..Размеры exe тоже большие но там не требуется net фреймворк..
Поделиться56231.07.2010 12:37:53
Кстати если слышал о Multimedia Builder, то как там вообще устроена компиляция..Размеры exe тоже большие но там не требуется net фреймворк..
Если я не совру, там вроде как дельфийский компилятор. Его можно и фриварный найти. Даже если эта прога на С++ тоже есть фриварные компиляторы.
Поделиться56331.07.2010 21:16:01
Есть процедура в которой прописано создание окна. Задача такая: как узнать открыта ли окно из данной процедуры. То есть мне нужно: если окно открыто, то ..., если нет...В справке не нашел подобного
Поделиться56431.07.2010 21:33:06
Нужно проверить существует ли окно с определённым идентификатором?
Используй функцию IsWindow
Поделиться56531.07.2010 21:37:32
Спасибо
Поделиться56631.07.2010 21:49:59
У меня есть 3 окна: главное, второе(поменьше) и третее (самое маленькое). На главном я жму кнопку, у меня открывается второе при этом главное блокируется (DisableWindow). На втором проделываю туже операцию с учетом того что блокируется второе. В итоге: 2 заблокированных окна и третее (самое маленькое) рабочее. Вопрос: когда я при этом нажму на окошко внизу на панели задач, то вся эта структура пропадает (меняет фокус) и маленьких окошек становится не видно. Как же запретить данное действие и что бы при нажатии ничего не происходило
Поделиться56731.07.2010 22:08:48
То есть на панели задач есть кнопки для всех этих окон?
Привязывай дочернее окно, к окну-родителю.
Для этого, используй 8 аргумент функции OpenWindow. Там нужно указать идентификатор ParentWindowID.
Его можно получить с помощью функции WindowID.
Поделиться56831.07.2010 22:19:50
То есть на панели задач есть кнопки для всех этих окон?
нет..разве есть смысл загрязнять панель тремя кнопками???
Вот о то, о чем я говорю. Доберись до последнего окна и нажми на кнопку панели задач..последние 2 окна при этом исчезнут..Мне же нужно, что бы этого не происходило:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code) ;- Window Constants ; Enumeration #Window_0 #Window_1 #Window_2 EndEnumeration ;- Gadget Constants ; Enumeration #Button_0 #Button_1 EndEnumeration Procedure Open_Window_0() If OpenWindow(#Window_0, 271, 65, 762, 539, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) If CreateGadgetList(WindowID(#Window_0)) ButtonGadget(#Button_0, 560, 30, 165, 25, "Открыть второе окно") EndIf EndIf EndProcedure Procedure Open_Window_1() If OpenWindow(#Window_1, 339, 172, 639, 360, "New window ( 1 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_Tool ) If CreateGadgetList(WindowID(#Window_1)) ButtonGadget(#Button_1, 455, 20, 165, 25, "Открыть третее окно") EndIf EndIf EndProcedure Procedure Open_Window_2() If OpenWindow(#Window_2, 529, 287, 257, 120, "New window ( 2 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_Tool ) If CreateGadgetList(WindowID(#Window_2)) EndIf EndIf EndProcedure Open_Window_0() Repeat event=WaitWindowEvent() gadget=EventGadget() If event=#PB_Event_Gadget Select gadget Case #Button_0 DisableWindow(#Window_0,1) Open_Window_1() Case #Button_1 DisableWindow(#Window_1,1) Open_Window_2() EndSelect EndIf Until event=#PB_Event_CloseWindow
Привязывай дочернее окно, к окну-родителю.
то есть это нужно сделать, что бы избежать данной проблемы?
Поделиться56931.07.2010 22:23:56
Получилось!!Сделал как ты сказал!
Вот пример, может кому пригодится:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code) ;- Window Constants ; Enumeration #Window_0 #Window_1 #Window_2 EndEnumeration ;- Gadget Constants ; Enumeration #Button_0 #Button_1 EndEnumeration Procedure Open_Window_0() If OpenWindow(#Window_0, 271, 65, 762, 539, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) If CreateGadgetList(WindowID(#Window_0)) ButtonGadget(#Button_0, 560, 30, 165, 25, "Открыть второе окно") EndIf EndIf EndProcedure Procedure Open_Window_1() If OpenWindow(#Window_1, 339, 172, 639, 360, "New window ( 1 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_Tool,WindowID(#Window_0)) If CreateGadgetList(WindowID(#Window_1)) ButtonGadget(#Button_1, 455, 20, 165, 25, "Открыть третее окно") EndIf EndIf EndProcedure Procedure Open_Window_2() If OpenWindow(#Window_2, 529, 287, 257, 120, "New window ( 2 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_Tool,WindowID(#Window_1) ) If CreateGadgetList(WindowID(#Window_2)) EndIf EndIf EndProcedure Open_Window_0() Repeat event=WaitWindowEvent() gadget=EventGadget() If event=#PB_Event_Gadget Select gadget Case #Button_0 DisableWindow(#Window_0,1) Open_Window_1() Case #Button_1 DisableWindow(#Window_1,1) Open_Window_2() EndSelect EndIf Until event=#PB_Event_CloseWindow
Отредактировано daiomik (31.07.2010 22:25:23)
Поделиться57005.08.2010 21:47:06
Не пойму почему только один раз мидишку проигрывает Петр может подскажешь, что не так?
If OpenWindow(0, 100, 100, 100, 100, "Beispiel: MP3 Abspielen", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) ButtonGadget(11,20,20,20,20,"") Buffer$=Space(128) Repeat EventID.l = WaitWindowEvent() If EventID = #PB_Event_CloseWindow ; If the user has pressed on the close button mciSendString_("CLOSE MIDI",0,0,0) Quit = 1 EndIf If EventID=#PB_Event_Gadget If EventGadget()=11 mciSendString_("OPEN guitar_sample.mid TYPE SEQUENCER ALIAS MIDI",Buffer$,128,0) mciSendString_("PLAY MIDI",0,0,0) EndIf EndIf Until Quit = 1 EndIf
Похожие темы
Вопросы новичка (продолжение…) | Вопросы по PureBasic | 29.06.2024 |
Скорее, это теоретический вопрос о правах в директории. | OffTop | 16.09.2022 |
Вопрос по отладке | Вопросы по PureBasic | 26.01.2017 |
Три вопроса по созданию браузера. | Вопросы по PureBasic | 01.11.2010 |
вопрос о точности типов данных | Вопросы по PureBasic | 20.05.2021 |