PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка


Вопросы новичка

Сообщений 541 страница 570 из 1000

541

Спасибо Петр! Вот и проблемы все ушли :cool:

0

542

Такой вопрос. Есть OpenSubMenu. Мне нужно сделать так, что бы в этом меню можно было бы отмечать только один из всех пунктов. Отметка делается так:
SetMenuItemState(#MenuBar_0,#MENU_5,1)
Но я не знаю как сделать именно один пункт. То есть при отметки другого первая отметка снимается, а вторая появляется и тп...

0

543

Нужно пройтись циклом по всем пунктам меню, на котрых может быть отметка.
Прмерно так

Код:
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

0

544

а если имена пунктов - это константы, то тут же цикл не поможет? Тогда как будет

0

545

Если константы следуют друг за другом, что можно использовать цикл

0

546

Все получилось

0

547

А как узнать какой пункт меню выделен, если их много?
Добавил:почему то так не получается:

Код:
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)

0

548

Что не получается?
Код правильный.

Я бы ещё после строки PrefWin\galka_styl=i добавил бы оператор Break, ведь когда нашли отмеченый пункт, уже нет смысла проверять остальные пункты меню.

0

549

Петр, я совсем запутался. У меня есть список пунктов меню (стилей твоей библиотеки). Я сохраняю активный пункт в 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)

0

550

Попробуй так

Код:
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

0

551

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

Вот:

Зачем после загрузки настроек из файла, проверять где галочка в меню?

0

552

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

Зачем после загрузки настроек из файла, проверять где галочка в меню?

по неопытности)

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

Попробуй так

все ок. Кстати, зачем нужно было отнимать и складывать? Только теперь нужно дописать код, который бы менял стиль в зависимости от того какой пункт выбран. То есть нужно написать:

Код:
XP_SetMenuStyle([color=lime]стиль, в зависимости от выбранного пункта[/color])
XP_EnableDrawTitleBar(WindowID(#Window_0), 1)

Отредактировано daiomik (28.07.2010 20:47:17)

0

553

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

Кстати, зачем нужно было отнимать и складывать?

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

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

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

Да

0

554

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

Да

А как определить стиль, в зависимости от выбранного пункта???Снова (в третий раз) условие придется писать? Или как то подкорректировать данное условие:

Код:
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

0

555

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

А как определить стиль, в зависимости от выбранного пункта???Снова (в третий раз) условие придется писать?

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

Код:
XP_SetMenuStyle(PrefWin\galka_styl)
XP_EnableDrawTitleBar(WindowID(#Window_0), 1)

Если всё правильно сделано, то должно работать.

0

556

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

то должно работать.

ты как всегда прав! :jumping:

0

557

Что бы написать программу по созданию тестов обязательно нужно в ней делать свой компилятор? Ведь созданный тест представляет из себя exe, следовательно для его создания нужен компилятор. Или я ошибаюсь? Тогда как во всех программах по созданию тестов все это происходит?

0

558

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

0

559

Видимо я неправильно объяснил. Существуют программы по созданию тестов...Так вот, заходишь в них и жмешь Создать новый тест: пишешь вопросы и даешь ответы и тд...потом в конце как все сделаешь жмешь, например, Создать и программа создает exe файл твоего теста. Вот вопрос в том как создать такой exe ПРОГРАММНО

0

560

Если тест не сложный, без всяких там наворотов, просто окно с вопросом и несколькими вариантами ответов, то можно поступить так же как и при создани самораспаковывающегося архива.
Создаём программу, которая будет тестом. Она читает вопросы и ответы из себя же (ресурсы или закодированый спец файл, записаный в конец исполняемого файла).
Другая программа, просто записывает ей в ресурсы или в конец исполняемого файла, вопросы с вариантами ответа.

PS.
Дай ссылку на одну из прог, создающих тесты.

0

561

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

Если тест не сложный

а если сложный)) Вообщем понятно, что для таких целей всеравно компилятор нужен..

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

PS.Дай ссылку на одну из прог, создающих тесты.

Не помню название той программы, но суть одна: компилятор там свой 100%. Кстати если слышал о Multimedia Builder, то как там вообще устроена компиляция..Размеры exe тоже большие но там не требуется net фреймворк..

0

562

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

Кстати если слышал о Multimedia Builder, то как там вообще устроена компиляция..Размеры exe тоже большие но там не требуется net фреймворк..

Если я не совру, там вроде как дельфийский компилятор. Его можно и фриварный найти. Даже если эта прога на С++ тоже есть фриварные компиляторы.

0

563

Есть процедура в которой прописано создание окна. Задача такая: как узнать открыта ли окно из данной процедуры. То есть мне нужно: если окно открыто, то ..., если нет...В справке не нашел подобного

0

564

Нужно проверить существует ли окно с определённым идентификатором?
Используй функцию IsWindow

0

565

Спасибо

0

566

У меня есть 3 окна: главное, второе(поменьше) и третее (самое маленькое). На главном я жму кнопку, у меня открывается второе при этом главное блокируется (DisableWindow). На втором проделываю туже операцию с учетом того что блокируется второе. В итоге: 2 заблокированных окна и третее (самое маленькое) рабочее. Вопрос: когда я при этом нажму на окошко внизу на панели задач, то вся эта структура пропадает (меняет фокус) и маленьких окошек становится не видно. Как же запретить данное действие и что бы при нажатии ничего не происходило

0

567

То есть на панели задач есть кнопки для всех этих окон?
Привязывай дочернее окно, к окну-родителю.
Для этого, используй 8 аргумент функции OpenWindow. Там нужно указать идентификатор ParentWindowID.
Его можно получить с помощью функции WindowID.

0

568

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

То есть на панели задач есть кнопки для всех этих окон?

нет..разве есть смысл загрязнять панель тремя кнопками???
Вот о то, о чем я говорю. Доберись до последнего окна и нажми на кнопку панели задач..последние 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
Пётр написал(а):

Привязывай дочернее окно, к окну-родителю.

то есть это нужно сделать, что бы избежать данной проблемы?

0

569

Получилось!!Сделал как ты сказал!
Вот пример, может кому пригодится:

Код:
; 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)

0

570

Не пойму почему только один раз мидишку проигрывает  %-)  Петр может подскажешь, что не так?

Код:
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

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка