purebasic.info

PureBasic forum
Текущее время: Вт ноя 13, 2018 11:23 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: SmartyComboBox
СообщениеДобавлено: Сб авг 10, 2013 6:41 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
SmartyComboBox v.0.3.1

Функции:
    + 100% WinAPI (Работа с handle ComboBox)
    + Поддержка нескольких ComboBox одновременно
    + Добавление уникального элемента INSERT
    + Удаление элемента DELETE
    + Редактирование элемента в списке F5
    + Разворачивание списка после добавления/редактирования
    + Последний элемент становится активным
    + Поддержка DropDown + DropDownList
    + Возвращение к предыдущему состоянию гаджета
Нужно доделать:
    - Очистка текста OnLostFocus для Editable Combo
    - Оптимизировать код

SmartyComboBox.PBI
Код:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
; =================== 
; Project     SmartyComboBox
; Author      Roman Usenko (Lunatic)
; Date        10.08.2013
; Contact     jungle_free
; License     GPL v3
; Version     0.3.1
;
; Hotkey:
;   INSERT    AddElement
;   DELETE    RemoveElement
;   F5        UpdateElement
;
; API:
;   SmartyComboBox (hWnd, Unique=#True)
;             If Unique=#True then add only unique values to ComboBox
;
;   SmartyComboBox_Free (hWnd=#Null)
;             If hWnd=#Null then free all ComboBox handle
; ===================
 
Structure SCBS
  hWnd.i
  hgWnd.i
  newLong.i
  oldLong.i
  DropDown.b    
  OnlyUniq.b    
EndStructure
 
Global NewMap SmartyCBS.SCBS()
 
Procedure ComboEditorProc(hWnd, uMsg, wParam, lParam)
  If uMsg = #WM_KEYUP
    Protected Result, hgWnd, TextLen, *Buff, hCur, CurrentElement, NewValue$, oldData
    hgWnd=SmartyCBS(Str(hWnd))\hWnd
    Select wParam
      Case #VK_INSERT
        ;Новый элемент
        If SmartyCBS(Str(hWnd))\DropDown
          NewValue$=InputRequester("Add Element","Value",#NULL$)
          If NewValue$<>#NULL$
            SendMessage_(hgWnd,#CB_ADDSTRING,#Null,@NewValue$)
          EndIf
        Else
          TextLen = SendMessage_(hgWnd, #WM_GETTEXTLENGTH,#Null,#Null)+1
          If TextLen>1
            *Buff = AllocateMemory(TextLen)
            If *Buff
              SendMessage_(hgWnd, #WM_GETTEXT, TextLen, *Buff)
              Debug TextLen
              If SmartyCBS(Str(hWnd))\OnlyUniq
                If SendMessage_(hgWnd, #CB_FINDSTRING, #PB_Default, *Buff)=#PB_Default
                  SendMessage_(hgWnd,#CB_ADDSTRING,#Null,*Buff)
                EndIf
              Else
                SendMessage_(hgWnd,#CB_ADDSTRING,#Null,*Buff)
              EndIf
              FreeMemory(*Buff)
            EndIf
          EndIf
        EndIf
        SendMessage_(hgWnd,#CB_SHOWDROPDOWN, #False, #Null)
        SendMessage_(hgWnd,#CB_SHOWDROPDOWN, #True, #Null)
        SendMessage_(hgWnd,#CB_SETEDITSEL, #Null,#PB_Default)
        hCur=LoadCursor_(0,#IDC_ARROW)
        SetCursor_(hCur)
        DestroyCursor_(hCur)
       
      Case #VK_DELETE
        ;Удалить
        CurrentElement=SendMessage_(hgWnd, #CB_GETCURSEL,#Null,#Null)
        If Not CurrentElement=#PB_Default
          SendMessage_(hgWnd,#CB_DELETESTRING, CurrentElement, #Null)
          SendMessage_(hgWnd,#CB_SETCURSEL,#PB_Default,#Null)
          SendMessage_(hgWnd,#CB_SHOWDROPDOWN, #False, #Null)
        EndIf  
       
      Case #VK_F5
        ;Редактировать
        CurrentElement=SendMessage_(hgWnd, #CB_GETCURSEL,#Null,#Null)
        If Not CurrentElement=#PB_Default
          TextLen = SendMessage_(hgWnd, #WM_GETTEXTLENGTH,#Null,#Null)+1
          *Buff = AllocateMemory(TextLen)
          If *Buff
            SendMessage_(hgWnd, #WM_GETTEXT, TextLen, *Buff)
            NewValue$=InputRequester("Element #"+Str(CurrentElement+1),"New Value",PeekS(*Buff))
            If NewValue$<>#NULL$
              oldData = SendMessage_(hgWnd, #CB_GETITEMDATA, CurrentElement, #Null)
              If Not SendMessage_(hgWnd, #CB_DELETESTRING, CurrentElement, #Null)=#PB_Default
                SendMessage_(hgWnd,#CB_INSERTSTRING,CurrentElement, @NewValue$)
                SendMessage_(hgWnd,#CB_SETITEMDATA, CurrentElement, oldData)
                SendMessage_(hgWnd,#CB_SETCURSEL,CurrentElement,#Null)
              EndIf
            EndIf
            SendMessage_(hgWnd,#CB_SHOWDROPDOWN, #True, #Null)
            SendMessage_(hgWnd,#CB_SETEDITSEL, #Null,#PB_Default)
            FreeMemory(*Buff)
          EndIf
        EndIf
       
      Default
        Result = CallWindowProc_(SmartyCBS(Str(hWnd))\newLong, hWnd, uMsg, wParam, lParam)
       
    EndSelect
    Result = #False
  Else
    Result = CallWindowProc_(SmartyCBS(Str(hWnd))\newLong, hWnd, uMsg, wParam, lParam)
  EndIf    
  ProcedureReturn Result
EndProcedure
 
Procedure DisableSmarty(hWnd)
  Protected hgWnd=hWnd
  If Not SmartyCBS(Str(hWnd))\DropDown
    hgWnd=GetWindow_(hWnd,#GW_CHILD)
  EndIf
  SetWindowLongPtr_(hgWnd, #GWL_WNDPROC, SmartyCBS(Str(hWnd))\oldLong)
EndProcedure
 
ProcedureDLL SmartyComboBox (hWnd, Unique=#True)
  Protected hgWnd,Type,DropDown
  Type=GetWindowLongPtr_(hWnd, #GWL_STYLE)
  If Type|#CBS_DROPDOWNLIST=Type
    DropDown=#True
    hgWnd=hWnd
  Else
    DropDown=#False
    hgWnd=GetWindow_(hWnd,#GW_CHILD)
  EndIf
  With SmartyCBS(Str(hgWnd))
    \hgWnd=hgWnd    
    \hWnd=hWnd      
    \oldLong=GetWindowLongPtr_(hgWnd, #GWL_WNDPROC)
    \newLong=SetWindowLongPtr_(hgWnd, #GWL_WNDPROC, @ComboEditorProc())
    \DropDown=DropDown
    \OnlyUniq=Unique
  EndWith
EndProcedure
 
ProcedureDLL SmartyComboBox_Free(hWnd=#Null)
  If hWnd
    DisableSmarty(hWnd)
  Else
    ForEach SmartyCBS()
      DisableSmarty(Val(MapKey(SmartyCBS())))
    Next
    ClearMap(SmartyCBS())
  EndIf
EndProcedure
 



Демо
Код:
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
 
 
; Import "SmartyComboBox.lib"
;   SmartyComboBox (hWnd, Unique=#True)
;   SmartyComboBox_Free (hWnd=#Null)
; EndImport
 
XIncludeFile "SmartyComboBox.PBI"
 
;=========================================
;{ DEMO
 
Enumeration #PB_Compiler_EnumerationValue
  #Window_0
EndEnumeration
 
Enumeration #PB_Compiler_EnumerationValue
  #Combo_0
  #Combo_1
  #Combo_2
  #Combo_3
  #Text_0
  #Text_1
EndEnumeration
 
Procedure OpenWindow_0()
  OpenWindow(#Window_0, 0, 0, 215, 85, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ComboBoxGadget(#Combo_0, 10, 30, 90, 20)
  ComboBoxGadget(#Combo_1, 10, 55, 90, 20, #PB_ComboBox_Editable)
  ComboBoxGadget(#Combo_2, 110, 30, 90, 20)
  ComboBoxGadget(#Combo_3, 110, 55, 90, 20, #PB_ComboBox_Editable)
  TextGadget(#Text_0, 10, 5, 90, 20, "До", #PB_Text_Center | #PB_Text_Border)
  TextGadget(#Text_1, 110, 5, 90, 20, "После", #PB_Text_Center | #PB_Text_Border)
EndProcedure
 
Procedure Window_0_Events(event)
  Select event
     
    Case #WM_CHAR
      If EventwParam()=#VK_ESCAPE
        SmartyComboBox_Free(GadgetID(#Combo_3))
      EndIf
    Case #PB_Event_CloseWindow
      ProcedureReturn #False
     
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
     
    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure
 
OpenWindow_0()
 
;Магия!
SmartyComboBox (GadgetID(#Combo_2))
SmartyComboBox (GadgetID(#Combo_3))
 
 
While Window_0_Events(WindowEvent()):Wend
SmartyComboBox_Free()
;}
 


_________________
Win7 Enterprise x86 (PB 5.11)


Последний раз редактировалось Lunatic Вс авг 11, 2013 6:07 pm, всего редактировалось 25 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб авг 10, 2013 8:33 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
А такой вариант? Применена 1 API функция и 3 API константы, остальное на функциях пурика:
Код:
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
71
72
73
74
75
76
Enumeration #PB_Compiler_EnumerationValue 
  #Window_0
EndEnumeration
 
Enumeration #PB_Compiler_EnumerationValue
  #Combo_0
  #Combo_1
  #Combo_2
  #Combo_3
  #Text_0
  #Text_1
EndEnumeration
 
Global NewList ComboBoxAddEnter.l()
 
Procedure OpenWindow_0()
  OpenWindow(#Window_0, 0, 0, 215, 85, "", #PB_Window_SystemMenu)
  ComboBoxGadget(#Combo_0, 10, 30, 90, 20, #PB_ComboBox_Editable)
  ComboBoxGadget(#Combo_1, 10, 55, 90, 20, #PB_ComboBox_Editable)
  ComboBoxGadget(#Combo_2, 110, 30, 90, 20, #PB_ComboBox_Editable)
  ComboBoxGadget(#Combo_3, 110, 55, 90, 20, #PB_ComboBox_Editable)
  TextGadget(#Text_0, 10, 5, 90, 20, "До", #PB_Text_Center | #PB_Text_Border)
  TextGadget(#Text_1, 110, 5, 90, 20, "После", #PB_Text_Center | #PB_Text_Border)
 
EndProcedure
 
Procedure AddComboBoxEx(Gadget)
  AddElement(ComboBoxAddEnter())
  ComboBoxAddEnter() = Gadget
EndProcedure
 
Procedure ComboBoxExEvents(Event)
  If Event = #WM_KEYUP
    If EventwParam() = #VK_RETURN
      Protected gadget = GetActiveGadget()
     
      ForEach ComboBoxAddEnter()
        If gadget = ComboBoxAddEnter() ;Нашли нужный гаджет
          Protected text$ = GetGadgetText(gadget) ;Получили набранный текст
          AddGadgetItem(gadget, -1, text$)
          SetGadgetText(gadget, "")
          SendMessage_(GadgetID(gadget), #CB_SHOWDROPDOWN, 1, #Null)
          Break
        EndIf
      Next
    EndIf
  EndIf
EndProcedure
 
Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False
 
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
 
    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
 
  ;!!!!!!!!!!!!!!!!!!!!!!!!!
  ComboBoxExEvents(event)
  ;!!!!!!!!!!!!!!!!!!!!!!!!!
 
  ProcedureReturn #True
EndProcedure
 
OpenWindow_0()
 
AddComboBoxEx(#Combo_2)
AddComboBoxEx(#Combo_3)
 
While Window_0_Events(WindowEvent()):Wend


У этого кода такие плюсы и минусы как у твоего. Но есть еще:
+ Можно работать с номерами гаджетов, а не с хендлами, что удобнее
- Когда нажимаешь Enter, слышен звук. Наверное, исправимо, но все же.

_________________
Пурик - лучший язык программирования


Последний раз редактировалось Никита Однороб Сб авг 10, 2013 8:38 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб авг 10, 2013 8:33 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Зачет, спасибо

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб авг 10, 2013 10:38 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Никита Однороб писал(а):
+ Можно работать с номерами гаджетов, а не с хендлами, что удобнее

Я наоборот от этого уходил. Ибо можно юзать через хендлы не только гаджеты пурика, а и другие combobox'ы даже чужых окон)) Не вижу преимуществ в использовании номеров гаджетов. Ведь они используются только один раз при активации.
Код:
1
ComboBox_AddEx(GadgetID(#Combo_2)) 


_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 11, 2013 1:29 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Обновил до версии 0.2, смотрите изменения.

Думал как лучше организовать редактирование элемента. Пока так.
Не смог поставить "редактирование" на VK_ENTER/VK_ESCAPE, которые служат для InputRequester событиями, что провоцирует рекурсию, при "подтверждении/отмене" клавишами. Может кто предложит как избавиться от рекурсии, или же от InputRequester

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 11, 2013 7:50 am 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
А я тут не догнал, события будут ловится только когда фокус на комбобоксе? Тогда зачем хоткей для редактирования, если курсор и так там стоит
И апи много у тебя, зачем одно апи?

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 11, 2013 12:29 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Никита Однороб писал(а):
А я тут не догнал, события будут ловится только когда фокус на комбобоксе? Тогда зачем хоткей для редактирования, если курсор и так там стоит
И апи много у тебя, зачем одно апи?


В версии 0.3 обещаю более наглядный пример показывающий преимущества API и необходимость именно в HotKey и InputRequester, а не просто брать текст из диалога СomboBox) Работа идёт, по появлении свободной минутки....

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 11, 2013 3:36 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Lunatic
Что-то у меня новая версия не хочет добавлять текст.
А так пример хороший, еще бы его в виде отдельного гаджета сделать.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 11, 2013 4:32 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
MrF писал(а):
Lunatic
Что-то у меня новая версия не хочет добавлять текст.
А так пример хороший, еще бы его в виде отдельного гаджета сделать.


Попробуй версию 0.3, должно работать. Какая ось? х64? Ты ведь заметил что я поменял хоткей. Раньше Enter добавлял, теперь insert
0.2 писал сонный)) Пока что только добавляю функционал, шлифовать буду ближе к версии 1.0)

В виде отдельного гаджета не хочу, и не буду делать) Это менее гибко. А так в рамках GPL v3, каждый ведь может форкнуть под себя)

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 11, 2013 9:07 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Может пожелания какие-то, по функционалу....

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 11, 2013 9:24 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Lunatic писал(а):
Ты ведь заметил что я поменял хоткей. Раньше Enter добавлял, теперь insert

Точно, не заметил, что теперь insert добавляет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 18, 2013 9:07 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
А когда новая версия? :)

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 19, 2013 7:24 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Когда будет немного свободного времени))

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб авг 24, 2013 12:39 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
У меня появился свободный день) О чудо)) Пожелания, что еще добавить?

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: SmartyComboBox
СообщениеДобавлено: Вс июн 17, 2018 10:36 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1706
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
у меня вопрос - а можно ли каким-то winapi заблочить пункт в ниспадающем списке ComboBoxGadget? типа как меню может делать. чтобы этот пункт оставался в списке, но просто не выбирался так сказать.


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

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


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

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


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

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