purebasic.info

PureBasic forum
Текущее время: Чт янв 18, 2018 12:58 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 19, 2012 3:30 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6220
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
Никита Однороб писал(а):
Отобразить значок UAC (щит) на кнопке

Дабы не было кривотолков, надо указать, что это работает не ниже чем в Vista/Win7

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 26, 2012 7:12 pm 
Не в сети
студент

Зарегистрирован: Ср сен 26, 2012 6:57 pm
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте!
Кто нибудь знает как поменять иконку в заголовке окна. Иконку на всю программу знаю как поставить, а вот чтобы разные формы программы с разными иконками открывались не знаю - не нашел ответ.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 26, 2012 7:24 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6220
Благодарил (а): 16 раз.
Поблагодарили: 173 раз.
Пункты репутации: 48
komega писал(а):
чтобы разные формы программы с разными иконками

Код:
1
SendMessage_(WindowID(1),#WM_SETICON,#False,ImageID(0))



ImageID(0) должно быть иконкой.
P.S. И вопросы задавай в теме для новичков, тут только интересный код!

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 26, 2012 9:30 pm 
Не в сети
студент

Зарегистрирован: Ср сен 26, 2012 6:57 pm
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
komega писал(а):
чтобы разные формы программы с разными иконками

Код:
1
SendMessage_(WindowID(1),#WM_SETICON,#False,ImageID(0))



ImageID(0) должно быть иконкой.
P.S. И вопросы задавай в теме для новичков, тут только интересный код!

Спасибо за ответ. Но это конечно не то. API использовать не хотелось бы. Нарушается многоплатформенность. :( Нету так нету. Будем без иконок.
Извините, что тему открыл не в том разделе.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт сен 27, 2012 2:28 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
komega
Для винды и линя здесь, для мака незнаю :?

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полезные советы.
СообщениеДобавлено: Сб мар 14, 2015 12:45 pm 
Не в сети
док

Зарегистрирован: Ср фев 08, 2012 10:39 am
Сообщений: 131
Откуда: Красноярск
Благодарил (а): 7 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Не знаю куда писать, но чтобы тему не создавать просто спрошу, нужен ли модуль такого функционала:
Модуль предназначен для работы с формами. А именно сюда входит (кратко по функционалу):
- Кэширование образов форм.
- Создание форм любого кол-ва из кэша.
- Управление простыми привязками как в PureFORM, но они действуют и на контейнерах и гаджетов с закладкаи.
- Каждый элемент формы можно именовать, после чего обращаться к нему по имени.
- Данные читать и писать из/в элементы формы можно так-же по обычному текстовому имени.
- Обработка событий от любого элемента:
Цитата:
; Общий обработчик, срабатываемый на абсолютно любую активность.
#__FRM_HE_General

; Обработчик закрытия окна. Возникает перед тем, как закрыть окно.
; Если из обработчика передать 0, тогда закрытия не будет, а иначе
; окно будет уничтожено. Этот обработчик можно вешать на окно или, например,
; на кнопку "Отмена". В самом обработчике можно задать вопрос о закрытии
; или сохранение всего нужного.
; Если адрес обработчика не указан, тогда окно просто уничтожается без вопросов
; Важно! Этот обработчик от элемента и от формы обрабатываются отдельно!
#__FRM_HE_CloseForm

; Обработчик только формы. указывающий на закрытие формы по нажатию на кнопку Esc.
; Закрытие происходит так-же на основании переданного флага от пользователя (1 -
; можно закрывать, 0 - запрещено)
#__FRM_HE_CloseFormEsc

; Закрытие формы от любого события гаджета. Так-же как и предыдущие закрыватели
; обрабатывается событие от пользовательского обработчика и по его результату
; форма может быть разрушена.
#__FRM_HE_CloseFormGadget

; Реакция на двойной щелчок левой кнопки мыши по гаджету
; Процедуру надо создавать с 2-мя параметрами:
; hWin.l, hElement.l
#__FRM_HE_LeftDblClick


- Трансформация шаблонов форм в XML и обратно

Проблема в том, что модуль дорабатывается по мере необходимости. Например, пока сталкивался с гаджетами:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
; TextGadget()
 
; StringGadget()
 
; EditorGadget()
 
; Frame3DGadget()
 
; OptionGadget()
 
; ListIconGadget()
;
 
; ButtonGadget
 
;{ ButtonImageGadget
; Для этого элемента вместо текста необходимо передать ИД картинки
;}
 
; CheckBoxGadget
 
;{ PanelGadget
; Сначала создаётся панель, после чего на ней добавляются закладки
;}
 
; Добавление новой закладки для панели
 
;{ Добавление служебных панелек. В зависимости от бита флага:
; bit0: 1 - создаётся пустое меню.
; bit1: 1 - пустая панель кнопок
; bit2: 1 - пустая строка состояний без полей
;}
 
 



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

Например, вот код создание шаблона окна настроек
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
        ; Управление шаблоном элемента сервера №2
        If gGeneralWindows\srv2_El_GUIN=""
               
                ; Основное окно
                gGeneralWindows\srv2_El_GUIN = frmAddNewWindow1(0, 400, 220, "Срв2_Эл", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_MaximizeGadget, "Настройка архивации")
                        frmAddHandlerEvent(gGeneralWindows\srv2_El_GUIN, 1, #__FRM_HE_CloseForm, 0)
                        frmAddHandlerEvent(gGeneralWindows\srv2_El_GUIN, 1, #__FRM_HE_CloseFormEsc, 0)
                        frmSecondaryLIN = 1
                       
                ; Наименование
                ; #PB_Text_Border
                frmAddTextGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 3, 135, 18, "", 0, "Наименование:")
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1+#ORBIT2, 135, 2, 265, 20, "srv2_El_Name")
               
                ; Каталог источник
                frmAddTextGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 23, 135, 18, "", 0, "Анализируемый каталог:")
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1+#ORBIT2, 135, 22, 245, 20, "srv2_El_Каталог1")
                ;lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT1+#ORBIT2, 360, 22, 20, 20, "", 0, "V", "Выбрать из шаблонов")
                lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT1+#ORBIT2, 381, 22, 20, 20, "", 0, "...", "Выбрать локальную папку")
                        frmAddStandartHandlerEvent(gGeneralWindows\srv2_El_GUIN, lLIN1, @srv2_El_Hand_ReqPath1())
               
                ; Каталог приёмник
                frmAddTextGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 44, 135, 18, "", 0, "Каталог приёмник:")
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1+#ORBIT2, 135, 43, 245, 20, "srv2_El_Каталог2")
                lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT1+#ORBIT2, 381, 43, 20, 20, "", 0, "...", "Выбрать локальную папку, куда будет производиться архивация, либо оставить поле пустым для архивации в папку комплекса")
                        frmAddStandartHandlerEvent(gGeneralWindows\srv2_El_GUIN, lLIN1, @srv2_El_Hand_ReqPath2())
                       
                ; Набор масок
                frmAddTextGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 64, 135, 18, "", 0, "Маски:")
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1+#ORBIT2, 135, 63, 225, 20, "srv2_El_Маски", #PB_String_ReadOnly)
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, 0, 0, 63, 0, 0, "srv2_El_МаскиГУИН")                                  ; ГУИН шаблона масок
                lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT1+#ORBIT2, 381, 63, 20, 20, "", 0, "...", "Выбрать набор масок")
                        frmAddStandartHandlerEvent(gGeneralWindows\srv2_El_GUIN, lLIN1, @srv2_El_Hand_ReqTmplMask())
                lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT1+#ORBIT2, 360, 63, 20, 20, "", 0, "M", "Ввести маски вручную")
                        frmAddStandartHandlerEvent(gGeneralWindows\srv2_El_GUIN, lLIN1, @srv2_El_Hand_ReqMasks())
               
                ; Рекурсивный анализ
                frmAddCheckBoxGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 83, 135, 15, "srv2_El_РекАн", "рекурсивный анализ")
               
                ; Интервал сканирования
                frmAddTextGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 101, 170, 18, "", 0, "Интервал действий:")
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 170, 100, 110, 20, "srv2_El_ИнтДейств", #PB_String_Numeric, "", "Задержка в милисекундах между обращениями к СУБД и системе.")
                       
                ; Интервал между обработками
                frmAddTextGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 121, 170, 18, "", 0, "Интервал между обработками:")
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 170, 120, 110, 20, "srv2_El_ИнтОбр", #PB_String_Numeric, "", "Через сколько секунд проводить анализ файлов.")
               
                ; Интервал между полными срезами
                frmAddTextGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 141, 170, 18, "", 0, "Интервал полных срезов:")
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 170, 140, 110, 20, "srv2_El_ИнтПолнСр", #PB_String_Numeric, "", "Через сколько дней производить полную архивацию данных (0 - только первый раз)")
                frmAddCheckBoxGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 160, 205, 15, "srv2_El_ОчищатьДоСреза", "очищать файлы до полного архива", "После копирования всех файлов, без учёта изменений, очищать все файлы за предыдущие даты")
               
                ; Доп.настройка
                frmAddCheckBoxGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 175, 205, 15, "srv2_El_ПоДатеФла", "архивировать по дате изменения", "Файл будет заархивирован по дате изменения, а не по признаку архивности")
               
                ; Основные кнопки
                lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT2+#ORBIT3, 340, 200, 60, 20, "", 0, "Отмена", "Отменить все изменения и закрыть форму")
                        frmAddHandlerEvent(gGeneralWindows\srv2_El_GUIN, lLIN1, #__FRM_HE_CloseFormGadget, 0)
                lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT2+#ORBIT3, 275, 200, 60, 20, "", 0, "Записать", "Записать изменения не закрывая форму")
                        frmAddHandlerEvent(gGeneralWindows\srv2_El_GUIN, lLIN1, #__FRM_HE_General, @srv2_El_Hand_Save())
                lLIN1 = frmAddButtonGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT2+#ORBIT3, 210, 200, 60, 20, "", 0, #B_TextOk, "Перезаписать все изменения в БД и закрыть форму")
                        frmAddHandlerEvent(gGeneralWindows\srv2_El_GUIN, lLIN1, #__FRM_HE_CloseFormGadget, @srv2_El_Hand_SaveClose())
               
                ; Служебное окно под ГУИН
                frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 0, 0, 0, "srv2_El_GUIN")
                ;frmAddStringGadget(gGeneralWindows\srv2_El_GUIN, #ORBIT0+#ORBIT1, 0, 180, 150, 20, "srv2_El_GUIN")            
               
        EndIf
 



А вот код его открытия и заполнения
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
        ; Определение действия с формой
        lPN = frmOpenFormName("Срв2_Эл", WindowID(gGeneralWindows\srv2_hWindow))
        If eGUIN=""
               
                ; Открытие пустой формы
                frmWriteText_Name(lPN, "srv2_El_GUIN", buCreateUIN19())
               
        Else
               
                ; Открытие как минимум заполненной формы
                ;========================================
                ; Поиск элемента
                lIndex = srv2_FindItemCache(eGUIN)
                If lIndex
                       
                        lIndex - 1
                        ; Перенос данных из найденной ячейки
                        frmWriteText_Name(lPN, "srv2_El_GUIN", gSrv2_Elements(lIndex)\GUIN)
                        frmWriteText_Name(lPN, "srv2_El_Name", gSrv2_Elements(lIndex)\Name)
                       
                        frmWriteText_Name(lPN, "srv2_El_Каталог1", fs_NormalizeDirectory(gSrv2_Elements(lIndex)\Path1))
                        frmWriteText_Name(lPN, "srv2_El_Каталог2", fs_NormalizeDirectory(gSrv2_Elements(lIndex)\Path2))
                        frmWriteText_Name(lPN, "srv2_El_Маски", gSrv2_Elements(lIndex)\Masks)
                        frmWriteText_Name(lPN, "srv2_El_МаскиГУИН", gSrv2_Elements(lIndex)\TmplMask_GUIN)
 
                        frmWriteText_Name(lPN, "srv2_El_ИнтДейств", Str(gSrv2_Elements(lIndex)\IntervalAction))
                        frmWriteText_Name(lPN, "srv2_El_ИнтОбр", Str(gSrv2_Elements(lIndex)\IntervalProccessing))
                       
                        If gSrv2_Elements(lIndex)\Flag & #ORBIT0
                                frmWriteState_Name(lPN, "srv2_El_РекАн", 1)
                        EndIf
                       
                        frmWriteText_Name(lPN, "srv2_El_ИнтПолнСр", Str(gSrv2_Elements(lIndex)\IntervalFullCut))
                        If gSrv2_Elements(lIndex)\Flag & #ORBIT1
                                frmWriteState_Name(lPN, "srv2_El_ОчищатьДоСреза", 1)
                        EndIf
                       
                        If gSrv2_Elements(lIndex)\Flag & #ORBIT2
                                frmWriteState_Name(lPN, "srv2_El_ПоДатеФла", 1)
                        EndIf
                       
                EndIf
               
                ; Управление признаком копии
                ;============================
                If eFlCopy
                        frmWriteText_Name(lPN, "srv2_El_GUIN", buCreateUIN19())
                EndIf
               
        EndIf
 
 



Вот так выглядит обработчик нажатия на кнопку "Сохранить"
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
Procedure.b srv2_El_Hand_Save(hWin.l)
        Protected lRes.b
        Protected lGUIN.s
        Protected lName.s, lPath1.s, lPath2.s
        Protected lMasks.s, lTmplMasksGUIN.s
        Protected lIntervAct.l, lIntervOper.l
        Protected lTextError.s, lSym10.s
        Protected lIndex.l
       
        ; По умолчанию флаг в положении "нормально"
        lRes = 1
       
        ; Чтение данных поочерёдно
        lGUIN = frmReadText_Name(hWin, "srv2_El_GUIN")
        lName = frmReadText_Name(hWin, "srv2_El_Name")
        lPath1 = fs_NormalizeDirectory(frmReadText_Name(hWin, "srv2_El_Каталог1"))
        lPath2 = fs_NormalizeDirectory(frmReadText_Name(hWin, "srv2_El_Каталог2"))
        lMasks = frmReadText_Name(hWin, "srv2_El_Маски")
        lTmplMasksGUIN = frmReadText_Name(hWin, "srv2_El_МаскиГУИН")
        lIntervAct = Val(frmReadText_Name(hWin, "srv2_El_ИнтДейств"))
        lIntervOper = Val(frmReadText_Name(hWin, "srv2_El_ИнтОбр"))
       
        ; Контроль на корректность
        If lName=""
                lTextError = "Не заполнено наименование"
                lSym10 = Chr(10)
        EndIf
        If lPath1=""
                lTextError = lTextError + lSym10 + "Не заполнен каталог для анализа"
                lSym10 = Chr(10)
        EndIf
        If lMasks=""
                lTextError = lTextError + lSym10 + "Не выбраны шаблоны (маски) файлов"
        EndIf
       
        ; Обработка ошибки
        If lTextError<>""
                lRes = 0
                MessageRequester("Ошибка заполнения", lTextError, #BMR_Error)
        EndIf
       
        If lRes
               
                ; Все данные корректны. Сохранение их в БД
                ;==========================================
                ; Поиск нужной ячейки
                lIndex = srv2_FindItemCache(lGUIN)
                ; и т.д.
        EndIf
       
        ProcedureReturn(lRes)
EndProcedure
 



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

Вообще. модуль получился великоват (2400 строк) и конечно же там многое можно было бы изменить и оптимизировать, но цель была в упрощении создания форм, чтобы не терять нить проекта в голове, тратя внимание на создание и обработку форм.
Вот. Как-то так.

_________________
Уважай других, чтобы уважали тебя


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полезные советы.
СообщениеДобавлено: Вт окт 27, 2015 12:34 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Иногда необходимо знать, нажата ли какая-нибудь кнопка мыши
Код:
1
2
3
4
5
6
7
8
9
10
11
Procedure isMouseButtonDown(vk)
  Protected state.i
   state = GetAsyncKeyState_(vk)
   If (state & $8000) <> 0
     ProcedureReturn 1          ; нажата левая кнопка
   Else
     ProcedureReturn 0          ; не нажата левая кнопка
   EndIf  
EndProcedure
 
isMouseButtonDown(#VK_LBUTTON)                      ; #VK_RBUTTON   #VK_MBUTTON


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB