motorboy
  - Стаж: 1 месяц 10 дней
- Сообщений: 64
- Репутация: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 раз(а)
|
 Отправлено: Вчера, в 00:43
(спустя 1 месяц 2 дня)
AZJIO
  - Стаж: 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() как у меня могу скинуть готовый пример, это чуть легче чем выковыривать из моего кода.
|
 Отправлено: Вчера, в 11:15
(спустя 10 часов)
Mazahaka_lab
  - Стаж: 10 лет
- Сообщений: 154
- Репутация:22[+] [-]
|
AZJIO,  В вашем коде есть несколько проблем. Главная из них — в процедуре 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.Добавлены тестовые строки — добавлены строки в разном регистре для проверки сортировки без учёта регистра.
|
 Отправлено: Вчера, в 13:50
(спустя 2 часа 35 минут)
AZJIO
  - Стаж: 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)
|
 Отправлено: Вчера, в 14:18
(спустя 28 минут)
Mazahaka_lab
  - Стаж: 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
|
 Отправлено: Вчера, в 14:26
(спустя 8 минут)
AZJIO
  - Стаж: 8 лет 1 месяц
- Сообщений: 1408
- Репутация:127[+] [-]
|
Можно такWith lvi \iSubItem = 0 \cchTextMax = 510 \Mask = #LVIF_TEXT EndWith Но не в одну строку Ещё момент, что-то у меня на x86 этот код падает, пока не разгадал. Space() забивает пробелами, а я не знаю получает ли LVM_GETITEMTEXT ноль в конце строки? Если нет, то будет сравнивать пробелы до конца 512 символов, вместо 5-10.
|
 Отправлено: Вчера, в 14:47
(спустя 20 минут)
Mazahaka_lab
  - Стаж: 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 Вы по ходу один тут только проектами занимаетесь ?)
|
 Отправлено: Вчера, в 14:52
(спустя 5 минут)
AZJIO
  - Стаж: 8 лет 1 месяц
- Сообщений: 1408
- Репутация:127[+] [-]
|
Mazahaka_lab, последний сокращённый до нельзя код всё равно падает на x86. Сам можешь проверить. Надо 3 параметраProcedure Compare_item(*i1.Program, *i2.Program, lParamSort)
|
 Отправлено: Вчера, в 17:38
(спустя 17 минут)
Stranger13
 - Стаж: 3 года 2 месяца
- Сообщений: 61
- Репутация:0[+] [-]
|
106827Теперь должно работать в WinRE. проверил работает, если на затруднит добавьте пожалуйста и в основное меню лаунчера пункт "показать/скрыть виджет"а то на мини системах где нет проводника неудобство создаются в пользовании в части показать виджет.106827Добавлена опция - отображать отсутствующие программы в конце списка хорошо б чтоб эта функция распространялась бы сразу и на треей меню лаунчера, чтоб было однообразно для удобства
|
 Отправлено: Вчера, в 21:37
(спустя 40 минут)
motorboy
  - Стаж: 1 месяц 10 дней
- Сообщений: 64
- Репутация:14[+] [-]
|
106828если на затруднит добавьте пожалуйста и в основное меню лаунчера пункт "показать/скрыть виджет"а то на мини системах где нет проводника неудобство создаются в пользовании в части показать виджет Сделаю.106828хорошо б чтоб эта функция распространялась бы сразу и на треей меню лаунчера, чтоб было однообразно для удобства А вот это сложнее. Может просто сделать что бы в ховер меню не отображались отсутствующие проги?
|
 Отправлено: Вчера, в 21:40
(спустя 2 минуты)
-PITER-
 - Стаж: 8 месяцев 13 дней
- Сообщений: 3
- Репутация:0[+] [-]
|
106825AZJIO, Mazahaka_lab, Я думаю это нужно обсуждать здесь Тоже, смотрю две разных программы, но (старший)товарищ пытается объяснить, как лучше. При этом пилит паралельно свой лаунчер и делает сравнения. Автор, не открывайте код, иначе будет много "помощников".
|
 Отправлено: Вчера, в 22:09
(спустя 29 минут)
motorboy
  - Стаж: 1 месяц 10 дней
- Сообщений: 64
- Репутация:14[+] [-]
|
106830Тоже, смотрю две разных программы, но (старший)товарищ пытается объяснить, как лучше. При этом пилит паралельно свой лаунчер и делает сравнения. Автор, не открывайте код, иначе будет много "помощников". Я не программист. Поэтому мои исходные коды очень кривые. Конечно же это вызовет возмущение опытных программистов. Просто в свободное время пишу утилиты с нужным мне функционалом. Я выбрал PureBasic так как он прост и понятен.
Последний раз редактировалось: motorboy (Вчера, в 22:14), всего редактировалось 1 раз
|
Страница 13 из 14
Текущее время: 12-Апр 00:50
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|