purebasic.info

PureBasic forum
Текущее время: Чт июл 19, 2018 12:51 am

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 3:12 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июн 10, 2015 7:30 pm
Сообщений: 33
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Похоже что только я задаю вопросы в данной ветке форума. Но читают. Это значит не безнадежно!
Вопрос следующий... Есть ListIconGadget. В него загружается список файлов из каталога. Его необходимо отсортировать.
Причем имена фалов состоят из цифр (по ним и сортируется).
Нашел кое-что на форумах, но под windows. Есть какое-либо решение с "малой кровью".
Приятно одно (но зато как!!!) - PureBasic нравится все больше и больше. Теперь только разобраться-бы с ним.
Заранее всем спасибо!

P.S. Пока решил проблему через NewList. Загружаю в него, сортирую, выгружаю в ListIconGadget.
Насколько это правильно и рационально - не знаю...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 6:42 pm 
Не в сети
PureBasic Coder
Аватар пользователя

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 7:55 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июн 10, 2015 7:30 pm
Сообщений: 33
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Да, вроде бы, все устраивает.
Единственное - мне надо вывести фото, имя файла и его размер. Фото как иконка + имя файла как NewList. Теряется размер файла.
Сортировку со структурой сделать не удалось. Или я что-то пропустил?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 8:26 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Ну-ка попробуй, у меня линя нет, проверить не могу
Код:
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
Structure ListElement
  Text$
  Size.q
  Icon.l
EndStructure
 
Global NewList ListElements.ListElement()
 
Procedure$ FormatFileSize(Size.q) ;Форматировать размер файла
  If Size > 0 And Size < 1024
    ProcedureReturn StrD(Size,0) + " б"
  ElseIf Size >= 1024 And Size < 1048576
    ProcedureReturn StrD(Size/1024.0,2) + " КБ"
  ElseIf Size >= 1048576 And Size < 1073741823
    ProcedureReturn StrD(Size/1048576.0,2) + " МБ"
  ElseIf size > 1073741824
    ProcedureReturn StrD(Size/1073741824.0,2) + " ГБ"
  Else
    ProcedureReturn "0 б"
  EndIf
EndProcedure
 
Procedure ListUpdate(Gadget)
  ClearGadgetItems(Gadget)
  ForEach ListElements()
    AddGadgetItem(Gadget, -1, ListElements()\Text$ + Chr(10) + FormatFileSize(ListElements()\Size), ListElements()\Icon)
  Next
EndProcedure
 
Procedure ListAdd(Text$, FileSize.q, Icon.l)
  AddElement(ListElements())
  With ListElements()
    \Text$ = Text$
    \Size = FileSize
    \Icon = Icon
  EndWith
EndProcedure
 
Procedure ListDelete(Position) ;First element has position 0
  SelectElement(ListElements(), Position)
  DeleteElement(ListElements(), 1)
EndProcedure
 
