PureBasic - форум

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

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


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


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

Сообщений 451 страница 480 из 1000

451

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

Пришлось использовать хакерские методы

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

0

452

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

Не очень понятно содержание сие кода.

Если в двух словах, то этот код перехватывает и блокирует нажатия и отпускания правой кнопки мышки в WebGadget'е.
WebGadget даже не "подозревает" что по нему кликнули правой кнопкой мышки, т. к. до него эти сообщения ОС не доходят.
Собственно перехват осуществляется в процедуре Web_WndProc
Процедура enumChildren нужна для поиска окна IE, имеющего класс Internet Explorer_Server  установки перехвата на хендл IE.
Причём поиск нужно начинать не сразу, а через некоторое время (2 секунды вполне достаточно), а иначе, мы получим не текущий хендл IE.

0

453

Я на 100% доверяю тебе Петр, но спрошу,  если я даже поставлю данную фичу в свою прогу, она точно заработает и не даст ошибок в критический (незапланированный) момент? И будет ли данная техника влиять как то на скорость работы программы?

0

454

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

если я даже поставлю данную фичу в свою прогу, она точно заработает и не даст ошибок в критический (незапланированный) момент

Если в винде не будет косяков, то всё должно работать нормально. :)
На скрость работы проги это почти не повлияет, по крайней мере, не будет заметно даже на слабых компах.
Если интересно,  поиск дочерних окон с помощью API функции EnumChildWindows (она вызывает процедуру enumChildren) обсуждался здесь http://purebasic.info/phpBB2/viewtopic. … t=30#16828

Перехват сообщений винды для гаджета, обсуждался здесь http://purebasic.info/phpBB2/viewtopic.php?t=797

0

455

Спасибо, значит бояться нечего. Меня интересует такой вопрос: я создал txt файлы и назначил им свой формат (mf). Как мне всем этим файлам с данным форматом прикрепить свою иконку программы? И что бы они не отображались как txt иконки?

0

456

Прошу прощения что так много вопросов, просто что то замордовал меня этот браузер. Посмотрите что не так делаю. Мне нужно по клику записи списка открывать (загружать в браузер) определенный файл - тот, по имени которого я кликнул. Делаю следующее:

Код:
Case #Listview_5
   If EventType()=#PB_EventType_LeftClick 
    WebOpen()
   EndIf

где WebOpen() это:

