[Цитировать]

    motorboy
  • 41869
  • Стаж: 1 месяц 10 дней
  • Сообщений: 63
  • Репутация:14

    [+] [-]
Простой лаунчер для запуска портативных программ.
Поддерживает Drag&Drop. Позволяет запускать программы от имени Администратора и от имени Системы с правами TrustedInstaller.
Если запускать программу удерживая клавишу Shift она запустится от имени администратора если удерживать CTRL+Shift запустится от имени системы. Если удерживать клавишу ALT - то запустится без ключей командной строки.
Позволяет добавлять программы перетаскиванием из проводника Windows. Если вы перетащите файл на правую панель, программа добавится в текущую выделенную категорию.
Если перетащите на левую панель, программа добавится в ту категорию на которую вы её бросите.
Также чтобы сменить категорию перетащите программы из правой панели на категорию в левую панель.
Категории можно сортировать перетаскиванием. Программы сортируется автоматически по алфавиту.
Также вы можете добавлять системные утилиты Windows. Но это можно делать только вручную. Выберите "Добавить программу" и для например "Панели управления" впишите "Control". Утилита сама найдёт нужный файл и запустить его.
В лаунчере можно использовать в путях переменные окружения (%WINDIR% %USERPROFILE% %SystemRoot% и т.д.).
В файлах и папках добавленных в лаунчер проверяются пути, и если в них есть пути из переменных окружения - они подставляются в путь к файлу\папке. Например если добавить папку "Рабочий стол" - то путь будет выглядеть так "%USERPROFILE%\Desktop".
Так же переменные окружения можно использовать в параметрах коммандной строки.
Например что бы открть файл "Hosts" на любом компьютере заполните поля приложения так:
"Путь к программе\файлу" - %SystemRoot%\System32\Notepad.exe
"Параметры коммандной строки" - %SystemRoot%\System32\drivers\etc\hosts
Для показа окна лаунчера используйте комбинацию клавиш CTRL+пробел или выберите горячую клавишу в настройках.
Другие клавиши:
CTRL+F - делает активной строку поиска.
CTRL+D - дублировать текущую выделенную программу (если нужно добавить одну и ту же прогу в разные группы).
CTRL+N - Добавить программу или группу.
CTRL+E - Редактировать программу или переименовать группу.
CTRL+S - Открыть окно настроек
CTRL+I - Открыть окно информации.
Shift-F10 - вызов контекстного меню для групп\программ.
Стрелка вправо\влево делают активными соответственно правую и левую панель.
Клавиши вверх\вниз - перемещение по списку групп\программ.
ENTER - запуск текущей выделенной программы.
DEL - удалить текущую выделенную программу или группу, очистить строку поиска.
Если есть идеи что можно добавить в лаунчер - пишите в комментариях. Постараюсь сделать все на что хватит знаний.
История версий - текущая 1.6.4
Версия 1.1 ======================================
Добавлена возможность запуска программ одним щелчком мыши.
Добавлена возможность запуска программ без ключей.
Добавлено сворачивание лаунчера в трей и горячая клавиша для показа окна (по умолчанию CTRL+пробел но можно изменить в настройках).
Добавлена возможность добавления нескольких файлов перетаскиванием из проводника Windows.
Добавлена возможность изменить размер шрифта для панелей. Позже попробую сделать изменение размера иконок.
Версия 1.2 ======================================
-Добавлено Hover меню в трее.
-Добавлен 12 размер шрифта (может кому пригодится).
-Теперь в режиме запуска одним щелчком мышки при наведении курсора на прогу показывается описание.
-Добавлен запуск без ключей для Администратора и Системы.
-Исправлены вылеты и баги при удалении программ клавишей Del.
Добавлен фильтр скрытия программ для:
-WindowsPE
-Windows normal
-Windows x86
-Windowsx64
Скрытые программы будут отображаться при поиске и при отображении всех программ. Их фон будет подсвечен красным цветом.
Версия 1.3 =====================================
-Добавлена возможность выбора шрифта для панелей и интерфейса.
-Добавлена возможность изменять цвет шрифта и фона главного окна.
-При первом запуске теперь можно выбрать язык лаунчера.
-Добавлена возможность экспорта ярлыков группы. Нажмите правую кнопку мыши на группе удерживая клавишу Shift.
-Добавлена возможность добавлять в лаунчер папку с программами. Перетащите папку на список групп. Она добавится в список и в нее будут добавлены все найденные в ней и подпапках .exe,.lnk,.bat,.cmd файлы.
-Добавлена возможность поменять местами кнопки мыши для меню в трее.
-Добавлена возможность добавлять лаунчер в автозагрузку Windows.
-При удалении группы теперь можно удалить все программы из этой группы.
-Изменен внешний вид главного окна. Добавлена в список групп, группа "Все программы".
-Теперь иконки программ можно сохранять в кеше. Значительно увеличивается скорость загрузки лаунчера. Особенно на медленных флешках или дисках.
-Теперь лаунчер идет в двух вариантах х64 и х86. В х86 на 64 битных Windows не загружаются иконки некоторых файлов. В х64 все в порядке.
Из за добавления группы "Все программы" при первом запуске продублируются группы "Избранное" и "Без категрии". Просто удалите их.
Исправил все баги о которых сообщали пользователи (я надеюсь).
Так же добавил почти все о чем просили. Если не будет новых багов, то займусь добавлением функции WPI в лаунчер.
Версия 1.4 =====================================
-Теперь в лаунчере можно использовать в путях переменные окружения (%WINDIR% %USERPROFILE% %SystemRoot% и т.д.).
В файлах и папках добавленных в лаунчер проверяются пути, и если в них есть пути из переменных окружения - они подставляются в путь к файлу\папке. Например если добавить папку "Рабочий стол" - то путь будет выглядеть так "%USERPROFILE%\Desktop".
Так же переменные окружения можно использовать в параметрах коммандной строки.
Например что бы открть файл "Hosts" на любом компьютере заполните поля приложения так:
"Путь к программе\файлу" - %SystemRoot%\System32\Notepad.exe
"Параметры коммандной строки" - %SystemRoot%\System32\drivers\etc\hosts
-Добавлен фильтр расширений файлов добавляемых при перетаскивании папки на панель групп. Добавить\убрать расширения можно в настройках.
-Изменен поиск программ. Теперь если в строке поиска перва буква заглавня - то поиск будет от начала имени программы (если буквы из строки поиска сопадают с первыми буквами в имени программы). Если строчная - то будет искаться в любом менсте имени программы.
-Добавлена возможность включать показ сетки линий в списках и раскраска списка зеброй. Включается в настройках.
-Добавлена возможность изменять иконку отображаемую в заголовках окон, панели задач, трее. что бы это работало - поместите иконку с именем "SimpleLauncher.ico" в папке лаунчера.
-Теперь описание программы можно редактировать в главном окне. Добавьте или измените описание и нажмите CTRL+S для сохранения.
-Теперь лаунчер запоминает стили выбраных шрифтов.
-Добавлена возможность выбопа цвета подсветки для списка групп\программ.
-Возвращена возможность добавлять папки в список программ.
-Исправлены все баги о которых сообщали пользователи и те которые нашел сам.
Перенес параментры шрифтов в ini в отдельную группу. Поэтому при первом запуске новой версии лаунчера у вас слетят настройки шрифтов.
Версия 1.5 =====================================
-Исправлено отображение раскраски зеброй и разделительных линий в панелях.
-Цвет подсветки по умолчанию теперь зеленый
-Кастомная подсветка теперь работает и без включения смены цвета для панелей.
-Увеличено расстояние между иконкой и названием групп.
-Исправлено добавление корневых папок дисков (С:\ D:\ и т.д.)
-Добавлена раскраска зеброй панели групп.
-Добавлена возможность настраивать контрастность разделительных линий,раскраски зеброй и подсветки.
-Добавлен виджет для лаунчера.
При запуске лаунчера он появляется на рабочем столе (если включено показывать виджет при запуске лаунчера). Его можно поместить в любом месте рабочего стола. Перемещать его можно левой кнопкой мыши. Двойной клик - показать\скрыть лаунчер. Правый клик - показ hover меню.
По умолчанию изображение виджета - иконка лаунчера.
Можно использовать свое изображение для виджета. Для этого поместите в папку лаунчера изображение в формате PNG и именем SimpleLauncher.png (!!! В PNG файле обязательно должен быть канал прозрачности иначе виджет не будет отображаться !!!). Размер изображения подбирайте на свое усмотрение. При DPI рабочего стола 125% - размер 64х64 пикселя будет примерно как иконка самого лаунчера. Изображение не обязательно должно быть квадратным. Клики мышки по гаджету срабатывают только в непрозрачных местах гаджета. Но в настройках можно включить срабатывание кликов по всей площади гаджета.
!!! Перенес настройки цвета в отдельную группу в INI файле. Поэтому при первом запуске у вас слетят настройки цвета главного окна !!!
Версия 1.5.6 =====================================
Исправил невозможность запуска программ с относительными путями при запуске лаунчера из автозагрузки Window.
Добавил выбор глубины сканирования папок при добавлении папки в список групп.
Теперь если вы добавляете папку в список программ (правая панель) с зажатой клавишей "Shift" будет предложено добавить файлы из этой папки в текущую группу (так же будет предложено выбрать глубину сканирования).
Запретил добавление логических дисков в панель групп и при добавлении в панель программ с зажатой клавишей Shift.
Добавил возможность выбора показа виджета при запуске в обычной Windows и WinPE.
Вернул подсказки по горячим клавишам в менюшки.
Добавил возможность указывать рабочую папку для программ (из ярлыков при перетаскивании берется автоматически если есть).
Версия 1.6 =====================================
Исправлено:
Когда тянешь папку с шифтом в окно прог в папку без категорий, добавляются файлы только во все программы.
Редкие вылеты при удалении программ из списка.
Добавлено:
Добавлен пункт показа виджета "кроме WinPE".
Добавлена возможность для перетягивания из программ с низшими правами в проги с высшими правами (Не проверено).
При добавлении папки в список групп и в список программ (с Shift-ом), первое окно с сообщением (добавить/отменить) убрано.
Добавлены переменные окружения и относительный путь для рабочей папки.
Добавлена опция скрывать программу в версии Windows ниже 10.
Добавлены пункты в меню лаунчера - "Добавить программы из Меню Пуск" и "Удалить отсутствующие программы".
Добавлена возможность изменять размер иконок. (от 16х16 до 64х64). Очистите кеш иконок!. При следующем запуске лаунчер загрузит иконки заново в более высоком качестве(загрузка может быть долгой!).
Увеличена на порядок скорость отображения списка программ (через WinApi).
Версия 1.6.4 =====================================
Исправлена проблема со шрифтами в главном окне при открытии окна редактирования.
Добавлена опция скрытия виджета в полноэкранном режиме (см. в настройках). Переделан код определения полноэкранного режима. Теперь должно работать в WinRE.
Исправлены баги с переменными окружения для х64 и х86 приложений.
Добавлена опция - отображать отсутствующие программы в конце списка (см. в настройках).
Исправлено несколько найденных багов. Оптимизация.
Ссылка для скачивания v1.6.4
https://drive.google.com/file/d/1h9GwNDhPHc0UPxK0VU...view?usp=sharing
https://disk.yandex.ru/d/5uwnwU6a86ch4A
Скриншоты