Procedure Sort(Gadget, Column, Option)
  ;Column: 0 - name, 1 - size
  ;Option: #PB_Sort_Ascending или #PB_Sort_Descending
  Select Column
    Case 0
      SortStructuredList(ListElements(), Option | #PB_Sort_NoCase, OffsetOf(ListElement\Text$), #PB_String)
    Case 1
      SortStructuredList(ListElements(), Option, OffsetOf(ListElement\Size), #PB_Quad)
  EndSelect
  ListUpdate(Gadget)
EndProcedure
 
OpenWindow(1, 200, 200, 400, 400, "")
ListIconGadget(1, 5, 5, 390, 390, "File", 200)
AddGadgetColumn(1, 1, "Size", 180)
 
ListAdd("File000", 56, 0)
ListAdd("File001", 36, 0)
ListAdd("File002", 142, 0)
ListAdd("File003", 1633, 0)
ListAdd("File004", 423334, 0)
ListAdd("File005", 1336, 0)
ListAdd("File006", 1, 0)
ListAdd("File007", 75786776, 0)
ListAdd("File008", 3231, 0)
ListAdd("File009", 6566, 0)
 
ListUpdate(1)
 
;==================================
;Демонстрация сортировки
 
MessageRequester("", "Сейчас мы отсортируем по размеру по возрастанию")
Sort(1, 1, #PB_Sort_Ascending)
 
MessageRequester("", "Сейчас мы отсортируем по размеру по убыванию")
Sort(1, 1, #PB_Sort_Descending)
 
MessageRequester("", "Сейчас мы отсортируем по имени по убыванию")
Sort(1, 0, #PB_Sort_Descending)
 
MessageRequester("", "Сейчас мы отсортируем по имени по возрастанию")
Sort(1, 0, #PB_Sort_Ascending)
 
Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 8:36 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июн 10, 2015 7:30 pm
Сообщений: 33
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
РАБОТАЕТ!!!

Почему я раньше не сталкивался с PureBasic-ом?
Просто отличная (уникальная) система. Накоплю малую толику золотого запаса и куплю официально.
Буду осваивать основательно. Почему только Linux-овый не дают "задаром", а в нагрузку к windows-овому. А он мне не нужен.

ОГРОМНОЕ СПАСИБО!!!

ЗЫ Посмотрел SortStructuredList(). Оказывается есть такая штука.
Все проблемы от незнания :(
Может быть можно и колонки выравнивать?


Последний раз редактировалось sedoyded Чт июл 16, 2015 8:50 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 8:49 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Цитата:
Почему только Linux-овый не дают "задаром", а в нагрузку к windows-овому. А он мне не нужен.
Лицензия такая - платишь 79 евро, и получаешь все текущие версии для всех платформ + все будущие

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 8:52 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июн 10, 2015 7:30 pm
Сообщений: 33
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Это я знаю. Но для пенсионера это сумма. Ее надо накопить.
Цель есть. Надо копить.
Спасибо!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 9:22 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Цитата:
Может быть можно и колонки выравнивать?
Если имеется ввиду изменять ширину, то
Код:
1
SetGadgetItemAttribute(#Gadget, 0, #PB_ListIcon_ColumnWidth, Width, Column)


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 9:28 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июн 10, 2015 7:30 pm
Сообщений: 33
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Нет, Никита.
Я имею в виду, допустим, одна колонка выровнена по левой стороне, а вторая по правой. Третья по центру.
Под винду описания библиотек попадались. А под линукс - увы...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 9:31 pm 
Не в сети
PureBasic Coder
Аватар пользователя

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Чт июл 16, 2015 10:19 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср июн 10, 2015 7:30 pm
Сообщений: 33
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Это я догадался. А с GTK разобраться для меня это уже запредельное.
Есть описание, а как все это реализовать? С этим я смогу разобраться, мягко говоря, не очень скоро.
А за ListIconGadget еще раз просто огромное спасибо!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Пт июл 17, 2015 3:10 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 880
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Всё же я не уловил мысль
Есть ListIconGadget(), почему бы не сделать структурированный массив, который дублирует содержание в листе. Сортировать массив и переписывать весь лист. Методы быстрой перерисовки листа есть на форуме. Ну а сортировка не по экзотическим параметрам, это вообще в одну строку.

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Пт июл 17, 2015 1:56 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
m0t0d0r писал(а):
Есть ListIconGadget(), почему бы не сделать структурированный массив, который дублирует содержание в листе. Сортировать массив и переписывать весь лист. Методы быстрой перерисовки листа есть на форуме. Ну а сортировка не по экзотическим параметрам, это вообще в одну строку.

Сортировка через функцию SortStructuredArray() работает корректно лишь для одномерного массива, Array(N)\FieldStructure. Для двумерного Array(Line,Column)\FieldStructure уже глючит, "вылезает" за пределы отведённой массиву памяти и сортирует неправильно. Можно, конечно, играться назначением каждой колонке ListIconGadget() соответствующего поля в структуре, но как добавлять\удалять столбцы таблицы? Также проблемы возникнут, если захочется сделать перетаскивание строк методом Drag & Drop, ведь свопирование структурированный массив не поддерживает. Однако сказанное означает лишь, что нельзя пользоваться функциями PureBasic напрямую. Да и алгоритм сортировки массива должен давать одинаковый результат с сортировкой самого ListIconGadget().
Лучше всего, ИМХО, добавить ещё одну (служебную) колонку к таблице и заполнить её номерами строк по порядку. Колонку скрыть, дав ей нулевую ширину. Теперь после манипуляций (сортировка и т.п.) всегда можно узнать "адрес" строки структурированного массива из этой 0-й колонки:
Val(GetGadgetItemText(ListIconGadget,Row,0)).
Свопирование массива делается через собственную процедуру:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Structure CellTable
  ColorFront.l
  ColorBack.l
  Selected.l
EndStructure
 
Global Dim ArrayMyTable.CellTable(RowMax,ColumnNax); Размерность RowMax д.б. на 1 больше, чем строк в таблице
 
Procedure SwapArray(GadgetID,Array ArrayTable.CellTable(2),ItemI,ItemII,Column)
  Static iMax
  iMax=ArraySize(ArrayTable(),1) ; № последней, служебной, строки массива. Там хранится временная информация.
  ArrayTable(iMax,Column)\ColorFront=ArrayTable(ItemII,Column)\ColorFront
  ArrayTable(iMax,Column)\ColorBack =ArrayTable(ItemII,Column)\ColorBack
  ArrayTable(iMax,Column)\Selected  =ArrayTable(ItemII,Column)\Selected
 
  ArrayTable(ItemII,Column)\ColorFront=ArrayTable(ItemI,Column)\ColorFront
  ArrayTable(ItemII,Column)\ColorBack =ArrayTable(ItemI,Column)\ColorBack
  ArrayTable(ItemII,Column)\Selected  =ArrayTable(ItemI,Column)\Selected
 
  ArrayTable(ItemI,Column)\ColorFront=ArrayTable(iMax,Column)\ColorFront
  ArrayTable(ItemI,Column)\ColorBack =ArrayTable(iMax,Column)\ColorBack
  ArrayTable(ItemI,Column)\Selected  =ArrayTable(iMax,Column)\Selected
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Пт июл 17, 2015 3:27 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Цитата:
Лучше всего, ИМХО, добавить ещё одну (служебную) колонку к таблице и заполнить её номерами строк по порядку. Колонку скрыть, дав ей нулевую ширину. Теперь после манипуляций (сортировка и т.п.) всегда можно узнать "адрес" строки структурированного массива из этой 0-й колонки:
Зачем такие сложности, если есть SetGadgetItemData ? Там и храните адрес строки.
P.S. Списком куда проще обойтись. Как-то так
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Structure Element
   ElID.l
   Text$
   Icon.l
EndStructure
 
Structure Column
   ColID.l
   List Elements.Element()
EndStructure
 
Structure ListIcon
   List Columns.Column()
EndStructure

Ну и сортируйте наздоровье

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ListIconGadget с сортировкой
СообщениеДобавлено: Пт июл 17, 2015 3:59 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Никита Однороб писал(а):
Зачем такие сложности, если есть SetGadgetItemData ? Там и храните адрес строки.
...Ну и сортируйте наздоровье

Увы, при использовании библиотеки "PureLVSORT" от Gnozal (шикарная вещь! Только не знаю, пойдёт ли на Linux) после сортировки GetGadgetItemData() возвращает № ТЕКУЩЕЙ СТРОКИ, бесполезный. Всё затирается.
Но, раз уж такая тема, поделюсь соображениями. Проще всего, конечно, дополнительные атрибуты ячеек прикрутить к самим ячейкам ListIconGadget. Но незадача: стандартные структуры, скажем, LVITEM, не допускают добавления пользовательских полей. Я пробовал обойти это через Extended-расширение со своей структурой, но облом. Поэтому мыслится так: находится массив самого ListIconGadget() средствами "высшей математики" и к нему прикрепляется своя структура. В ней также должны быть поля:
mask.l
iItem.l
iSubItem.l
state.l
...
и т.д., и в том же порядке, но также и свои. Затем уж можно пользоваться этой своей структурой и наслаждаться возможностями PureBasic. Возможно ли и почему нет?


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

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


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

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


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

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