Код:
Procedure WebOpen();процедура загрузки в браузер
zap.s=GetGadgetText(#ListIcon_5)
SetGadgetText(#Web_1,"file://"+GetPathPart(ProgramFilename())+"data\help\muscules\"+zap+".mht")
EndProcedure

0

457

после SetGadgetText(#Web_1,"file://"+GetPathPart(ProgramFilename())+"data\help\muscules\"+zap+".mht")

надо перезагрузить браузер

SetGadgetState(#Web_1, #PB_Web_Refresh)

Отредактировано mirashic (02.05.2010 22:55:47)

0

458

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

Как мне всем этим файлам с данным форматом прикрепить свою иконку программы?

В библиотеке Droopy Library есть функция AssociateFile, которая ассоциирует расширение файла с программой.
Вот с её помощью можно установить желаемую иконку для требуемого расширения файла.

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

Делаю следующее:

А что при этом происходит?
Вставь в конец процедуры эту строку и посмотри правильно ли генерируется путь к файлу.

Код:
Debug GetPathPart(ProgramFilename())+"data\help\muscules\"+zap+".mht"

0

459

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

надо перезагрузить браузер

очень хорошее замечание. Учту

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

Вставь в конец процедуры эту строку и посмотри правильно ли генерируется путь к файлу.

при проверки выяснил, что не появляется окно отладчика, видимо на данное событие и действие вообще не реагирует. Странно

0

460

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

что не появляется окно отладчика

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

0

461

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

Отладчик включён?

Включен. Ставлю F9 на начало (первую строчку)процедуры и ничего. Видимо она вообще не открывается. Странно. Может событие не правильно прописал для ListIconGadget?
PS: проблема решилось сама. Ругаем невнимательность))

Отредактировано daiomik (03.05.2010 13:18:46)

0

462

Привет !
Вопрос по потокам...
В процедуру можно передать только один параметр и то число ?
А как передать строку ?
Можно объявить их глобальными и тогда получается, а если не объявлять ?

Код:
Enumeration 
#Window_0     
#but  
EndEnumeration

;Global  URL.s

Procedure LSDH(*x)
 Debug *x
 Debug URL.s
EndProcedure 

OpenWindow (#Window_0,0,0,380,200,"Окно",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) 
   ButtonGadget(#but, 15, 70,90, 20,"Загрузить") 

Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget() 
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             Case #but
             If IsThread(ThreadID)= 0
              URL.s= "http://195.5.125.6:8000/"
              ThreadID=CreateThread(@LSDH(), 23)      
             Else
               MessageRequester("", "Программа занята!", #MB_OK|#MB_ICONWARNING)
             EndIf
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEver

Отредактировано mirashic (03.05.2010 21:34:53)

0

463

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

В процедуру можно передать только один параметр и то число ?

Подумай что будет если передать не просто число, а указатель на что-либо, скажем на строку или на структуру (так можно передать сразу несколько параметров)?
В итоге получим желаемый результат. :)

Код:
Enumeration 
#Window_0     
#but  
EndEnumeration

;Global  URL.s

Procedure LSDH(*x)
 Debug PeekS(*x)
EndProcedure 

OpenWindow (#Window_0,0,0,380,200,"Окно",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) 
   ButtonGadget(#but, 15, 70,90, 20,"Загрузить") 

Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget() 
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             Case #but
             If IsThread(ThreadID)= 0
              URL.s= "http://195.5.125.6:8000/"
              ThreadID=CreateThread(@LSDH(), @URL)      
             Else
               MessageRequester("", "Программа занята!", #MB_OK|#MB_ICONWARNING)
             EndIf
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEver

0

464

!!! Спасибо.

Объявить много разных параметров - глобальными, для меня понятней.
На что это влияет, это плохо ?

Отредактировано mirashic (03.05.2010 21:57:48)

0

465

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

На что это влияет, это плохо ?

Ну я бы не сказал бы.
С указателями часто работаю и глюков как правило нет.
Про указатели можно прочитать здесь http://pure-basic.narod.ru/docs/point.html

0

466

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

Повесил "поток" на три кнопки с разным кодом,  Всё работает.
Потом для уменьшения строк кода, решил вынести код "потока" в отдельную процедуру,
и получается при быстром нажатии на разные кнопки вызываются несколько одновременно работающих  процедур...
Отказался от сокращения строк кода...

Не знаю понятна ли мысль...

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

0

467

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

Объявить много разных параметров - глобальными, для меня понятней.На что это влияет, это плохо ?

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

0

468

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

Получается одну и туже процедуру можно вызывать одновременно несколько раз

Да.
Причём процедура может вызывать саму себя и всё будет нормально работать.

Вот прмер вызова процедуры и неё же.

Код:
Global v=0 

Procedure x(Directory$) 
If Right(Directory$,1)<>"\":Directory$ + "\":EndIf 
   z=ExamineDirectory(#PB_Any, Directory$, "*.*")  
   v=v+1 
   If v>1000 ; Это чтобы не сканировать весь диск - долго очень 
    End 
   EndIf 
  If z 
    While NextDirectoryEntry(z) 
     EntryName.s=DirectoryEntryName(z) 
      
      If EntryName = "." Or EntryName = ".." 
       Continue 
      EndIf 
      
      
      If DirectoryEntryType(z) = #PB_DirectoryEntry_Directory 
        x(Directory$+EntryName)  ; Процедура вызывает сама себя **************************
      EndIf 
      
      Debug Directory$+"    "+DirectoryEntryName(z) 
    Wend 
    FinishDirectory(z) 
  EndIf 
EndProcedure 

x("C:\")

0

469

Подскажите как в данной программе ПРАВИЛЬНО и грамотно отразить содержание папок в ListIconGadget. Суть такая: пользователь кликает 2 раза по ExplorerTreeGadget, а в ListIconGadget отображаются папки вложенные внутрь каталога ExplorerTreeGadget по которому кликнули.(сам еле понял что сказал  :blush: )
Я так понял данную задачу нужно осуществить с помощью функций каталогов, то есть сначала узнать содержание и количество котологов, находящихся внутри папки по которой кликнули. Затем с помощью цикла и команды AddGadgetItem() добавлять строки в ListIconGadget.
PS. код забыл прикрепить)

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
EndEnumeration

;- Gadget Constants
;
Enumeration
  #ExplorerTree_0
  #ListIcon_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 263, 81, 409, 284, "Papki",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "О программе")
      MenuBar()
      MenuItem(#MENU_2, "Выход")
    EndIf
    If CreateGadgetList(WindowID(#Window_0))
      ExplorerTreeGadget(#ExplorerTree_0, 5, 5, 190, 255, "")
      ListIconGadget(#ListIcon_0, 200, 5, 205, 255, "Название папки", 200,#PB_ListIcon_GridLines)
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
event=WaitWindowEvent()
gadget=EventGadget()
type=EventType()

If event=#PB_Event_Gadget And gadget=#ExplorerTree_0
 If type=#PB_EventType_LeftDoubleClick
  path.s=GetGadgetText(#ExplorerTree_0)
  SetGadgetItemText(#ListIcon_0,-1,path)
 EndIf
EndIf  

Until event=#PB_Event_CloseWindow

Отредактировано daiomik (20.06.2010 14:21:01)

0

470

Я так понял что нужно отобразить только папки без файлов.

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
EndEnumeration

;- Gadget Constants
;
Enumeration
  #ExplorerTree_0
  #ListIcon_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 263, 81, 409, 284, "Papki",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "О программе")
      MenuBar()
      MenuItem(#MENU_2, "Выход")
    EndIf
    If CreateGadgetList(WindowID(#Window_0))
      ExplorerTreeGadget(#ExplorerTree_0, 5, 5, 190, 255, "")
      ListIconGadget(#ListIcon_0, 200, 5, 205, 255, "Название папки", 200,#PB_ListIcon_GridLines)
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
event=WaitWindowEvent()
gadget=EventGadget()
type=EventType()

If event=#PB_Event_Gadget And gadget=#ExplorerTree_0
 If type=#PB_EventType_LeftDoubleClick
  path.s=GetGadgetText(#ExplorerTree_0)
  SetGadgetItemText(#ListIcon_0,-1,path)
       If FileSize(path) = -2 ; Это папка
         ClearGadgetItems(#ListIcon_0) ; Очистка таблицы
         If ExamineDirectory(0, path, "*.*") ; Сканируем папку
             While NextDirectoryEntry(0)
               If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory ; Нашли вложеную папку
                 Name.s=DirectoryEntryName(0)
                 If Name<>"." And Name<>".."
                   AddGadgetItem(#ListIcon_0, -1,  Name)
                 EndIf
               EndIf
             Wend
             FinishDirectory(0)
         EndIf
       EndIf
 EndIf
EndIf  

Until event=#PB_Event_CloseWindow

0

471

Спасибо!

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

Я так понял что нужно отобразить только папки без файлов.

совершенно верно. Просто хотелось понять суть. А что разе с файлами сложнее будет. Верней суть не такая же?

0

472

Для файлов нужно наверно это указывать:

Код:
If ExamineDirectory(0, Directory$, "*.*")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = [b]#PB_DirectoryEntry_File[/b]
        Type$ = " [File] "
      Else
        Type$ = " [Sub-Dir] "
      EndIf
      
      Debug DirectoryEntryName(0) + Type$ + "- Size in byte: " + Str(DirectoryEntrySize(0))
    Wend
    FinishDirectory(0)
  EndIf

Отредактировано daiomik (20.06.2010 15:03:17)

0

473

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

А что разе с файлами сложнее будет

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

0

474

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

то нет смысла в этой проверке

Точно! Жаль что сразу не сообразил. Это получается, если немного (точнее больше чем немного) помучиться, то можно создать слабенький аналог ТоталКомандера?

0

475

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

можно создать слабенький аналог ТоталКомандера

Можно.
А можно сделать полноценный аналог, правда, для этого понадобится много помучится (вмысле много кода написать).
Но в этом случае, логичнее будет использовать ExplorerListGadget

Код:
 If OpenWindow(0, 0, 0, 700, 400, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ExplorerListGadget(0, 10, 10, 680, 380, "*.*", #PB_Explorer_MultiSelect)
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
 EndIf

0

476

Как упростить выбор время в программе. То есть мне нужно что бы пользователь выбрал конкретное время, например: 08:30 или 12:00 и тп. Возможно через SpinGadget или еще как? Главное свести на нет, что бы пользователь что то набирал в StringGadget во избежания ошибок. Надеюсь понятно выразился)

0

477

Нужен именно формат ЧЧ:ММ, или достаточно запретить вводить всё кроме чисел и двоеточия?

Но в любом случае, нужно будет ставить фильтр на StringGadget http://purebasic.info/phpBB2/viewtopic.php?t=797

0

478

было бы красиво если пользователь работал с ЧЧ:ММ, но и с запретом тоже можно. Не принципиально. Главное, что бы пользователь не ввел вместо 08:00 скажем 08;00 или 8:0 и тп

0

479

Со временем решил. А не подскажете как в ListIconGadget добавлять колонки не в первый столбик, а во второй, третий и тп. А то при использовании AddGadgetItem(#ListIcon_0,1,XXX) добавление происходит только в первый столбик

PS: Разобрался сам. Нужно было использовать символ Chr(10). Все работает, но только я не сильно пойму его значение. Вывел сие символ в отладчик и там загогулина появилась типа []

Отредактировано daiomik (20.06.2010 19:09:01)

0

480

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

добавлять колонки не в первый столбик, а во второй, третий и тп

Для этого используется функция SetGadgetItemText.
Второй её аргумент - номер строки, а четвёртый - номер колонки.

Код:
If OpenWindow(0, 100, 100, 300, 100, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListIconGadget(0, 5, 5, 290, 90, "1", 50, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines)
   AddGadgetColumn(0, 1, "2", 50)
   AddGadgetColumn(0, 2, "3", 50)
   AddGadgetColumn(0, 3, "4", 50)
   AddGadgetItem(0, -1, "1") 
   AddGadgetItem(0, -1, "2") 
   
   SetGadgetItemText(0,0,"3",1)
   SetGadgetItemText(0,1,"4",1)
   
   SetGadgetItemText(0,0,"5",2)
   SetGadgetItemText(0,1,"6",2)
   
   SetGadgetItemText(0,0,"7",3)
   SetGadgetItemText(0,1,"8",3)
   Repeat
     Event = WaitWindowEvent()
   Until Event = #PB_Event_CloseWindow
 EndIf

0


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