Последний раз редактировалось: motorboy (Вчера, в 18:17), всего редактировалось 37 раз(а)

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 8 лет 1 месяц
  • Сообщений: 1408
  • Репутация:127

    [+] [-]
106804-переделать сортировку списка программ в категориях
Удалось сделать сортировку, добавив флаг sort=1, у меня есть сокращённые примеры (всего 60 строк), но оказалось там задействуются ассоциативные значения пункта (SetGadgetItemData), а они у меня уже заняты указателями на структуры данных пункта. Просто в данные засунул флаг, он должен быть первым в структуре, тогда в функции я могу его принять из структуры.

код сортировки

EnableExplicit
Structure PB_ListIconItem
  UserData.i
EndStructure
#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54
#LVM_GETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 55
Global ListIconGadget, lvi.LV_ITEM
Procedure CompareFunc(*item1.PB_ListIconItem, *item2.PB_ListIconItem)
  Protected *Buffer1, *Buffer2, *Seeker1, *Seeker2, result, done, char1, char2
  *Buffer1 = AllocateMemory(512 * SizeOf(Character))
  *Buffer2 = AllocateMemory(512 * SizeOf(Character))
  result = 0
  lvi\iSubItem = 0
  lvi\pszText = *Buffer1
  lvi\cchTextMax = 512
  lvi\Mask = #LVIF_TEXT
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item1\UserData, @lvi)
  lvi\pszText = *Buffer2
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item2\UserData, @lvi)
  *Seeker1 = *Buffer1
  *Seeker2 = *Buffer2
  done = 1
  While done
    char1 = Asc(UCase(Chr(PeekC(*Seeker1))))
    char2 = Asc(UCase(Chr(PeekC(*Seeker2))))
    result =(char1 - char2)
    If result <> 0 Or (*Seeker1 - *Buffer1) > 511 * SizeOf(Character)
      done = 0
    EndIf
    *Seeker1 + SizeOf(Character)
    *Seeker2 + SizeOf(Character)
  Wend
  FreeMemory(*Buffer1)
  FreeMemory(*Buffer2)
  ProcedureReturn result
