purebasic.info

PureBasic forum
Текущее время: Пн ноя 19, 2018 12:30 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: ListView
СообщениеДобавлено: Пн авг 27, 2018 3:57 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 455
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Здравствуйте.
1. Есть ли более цивилизованный способ определить, что был выбран один из элементов в ListView, а не клик на пустом месте гаджета?
2. Если однажды отметить в LV2, например строку 2, а затем выбрать какой-либо элемет в LV1 или LV3, то после повторного перехода в LV2 (активации LV2) но уже кликнув не по элементу а по пустому пространству гаджета - получим опять же выделенную строку 2. Где это сохраняется и как заставить это "забыть"? Важно убирать выделенные элементы в LV1 или LV3 только тогда, когда в LV2 был выбран конкретный элемент (клик по строке).
3. Можно ли избавиться от пунктирной рамки, когда клик не по элементу?
4. Можно ли при переходе/активации другого/соседнего LV узнать какой из них был активен "до того"? Чтобы не очищать все три LV, а только предыдущий.
Код:
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
  Window_0 = OpenWindow(0, x, y, 470, 530, "List View taste", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListViewGadget(1, 20, 15, 200, 240, #PB_ListView_MultiSelect)
  ListViewGadget(2, 240, 15, 200, 240, #PB_ListView_MultiSelect)
  ListViewGadget(3, 20, 270, 200, 240, #PB_ListView_MultiSelect)
  ListViewGadget(4, 240, 270, 200, 240, #PB_ListView_MultiSelect)
 
  For i = 1 To 10
    AddGadgetItem(1,-1, "Item  "+Str(i))
  Next i
  For i = 1 To 5
    AddGadgetItem(2,-1,"Item  "+Str(i))
  Next i
  For i = 1 To 3
    AddGadgetItem(3,-1,"Item  "+Str(i))
  Next i
 
 
  Repeat
    Event.l = WaitWindowEvent()
    GID = EventGadget()
   
    If Event = #PB_Event_Gadget
      If GID = 1
        elements = CountGadgetItems(1)
        If elements > 0
          mark = 0
          For i = 0 To elements
            If GetGadgetItemState(1,i) = 1
              mark = 1
              Break
            EndIf
          Next i
          If mark = 1
            SetGadgetState(2, -1)
            SetGadgetState(3, -1)
            SetGadgetState(4, -1)
          EndIf
        EndIf
       
      ElseIf GID = 2
        elements = CountGadgetItems(2)
        If elements > 0
          mark = 0
          For i = 0 To elements
            If GetGadgetItemState(2,i) = 1
              mark = 1
              Break
            EndIf
          Next i
          If mark = 1
            SetGadgetState(1, -1)
            SetGadgetState(3, -1)
            SetGadgetState(4, -1)
          EndIf
        EndIf
       
      ElseIf GID = 3
        elements = CountGadgetItems(3)
        If elements > 0
          mark = 0
          For i = 0 To elements
            If GetGadgetItemState(3,i) = 1
              mark = 1
              Break
            EndIf
          Next i
          If mark = 1
            SetGadgetState(1, -1)
            SetGadgetState(2, -1)
            SetGadgetState(4, -1)
          EndIf
        EndIf
       
      ElseIf GID = 4
        elements = CountGadgetItems(4)
        If elements > 0
          mark = 0
          For i = 0 To elements
            If GetGadgetItemState(4,i) = 1
              mark = 1
              Break
            EndIf
          Next i
          If mark = 1
            SetGadgetState(1, -1)
            SetGadgetState(2, -1)
            SetGadgetState(3, -1)
          EndIf
        EndIf
      EndIf
    EndIf
 
  Until Event = #PB_Event_CloseWindow
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListView
СообщениеДобавлено: Пн авг 27, 2018 5:26 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
Скорее всего я несовсем понял вопроса, и сделал совершенно задом наперед :)

Вобщем много противоречивых вопросов, я запуталси.

Цитата:
1. Есть ли более цивилизованный способ определить, что был выбран один из элементов в ListView, а не клик на пустом месте гаджета?
GetGadgetItemState выдает номер выделеного когда гаджет получил сообщение, но если клик мимо строки, он всеодно помнит выбор строки, невижу сообщения когда теряется фокус ввода с гаджета только когда получил.

Цитата:
2. Если однажды отметить в LV2, например строку 2, а затем выбрать какой-либо элемет в LV1 или LV3, то после повторного перехода в LV2 (активации LV2) но уже кликнув не по элементу а по пустому пространству гаджета - получим опять же выделенную строку 2. Где это сохраняется и как заставить это "забыть"? Важно убирать выделенные элементы в LV1 или LV3 только тогда, когда в LV2 был выбран конкретный элемент (клик по строке).

Если клацать мышкой то все нормально работает(помнит) в GetGadgetState, но если табуляцией, дает только последнее выделение гото гаджета который имел изменение, а не того на который мы перешли, а это уже плохо

Цитата:
3. Можно ли избавиться от пунктирной рамки, когда клик не по элементу?
сколько возился то такого незамечал, может на АПИ чегото гдето, у меня по нему нет даных.

Цитата:
4. Можно ли при переходе/активации другого/соседнего LV узнать какой из них был активен "до того"? Чтобы не очищать все три LV, а только предыдущий.
GetGadgetItemState если строку If GID: SetGadgetState(GID, -1):EndIf


ЭТО ка убрать синюю рамку и забыть выделение(наверное нето)
в флаге есть такое $4000 но это несовсем то что тебе нужно(он незапоминает выбор синей рамкой и "незапоминает" выбор покрайней мере на экране, но выводит рамку пунктирную).

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

Короче эта штуковина имеет две рамки, синяя и пунктиром. Синяя обычно выдает какая выделеная( в GadgetState) и в обычном состоянии пунктирная повторяет ее, но и можэет жить своей жизнью, как удалить незнаю.

Вот бред который накодировал :roll:
Код:
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
Window_0 = OpenWindow(0, x, y, 470, 530, "List View taste", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListViewGadget(1, 20, 15, 200, 240)
 
; тут может поможет
  ListViewGadget(2, 240, 15, 200, 240, #PB_ListView_MultiSelect|$4000)
 
  ListViewGadget(3, 20, 270, 200, 240, #PB_ListView_MultiSelect)
  ListViewGadget(4, 240, 270, 200, 240, #PB_ListView_MultiSelect)
 
  For i = 1 To 10
    AddGadgetItem(1,-1, "Item  "+Str(i))
  Next i
  For i = 1 To 5
    AddGadgetItem(2,-1,"Item  "+Str(i))
  Next i
  For i = 1 To 3
    AddGadgetItem(3,-1,"Item  "+Str(i))
  Next i
 
  aaa=0
  Repeat
      Event.l = WaitWindowEvent()
    GID = EventGadget()
 
    If Event=49310:Debug "ФОКУС ВВОДА даных"
        Debug GID
        SetGadgetState(1, -1)
        SetGadgetState(2, -1)
        SetGadgetState(3, -1)
        SetGadgetState(4, -1)
    EndIf
       
     If Event = #PB_Event_Gadget
                Debug "1111111"
                Select GID
                    Case 2
                    Case 3
                EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
 


отличие только что во втором списке нет синеого выделения.

_________________
искатель истины


Последний раз редактировалось balex1978 Пн авг 27, 2018 6:03 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListView
СообщениеДобавлено: Пн авг 27, 2018 5:57 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 455
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
balex1978
Цитата:
Скорее всего я несовсем понял вопроса, и сделал совершенно задом наперед

Да. Когда спрашивал про корректный отлов события "выделение строки/элемента", то подразумевал примерно такой код (нашёлся на зарубежном форуме):
Код:
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
Procedure.l callback(hWnd, uMsg, wParam, lParam) 
  Protected result, *nmh.NMHDR, *nmlv.NM_LISTVIEW
  result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_NOTIFY
      *nmh = lParam
      Select *nmh\code
        Case #LVN_ITEMCHANGED
          If *nmh\hwndFrom = GadgetID(0)
            *nmlv = lParam
            If *nmlv\uNewState& #LVIS_SELECTED
              Debug "отмечен"
            EndIf
          EndIf
      EndSelect  
  EndSelect
  ProcedureReturn result
EndProcedure
 
 
If OpenWindow(0, 100, 100, 300, 350, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(0, 5, 5, 290, 300, "", 100, #PB_ListIcon_FullRowSelect|#LVS_NOCOLUMNHEADER)
  For i = 1 To 10
    AddGadgetItem(0, -1, "Item "+Str(i))
  Next
  SetWindowCallback(@callback())
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf



тем не менее это не снимает вопроса о том, как "забыть" ранее сделанный выбор.
как определить предыдущий активный LV - это наверное нужно также callback'ом отлавливать потерю фокуса текущим гаджетом. Иначе как узнать что процесс выделения завершён (ведь он может быть изменён несколько раз).

Цитата:
Короче эта штуковина имеет две рамки, синяя и пунктиром.

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

добавлено:
всё это затеяно потому, что когда в каждом из 4-x LV выделена строка/и, то это очень некрасиво выглядит. Да и сбивает с толку. Нужно чтобы в каждый конкретный момент выделение присутствовало лишь в одном из 4х LV.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListView
СообщениеДобавлено: Пн авг 27, 2018 6:37 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 310
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Пункты репутации: 0
Оп, пока писал и коректировал ответ, уже пришел ответ.

Чегото никакой реакции процедура недает, думал необрабатывает,а нет рабает, но до строчки Debug "отмечен" недоходит.
почемуто нет сообщения нотифи, странно, хотя в справке все верно кажется.
Код:
1
2
3
4
5
6
7
8
9
10
Procedure.l callback(hWnd, uMsg, wParam, lParam) 
    Protected result, *nmh.NMHDR, *nmlv.NM_LISTVIEW
    Debug uMsg
  result = #PB_ProcessPureBasicEvents
  Select uMsg
      Case #WM_NOTIFY
          Debug "_NOTIFY"
 EndSelect
  ProcedureReturn result
EndProcedure


Можеш выложить полностью, может я неверно прикрутил процедуру или чего ему надобно.

Од пунктира в каковто другом гаджете тож хотел избавится но, похоже на АПИ ничего ненашел, а мож Петр или Квиталий знает.

Цитата:
Нужно чтобы в каждый конкретный момент выделение присутствовало лишь в одном из 4х LV.
а почему неиспользовать другой гаджет, вау даже нотифи заработал, а я то думаю почему же на этот сраный гаджет надпись в моем блокноте что необрабатывае подобные события.
Тут как ты просил, правда виндовс калбак ненужен, можно закоментировать(правда там остатки прошлого програминга :) )
Код:
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
 
Procedure.l callback(hWnd, uMsg, wParam, lParam)
    Protected result, *nmh.NMHDR, *nmlv.NM_LISTVIEW
    Debug uMsg
  result = #PB_ProcessPureBasicEvents
  Select uMsg
      Case #WM_NOTIFY
          Debug "_NOTIFY"
 EndSelect
  ProcedureReturn result
EndProcedure
 
Window_0 = OpenWindow(0, x, y, 470, 530, "List View taste", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@callback() )
  ListIconGadget(1, 20, 15, 200, 240, "", 100);)
  ListIconGadget(2, 240, 15, 200, 240, "", 100);#PB_ListView_MultiSelect);|$4000)
  ListIconGadget(3, 20, 270, 200, 240, "", 100);#PB_ListView_MultiSelect)
  ListIconGadget(4, 240, 270, 200, 240,"", 100); #PB_ListView_MultiSelect)
 
  For i = 1 To 10:  AddGadgetItem(1,-1, "Item  "+Str(i-1)):  Next i
  For i = 1 To 5:   AddGadgetItem(2,-1,"Item  "+Str(i-1)):  Next i
  For i = 1 To 3:   AddGadgetItem(3,-1,"Item  "+Str(i-1)):  Next i
 
  Repeat
      Event.l = WaitWindowEvent()
    GID = EventGadget()
;     Debug "       "+Str(aaa):aaa+1
;     Debug Event
;If GID: Debug "........  "+Str(GID)+"  "+Str(GetGadgetState(GID)):EndIf
 
If Event=49310:
   ;Debug "ФОКУС ВВОДА даных"
      ;  Debug GID
        ;If GID: SetGadgetState(GID, -1):EndIf
;        ; SetGadgetState(2, -1)
;         SetGadgetState(3, -1)
;         SetGadgetState(4, -1)
EndIf
       
     If Event = #PB_Event_Gadget
            ;    Debug "1111111"
                Select GID
                    Case 1
                       
                    Case 2
                    Case 3
                EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
 


_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListView
СообщениеДобавлено: Вт авг 28, 2018 6:22 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 455
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
balex1978
Цитата:
Можеш выложить полностью

Извини, нет. Потому что вариант - "дубовый" (по типу как в первом сообщении). C callback'ом не получилось, а менять на ListIconGadget не стал.
Вопрос про "забыть" ранее отмеченный пункт в неактивном гаджете решил его перезаполнением, например при переходе с LV2 в LV1/2/3:
Код:
1
2
3
4
ClearGadgetItems(2)
ForEach LV2()
  AddGadgetItem(2,-1, LV2()\content)
Next


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

Вопрос про избавиться от пунктирной рамки, когда клик не по элементу тоже решил. Путём перевода фокуса.
Код:
1
2
; убрать фокус со всех гаджетов
SetActiveGadget(-1)


Единственное... с пустого LV пунктирная рамка таким образом почему-то не убирается. Получается выделенная первая строка (пустая). Но это уже мелочь/придирки.

Вопрос про выяснение предыдущего активного LV, чтобы при переходе на другой LV не очищать/перезаполнять все три LV, а только один - решился сам собой.
Для этого пришлось вместо одной переменной mark использовать 4 (для каждого LV - своя).

НЕКРАСИВО? Много лишних переменных/процедур?
Может быть. Зато работает примерно так, как ожидалось. Ну и главное конечно же то, что доп. переменные не вызывают никакой путанницы/не затрудняют читаемость.
Вот например, чем плоха глобальная переменная и почему их стараются не плодить без надобности? Сама по себе не чем. Разве что нужно помнить в какой из процедур она могла принять изменённое значение.

Тему можно закрыть, так как смотрю никому не интересно. Да и вопросы решены.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListView
СообщениеДобавлено: Вт авг 28, 2018 6:50 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 694
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
knower писал(а):
Разве что нужно помнить в какой из процедур она могла принять изменённое значение.

а кто мешает все глобальные писать в одном месте, а не по всем файлам раскидывать и на каждую писать комент, где используется и зачем нужна
в таком случае проще понять какую из переменных можно использовать в разных местах, и переменных будет меньше, мелочь конечно
knower писал(а):
Вот например, чем плоха глобальная переменная и почему их стараются не плодить без надобности? Сама по себе не чем.

все говорят что это плохо, но ни кто не объясняет чем плохо


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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 8


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

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