EndProcedure
Procedure UpdatelParam()
  Protected i, tmp
  tmp = GetDlgCtrlID_(ListIconGadget)
  For i = 0 To SendMessage_(ListIconGadget, #LVM_GETITEMCOUNT, 0, 0) - 1
    SetGadgetItemData(tmp, i, i)
  Next
EndProcedure
If OpenWindow(0, 384, 288, 640, 480, "ListIconGadget сортировка", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
  Define LVWidth = 190
  Define LVCWidth = 60
  ListIconGadget = ListIconGadget(0, 0, 0, LVWidth, 222, "Кол 0", LVCWidth, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #LVS_NOCOLUMNHEADER)
  AddGadgetItem(0, 0, "Zzz 1")
  AddGadgetItem(0, 1, "Bab 2")
  AddGadgetItem(0, 2, "Abb 3")
  AddGadgetItem(0, 3, "Aab 4")
  AddGadgetItem(0, 4, "Aaa 5")
  UpdatelParam()
  SendMessage_(ListIconGadget, #LVM_SORTITEMS, 0, @CompareFunc())
  Repeat
    ;     EventID = WaitWindowEvent()
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
Если у тебя используется указатель на элемент списка в SetGadgetItemData() как у меня могу скинуть готовый пример, это чуть легче чем выковыривать из моего кода.

[Цитировать]

    Mazahaka_lab
  • 1832
  • Стаж: 10 лет
  • Сообщений: 154
  • Репутация:22

    [+] [-]
AZJIO, aa
В вашем коде есть несколько проблем. Главная из них — в процедуре CompareFunc вы используете PeekC() для чтения символов, но в PureBasic (под Windows по умолчанию используется Unicode) символы занимают 2 байта. Из-за этого сравнение работает неправильно. Может лучше так ?
EnableExplicit
Structure PB_ListIconItem
  UserData.i
EndStructure
#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54
#LVM_GETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 55
Global ListIconGadget, lvi.LV_ITEM
Procedure CompareFunc(*item1.PB_ListIconItem, *item2.PB_ListIconItem)
  Protected *Buffer1, *Buffer2, result, i, maxLen
  Protected str1$, str2$
  ; Выделяем память для буферов
  *Buffer1 = AllocateMemory(1024)
  *Buffer2 = AllocateMemory(1024)
  If Not *Buffer1 Or Not *Buffer2
    If *Buffer1 : FreeMemory(*Buffer1) : EndIf
    If *Buffer2 : FreeMemory(*Buffer2) : EndIf
    ProcedureReturn 0
  EndIf
  ; Получаем текст из первого элемента
  lvi\iSubItem = 0
  lvi\pszText = *Buffer1
  lvi\cchTextMax = 512
  lvi\Mask = #LVIF_TEXT
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item1\UserData, @lvi)
  ; Получаем текст из второго элемента
  lvi\pszText = *Buffer2
  SendMessage_(ListIconGadget, #LVM_GETITEMTEXT, *item2\UserData, @lvi)
  ; Преобразуем в строки PureBasic для правильного сравнения
  str1$ = PeekS(*Buffer1)
  str2$ = PeekS(*Buffer2)
  ; Сравниваем строки без учёта регистра
  result = CompareMemoryString(@str1$, @str2$, #PB_String_NoCase)
  ; Очищаем память
  FreeMemory(*Buffer1)
  FreeMemory(*Buffer2)
  ProcedureReturn result
EndProcedure
Procedure UpdatelParam()
  Protected i, tmp
  tmp = GetDlgCtrlID_(ListIconGadget)
  For i = 0 To SendMessage_(ListIconGadget, #LVM_GETITEMCOUNT, 0, 0) - 1
    SetGadgetItemData(tmp, i, i)
  Next
EndProcedure
If OpenWindow(0, 384, 288, 640, 480, "ListIconGadget сортировка", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
  Define LVWidth = 190
  Define LVCWidth = 60
  ListIconGadget = ListIconGadget(0, 0, 0, LVWidth, 222, "Кол 0", LVCWidth, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  AddGadgetItem(0, -1, "Zzz 1")
  AddGadgetItem(0, -1, "Bab 2")
  AddGadgetItem(0, -1, "Abb 3")
  AddGadgetItem(0, -1, "Aab 4")
  AddGadgetItem(0, -1, "Aaa 5")
  AddGadgetItem(0, -1, "abc 6")
  AddGadgetItem(0, -1, "ABc 7")
  UpdatelParam()
  ; Сортируем
  SendMessage_(ListIconGadget, #LVM_SORTITEMS, 0, @CompareFunc())
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
  CloseWindow(0)
EndIf
End
1.Использование PeekS() — вместо ручного посимвольного сравнения теперь используется PeekS() для получения полноценной строки PureBasic, а затем CompareMemoryString() для сравнения.
2.Проверка выделения памяти — добавлена проверка на успешное выделение памяти.
3.Исправление цикла событий — ваш цикл событий был написан с ошибкой (два WaitWindowEvent() подряд). Теперь он корректный.
4.Добавлены тестовые строки — добавлены строки в разном регистре для проверки сортировки без учёта регистра.

Информация от Ander_73


"Простыни" кода прячем под спойлер, плз.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 8 лет 1 месяц
  • Сообщений: 1408
  • Репутация:127

    [+] [-]
106818вы используете PeekC() для чтения символов, но в PureBasic (под Windows по умолчанию используется Unicode)
PeekC() читает 2 байта в юникодной программе, а PureBasic компилирует сейчас только в юникоде.
106818два WaitWindowEvent() подряд
один из которых закомментированный.
Код с указателем на элемент списка выглядит так

код сортировки

EnableExplicit
#LIG = 0
#Window = 0
;- ● Structure
Structure Program
  isort.i ; индекс сортировки должен быть первым в списке структуры
  name.s
  path.s
  *p
EndStructure
Define NewList Program.Program()
Define *p, i, j
Procedure Compare_item(*i1.Program, *i2.Program)
  Protected *Buffer1, *Buffer2, *Seeker1, *Seeker2, result, done, char1, char2
  Protected lvi.LV_ITEM
  *Buffer1 = AllocateMemory(512 * SizeOf(Character))
  If Not *Buffer1
    ProcedureReturn result
  EndIf
  *Buffer2 = AllocateMemory(512 * SizeOf(Character))
  If Not *Buffer2
    FreeMemory(*Buffer1)
    ProcedureReturn result
  EndIf
  result = 0
  lvi\iSubItem = 0
  lvi\pszText = *Buffer1
  lvi\cchTextMax = 512
  lvi\Mask = #LVIF_TEXT
  SendMessage_(GadgetID(#LIG), #LVM_GETITEMTEXT, PeekI(*i1\isort), @lvi)
  lvi\pszText = *Buffer2
  SendMessage_(GadgetID(#LIG), #LVM_GETITEMTEXT, PeekI(*i2\isort), @lvi)
  *Seeker1 = *Buffer1
  *Seeker2 = *Buffer2
  done = 1
  While done
    char1 = Asc(UCase(Chr(PeekC(*Seeker1))))
    char2 = Asc(UCase(Chr(PeekC(*Seeker2))))
    result =(char1 - char2)
    If result <> 0 Or (*Seeker1 - *Buffer1) > 511 * SizeOf(Character)
      done = 0
    EndIf
    *Seeker1 + SizeOf(Character)
    *Seeker2 + SizeOf(Character)
  Wend
  FreeMemory(*Buffer1)
  FreeMemory(*Buffer2)
  ProcedureReturn result
EndProcedure
Procedure UpdatelParam()
  Protected i, *p.Program
  For i = 0 To CountGadgetItems(#LIG) - 1
    *p = GetGadgetItemData(#LIG, i)
    *p\isort = i
  Next
EndProcedure
If OpenWindow(#Window, 384, 288, 640, 480, "ListIconGadget sorting", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
  ListIconGadget(#LIG, 0, 0, 190, 222, "", 60, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #LVS_NOCOLUMNHEADER)
  j = 80
  For i = 0 To 5
    *p = AddElement(Program())
    If *p
      Program()\name = Chr(j) ; + Chr(Random(122, 97))
      Program()\p = *p
      AddGadgetItem(#LIG, i, Program()\name)
      SetGadgetItemData(0, i, *p)
      j - 1
    EndIf
  Next
  UpdatelParam()
  SendMessage_(GadgetID(#LIG), #LVM_SORTITEMS, 0, @Compare_item())
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
1068181.Использование PeekS() — вместо ручного посимвольного сравнения теперь используется PeekS() для получения полноценной строки PureBasic, а затем CompareMemoryString() для сравнения.
Да, так выглядит компактней, хотя сути не меняет. Обычно я мог бы использовать посимвольный анализатор строки, но этот код просто был когда то взят откуда-то и применён сначала в ChkDskGui, потом подрезал от колонок и числового сравнения. Так что он ещё содержал частично концепцию предыдущего автора.
А почему так не сделал?
result = CompareMemoryString(*Buffer1, *Buffer2, #PB_String_NoCase)
Зачем загонять в переменную, а потом снова брать указатель?
Ну я ещё изменение сделал, с комментарием
lvi\cchTextMax = 510 ; укорачиваем число символов, чтобы иметь гарантированный 00 в конце строки
  lvi\Mask = #LVIF_TEXT
  SendMessage_(GadgetID(#LIG), #LVM_GETITEMTEXT, PeekI(*i1\isort), @lvi)
  lvi\pszText = *Buffer2
  SendMessage_(GadgetID(#LIG), #LVM_GETITEMTEXT, PeekI(*i2\isort), @lvi)
  ; Сравниваем строки без учёта регистра, и продолжает пока не встретит 00
  result = CompareMemoryString(*Buffer1, *Buffer2, #PB_String_NoCase)

[Цитировать]

    Mazahaka_lab
  • 1832
  • Стаж: 10 лет
  • Сообщений: 154
  • Репутация:22

    [+] [-]
106819result = CompareMemoryString(*Buffer1, *Buffer2, #PB_String_NoCase)
Действительно. PureBasic не моя стихия . Мне больше Delphi по душе . Вот переписал компактнее
EnableExplicit
#LIG = 0
#Window = 0
Structure Program
  isort.i
  name.s
  path.s
  *p
EndStructure
Define NewList Program.Program()
Define *p, i
Procedure CompareItems(*item1.Program, *item2.Program)
  Protected buffer1.s = Space(512)
  Protected buffer2.s = Space(512)
  ; Получаем текст из первого элемента
  SendMessage_(GadgetID(#LIG), #LVM_GETITEMTEXT, PeekI(*item1\isort),
               @lvi.LV_ITEM\iSubItem = 0\pszText = @buffer1\cchTextMax = 512\Mask = #LVIF_TEXT)
  ; Получаем текст из второго элемента
  SendMessage_(GadgetID(#LIG), #LVM_GETITEMTEXT, PeekI(*item2\isort),
               @lvi.LV_ITEM\iSubItem = 0\pszText = @buffer2\cchTextMax = 512\Mask = #LVIF_TEXT)
  ; Сравниваем строки без учёта регистра
  ProcedureReturn CompareMemoryString(@buffer1, @buffer2, #PB_String_NoCase)
EndProcedure
Procedure UpdateItemIndices()
  Protected i, *p.Program
  For i = 0 To CountGadgetItems(#LIG) - 1
    *p = GetGadgetItemData(#LIG, i)
    If *p
      *p\isort = i
    EndIf
  Next
EndProcedure
If OpenWindow(#Window, 384, 288, 640, 480, "ListIconGadget сортировка", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  ListIconGadget(#LIG, 0, 0, 640, 480, "Название", 200, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  ; Добавляем тестовые данные в обратном порядке
  For i = 0 To 5
    *p = AddElement(Program())
    If *p
      Program()\name = Chr(90 - i)  ; Z, Y, X, W, V, U
      Program()\p = *p
      AddGadgetItem(#LIG, -1, Program()\name)
      SetGadgetItemData(#LIG, CountGadgetItems(#LIG) - 1, *p)
    EndIf
  Next
  UpdateItemIndices()
  ; Сортируем
  SendMessage_(GadgetID(#LIG), #LVM_SORTITEMS, 0, @CompareItems())
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 8 лет 1 месяц
  • Сообщений: 1408
  • Репутация:127

    [+] [-]
Можно так
With lvi
  \iSubItem = 0
  \cchTextMax = 510
  \Mask = #LVIF_TEXT
EndWith
Но не в одну строку
Ещё момент, что-то у меня на x86 этот код падает, пока не разгадал.
Space() забивает пробелами, а я не знаю получает ли LVM_GETITEMTEXT ноль в конце строки? Если нет, то будет сравнивать пробелы до конца 512 символов, вместо 5-10.

[Цитировать]

    Mazahaka_lab
  • 1832
  • Стаж: 10 лет
  • Сообщений: 154
  • Репутация:22

    [+] [-]
106821Ещё момент, что-то у меня на x86 этот код падает, пока не разгадал.
pszText содержит МУСОР (любое значение из памяти). SendMessage_() пытается записать текст по этому мусорному адресу
Windows пытается писать в защищённую память и в итоге КРАХ!
Правильнее наверное будет так
Protected lvi.LV_ITEM
Protected buffer1.s = Space(512)
With lvi
  \iSubItem = 0
  \pszText = @buffer1 - Обязательно!
  \cchTextMax = 510
  \Mask = #LVIF_TEXT
EndWith
SendMessage_(GadgetID(#LIG), #LVM_GETITEMTEXT, PeekI(*i1\isort), @lvi)
106821Space() забивает пробелами, а я не знаю получает ли LVM_GETITEMTEXT ноль в конце строки? Если нет, то будет сравнивать пробелы до конца 512 символов, вместо 5-10.
Проще тогда использовать GetGadgetItemText(). Не нужно возиться с буферами, нуль-терминаторами и SendMessage_()!
Procedure Compare_item(*i1.Program, *i2.Program)
  Protected text1$, text2$
  ; PureBasic функция сама управляет памятью!
  text1$ = GetGadgetItemText(#LIG, PeekI(*i1\isort), 0)
  text2$ = GetGadgetItemText(#LIG, PeekI(*i2\isort), 0)
  ProcedureReturn CompareMemoryString(@text1$, @text2$, #PB_String_NoCase)
EndProcedure
Вы по ходу один тут только проектами занимаетесь ?)

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 8 лет 1 месяц
  • Сообщений: 1408
  • Репутация:127

    [+] [-]
Mazahaka_lab, последний сокращённый до нельзя код всё равно падает на x86. Сам можешь проверить.
Надо 3 параметра
Procedure Compare_item(*i1.Program, *i2.Program, lParamSort)

[Цитировать]

    Mazahaka_lab
  • 1832
  • Стаж: 10 лет
  • Сообщений: 154
  • Репутация:22

    [+] [-]
AZJIO, ay

[Цитировать]

    motorboy
  • 41869
  • Стаж: 1 месяц 10 дней
  • Сообщений: 63
  • Репутация:14

    [+] [-]
AZJIO, Mazahaka_lab, Я думаю это нужно обсуждать здесь https://usbtor.ru/viewtopic.php?t=9598.
Я потому и не публикую исходные коды своих программ. Слишком много критики.

[Цитировать]

    Mazahaka_lab
  • 1832
  • Стаж: 10 лет
  • Сообщений: 154
  • Репутация:22

    [+] [-]
106825
AZJIO, Mazahaka_lab, Я думаю это нужно обсуждать здесь https://usbtor.ru/viewtopic.php?t=9598.
Я потому и не публикую исходные коды своих программ. Слишком много критики.
Я не думаю что критика это плохо. Я за то, чтобы сделать код лучше чем он был. Да и AZJIO я думаю не обиделся

[Цитировать]

    motorboy
  • 41869
  • Стаж: 1 месяц 10 дней
  • Сообщений: 63
  • Репутация:14

    [+] [-]
106826Я не думаю что критика это плохо. Я за то, чтобы сделать код лучше чем он был. Да и AZJIO я думаю не обиделся
Поверьте, мой код вызовет очень много критики. ab Особенно от людей которые разбираются в программировании.
Обновление v1.6.4 ===================================================================================
Исправлена проблема со шрифтами в главном окне при открытии окна редактирования.
Добавлена опция скрытия виджета в полноэкранном режиме (см. в настройках). Переделан код определения полноэкранного режима. Теперь должно работать в WinRE.
Исправлены баги с переменными окружения для х64 и х86 приложений.
Добавлена опция - отображать отсутствующие программы в конце списка (см. в настройках).
Исправлено несколько найденных багов. Оптимизация.

[Цитировать]

    Stranger13
  • 31966
  • Стаж: 3 года 2 месяца
  • Сообщений: 61
  • Репутация:0

    [+] [-]
106827Теперь должно работать в WinRE.
проверил работает, если на затруднит добавьте пожалуйста и в основное меню лаунчера пункт "показать/скрыть виджет"а то на мини системах где нет проводника неудобство создаются в пользовании в части показать виджет.
106827Добавлена опция - отображать отсутствующие программы в конце списка
хорошо б чтоб эта функция распространялась бы сразу и на треей меню лаунчера, чтоб было однообразно для удобства

[Цитировать]

    motorboy
  • 41869
  • Стаж: 1 месяц 10 дней
  • Сообщений: 63
  • Репутация:14

    [+] [-]
106828если на затруднит добавьте пожалуйста и в основное меню лаунчера пункт "показать/скрыть виджет"а то на мини системах где нет проводника неудобство создаются в пользовании в части показать виджет
Сделаю.
106828хорошо б чтоб эта функция распространялась бы сразу и на треей меню лаунчера, чтоб было однообразно для удобства
А вот это сложнее. Может просто сделать что бы в ховер меню не отображались отсутствующие проги?

[Цитировать]

    -PITER-
  • 40271
  • Стаж: 8 месяцев 13 дней
  • Сообщений: 3
  • Репутация:0

    [+] [-]
106825AZJIO, Mazahaka_lab, Я думаю это нужно обсуждать здесь
Тоже, смотрю две разных программы, но (старший)товарищ пытается объяснить, как лучше. При этом пилит паралельно свой лаунчер и делает сравнения. Автор, не открывайте код, иначе будет много "помощников".

[Цитировать]

    motorboy
  • 41869
  • Стаж: 1 месяц 10 дней
  • Сообщений: 63
  • Репутация:14

    [+] [-]
106830Тоже, смотрю две разных программы, но (старший)товарищ пытается объяснить, как лучше. При этом пилит паралельно свой лаунчер и делает сравнения. Автор, не открывайте код, иначе будет много "помощников".
Я не программист. Поэтому мои исходные коды очень кривые. Конечно же это вызовет возмущение опытных программистов. Просто в свободное время пишу утилиты с нужным мне функционалом. Я выбрал PureBasic так как он прост и понятен.


Последний раз редактировалось: motorboy (Вчера, в 22:14), всего редактировалось 1 раз

Страница 13 из 14


Показать сообщения:    

Текущее время: 12-Апр 00:47

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


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