AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1324
- Репутация:127[+] [-]
|
ChkDskGui (PureBasic)
Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия
Последний раз редактировалось: AZJIO (2024-11-07 09:05), всего редактировалось 44 раз(а)
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, не помешали бы иконки дисков в ComboBox (код видел, но пока не нашел...) Запуск консольной утилиты, производить с помощью процедуры, которую поместить в отдельный поток. (так окно не будет зависать...)
|
AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1324
- Репутация:127[+] [-]
|
53522не помешали бы иконки дисков в ComboBox 1. Ну пока на повестке номера дисков 2. Думаю над семафором, то есть цикл окна в LockMutex(Mutex) UnlockMutex(Mutex) вставить, чтобы элементы не отвечали на события и семафором на ожидание конца процедуры (пример в CreateSemaphore). Пока это усложняет простоту проги практически не добавляя весомых удобств.
|
Отправлено: 09-Май-2018 12:15
(спустя 2 часа 25 минут)
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, 2 Вот любят люди жизнь себе усложнять... Вместо кода в событии на кнопки, пишем процедуру. В событии на кнопке, проверяем запущен ли в данный момент поток и если нет, запускаем его... И ничего блокировать не нужно в окне. Таскай и жмахай, сколько влезит... Небольшая сложность в передаче параметров в процедуру, но это решаемо или глобальными переменными или структурой. В справке есть примеры. Иконки сделать не сложно, я видел пример, есть на 4.0 но его переделывать нужно...Дополнительная информация; English forum: http://www.curvesoftware.co.uk/purebasic/topic.asp?TOPIC_ID=5313 ; Author: Denis ; *** Example for using Icons in a combobox *** Structure DriveInfos DriveLetter.s DriveType.l DriveTypeString.s NameOfVolume.s EndStructure ;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ; Some windows constants ;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ #ICC_USEREX_CLASSES = $200 #WS_CHILD = $40000000 #WS_VISIBLE = $10000000 #CBS_DROPDOWN = 2 #CBS_AUTOHSCROLL = $40 #WS_VSCROLL = $200000 #SHGFI_SYSICONINDEX = $4000 #SHGFI_SMALLICON = 1 #CLR_NONE = $FFFFFFFF #CBEM_SETIMAGELIST = $00000402 #CBEM_INSERTITEM = $00000401 #CBEIF_TEXT = $00000001 #CBEIF_IMAGE = $00000002 #CBEIF_SELECTEDIMAGE = $00000004 #CB_SETCURSEL = $14E #DRIVE_REMOVABLE = 2 #DRIVE_FIXED = 3 #DRIVE_REMOTE = 4 #DRIVE_CDROM = 5 #DRIVE_RAMDISK = 6 ;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ; COMBOBOX Style ;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ #EDITCOMBOBOX = #WS_CHILD| #WS_VISIBLE |#CBS_DROPDOWN | #CBS_AUTOHSCROLL | #WS_VSCROLL ;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ; some Global vars ;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ Global MainWindowID.l, Hinstance.l,HwndComboBox.l ;;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;;/*/*/*/*/*/*/*/ Procedures /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* Procedure.l CreateComboBoxGadget() ; return 0 if Combobox failed Otherwise return Handle of combobox Hinstance = GetModuleHandle_(0) ; ComboBoxEx control must be initialized by calling the InitCommonControlsEx before calling CreateWindowEx API ; dwICC member of INITCOMMONCONTROLSEX structure must have #ICC_USEREX_CLASSES value ; CreateWindowEx class name must be ComboBoxEx32 Var.INITCOMMONCONTROLSEX Var\dwSize = SizeOf(INITCOMMONCONTROLSEX) Var\dwICC = #ICC_USEREX_CLASSES If InitCommonControlsEx_(@Var) ; CreateWindowEx parameters to create Combobox with Icons : ; CreateWindowEx_(#WS_EX_WINDOWEDGE, --> extended combobox window style ; "ComboBoxEx32", --> class name ; 0, --> window name; put 0 when no name ; #EDITCOMBOBOX, --> combobox window style ; 40, --> horizontal position combobox ; 10, --> vertical position of combobox ; 300, --> combobox width ; 150, --> combobox drop-down list height, not combobox height ; MainWindowID, --> handle to parent or owner window, here main window ; 0, --> handle to menu, or child-window identifier, put 0 when not exist ; Hinstance, --> handle to application instance, --> Hinstance = GetmoduleHandle_(0) ; 0) --> pointer to window-creation data, 0 here (see MS doc) HwndComboBox = CreateWindowEx_(2, "ComboBoxEx32", 0, #EDITCOMBOBOX, 40, 10, 300,150, MainWindowID , 0, Hinstance, 0) ; get image list Path.s=Space(255) GetCurrentDirectory_(255,@Path) ; Path = Current Directory string hImageList.l = SHGetFileInfo_(Path, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX |#SHGFI_SMALLICON) ImageList_SetBkColor_(hImageListS,#CLR_NONE) ; assign image list to Combobox SendMessage_(HwndComboBox, #CBEM_SETIMAGELIST, 0, hImageList) Else HwndComboBox = 0 EndIf ProcedureReturn HwndComboBox EndProcedure ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* Procedure GetAllDrives() ; create linked list to store drive name Global NewList Drive.DriveInfos() ; Get all drives letter AllDrivesNames.s = Space(255) ; AllDrivesNames receive string from GetLogicalDriveStrings API *AllDrivesNames.l = @AllDrivesNames DrivesExist.l = GetLogicalDriveStrings_(255,*AllDrivesNames) NbOfDrives.b = 0 If DrivesExist NbOfDrives = DrivesExist/4 lpFileSystemNameBuffer.s = Space(255) For i.b = 1 To NbOfDrives AddElement(Drive()) ;;-------- Drive letter ;; Drive()\Name have 3 chars : first the drive letter ;; second ":" ;; third "\" Drive()\DriveLetter = UCase(PeekS(*AllDrivesNames,3)) *AllDrivesNames + 4 ;;-------- Volume name Drive()\NameOfVolume = "" GetVolumeInformation_(Drive()\DriveLetter,Drive()\NameOfVolume,255,0,0,0,lpFileSystemNameBuffer,255) If Len(Drive()\NameOfVolume) Drive()\NameOfVolume = UCase(Left(Drive()\NameOfVolume ,1)) + LCase(Mid(Drive()\NameOfVolume ,2,Len(Drive()\NameOfVolume)-1)) Else Drive()\NameOfVolume = "" EndIf ; determine type of drive Drive()\DriveType = GetDriveType_(@Drive()\DriveLetter) Select Drive()\DriveType Case 0 ; drive not determined Drive()\DriveTypeString = "Indetermined Type" Case 1 ; 1 The root directory does not exist Drive()\DriveTypeString = "Root directory does not exist" Case #DRIVE_REMOVABLE ;The drive can be removed from the drive. Drive()\DriveTypeString = "Floppy disk" Case #DRIVE_FIXED ; The disk cannot be removed from the drive. Drive()\DriveTypeString = "Not removed disk" Case #DRIVE_REMOTE ; The drive is a remote (network) drive. Drive()\DriveTypeString = "Remote (network) drive" Case #DRIVE_CDROM ; The drive is a CD-ROM drive. Drive()\DriveTypeString = "CD-ROM" Case #DRIVE_RAMDISK ; The drive is a RAM disk. Drive()\DriveTypeString = "RAM disk" Default Drive()\DriveTypeString = "Indetermined Type" EndSelect Next i EndIf EndProcedure ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;; Main Prog ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* MainWindowID = OpenWindow(0,0,0,400,150," List of your computer Drives",#PB_Window_ScreenCentered |#PB_Window_SystemMenu) If MainWindowID And CreateGadgetList(WindowID(0)) And CreateComboBoxGadget() GetAllDrives() ResetList(Drive()) Combo.COMBOBOXEXITEM Combo\mask = #CBEIF_TEXT | #CBEIF_IMAGE| #CBEIF_SELECTEDIMAGE InfosFile.SHFILEINFO ResetList(Drive()) driveToDisplay.s= Space(255) While NextElement(Drive()) ; fill combobox with items, get image index of current drive, insert current item to the list ; and display second item ; create strings to fill combobox with If Len(Drive()\NameOfVolume) driveToDisplay= Drive()\NameOfVolume + " (" + Drive()\DriveTypeString + " "+ Left(Drive()\DriveLetter,2) + ")" Else driveToDisplay = Drive()\DriveTypeString + " (" + Left(Drive()\DriveLetter,2) + ")" EndIf ; get image index of current drive SHGetFileInfo_(Drive()\DriveLetter, 0, @InfosFile, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX |#SHGFI_SMALLICON ) Combo\iItem = -1 ; -1 --> insert current item at the end of list Combo\pszText = @driveToDisplay Combo\cchTextMax = Len(driveToDisplay) Combo\iImage = InfosFile\iIcon ; image index of current image Combo\iSelectedImage = InfosFile\iIcon ; image index of selected (displayed) item Combo\iIndent = 1 ; insert current item to the list SendMessage_(HwndComboBox , #CBEM_INSERTITEM, 0, @Combo) Wend ; display second item in combobox secondItemIndex = 1 ; index of first item is 0 SendMessage_(HwndComboBox , #CB_SETCURSEL, secondItemIndex , 0) Else MessageRequester("Error", "Can't create ComboBox",16) End EndIf ; events loop Repeat Select WaitWindowEvent() Case #PB_Event_CloseWindow Quit = 1 EndSelect Until Quit End
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, Лучше уж так:If Not IsThread(Thread) Thread = CreateThread(@RunProg(), 1) EndIf Только я не пойму, зачем ждать процесс выполнения после запуска...RunProgram("cmd.exe", "/c (Title Check Disk & @Echo off & Color 1e & cls & " + GetComString() + " & set /p Ok=^>^>)", "", #PB_Program_Open | #PB_Program_Wait #PB_Program_Open - открыл файл, его и закрыть после надо... Только зачем открывать то... Запуска не достаточно? #PB_Program_Wait - и к чему ожидание? если не возврат, не ещё либо какие то данные, после работы консольной утили не считываются...
|
Отправлено: 09-Май-2018 15:43
(спустя 2 часа 31 минута)
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
Вот код отображения иконок дисков:Дополнительная информацияIf OpenWindow(0, 0, 0, 300, 300, "Аssociated icon", #PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget) file$ = "c:" i=1 hIco=ExtractAssociatedIcon_(GetModuleHandle_(0), @file$, @i) ImageGadget(0, 0, 0, 64, 64,hIco) Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow ; EndIf
|
nikzzzz
- Стаж: 9 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO, Привет.53523 Ну пока на повестке номера дисков Мой вариант:Procedure.s DriveGetNumber(DriveLetter$) Protected DriveInfo.STORAGE_DEVICE_NUMBER, Ret$="", hDevice = CreateFile_("\\.\" + DriveLetter$, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL) If hDevice If DeviceIoControl_(hDevice,#IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, DriveInfo, SizeOf(STORAGE_DEVICE_NUMBER), #NUL, #NUL) Ret$=Str(DriveInfo\DeviceNumber) + ":" + Str(DriveInfo\PartitionNumber) EndIf CloseHandle_(hDevice) EndIf ProcedureReturn Ret$ EndProcedure Debug DriveGetNumber("c:") И еще ошибочка Output$ + ReadProgramString(Prog) + Chr(13) Не надо добавлять Chr(13) , читается не строка, а поток, в нем уже есть эти символы, и для совместимости с OemA2Ansi(Str$) читать надо поток надо в Raw виде, без преобразований.Output$ + ReadProgramString(Prog,#PB_Unicode)
Последний раз редактировалось: nikzzzz (2018-05-09 17:06), всего редактировалось 1 раз
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
nikzzzz, Петр предложил почти такой же вариант:Structure IOCTL_STORAGE_GET_DEVICE_NUMBER DeviceType.l DeviceNumber.l PartitionNumber.i EndStructure Procedure GetDiskNimberForDrive(sDriveLetter.s, *Info.IOCTL_STORAGE_GET_DEVICE_NUMBER) ; Буква диска Res = 0 hDevice = CreateFile_("\\.\" + sDriveLetter, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0) If hDevice Res = DeviceIoControl_(hDevice, $2D1080, 0, 0, *Info, SizeOf(IOCTL_STORAGE_GET_DEVICE_NUMBER), @x, 0) CloseHandle_(hDevice) EndIf ProcedureReturn Res EndProcedure x.IOCTL_STORAGE_GET_DEVICE_NUMBER Debug GetDiskNimberForDrive("C:", @x) Debug x\DeviceType Debug x\DeviceNumber Debug x\PartitionNumber Но твой, компактнее... А вот с иконками дисков в ComboBox, у меня что то не выходит...
|
nikzzzz
- Стаж: 9 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
Joker-2013,53559Петр предложил почти такой же вариант: Там есть маленькая ошибочка, и определяется структура, которая уже есть, поправленный вариант.Procedure GetDiskNimberForDrive(sDriveLetter.s, *Info.STORAGE_DEVICE_NUMBER) ; Буква диска Protected Res = 0, hDevice = CreateFile_("\\.\" + sDriveLetter, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0) If hDevice Res = DeviceIoControl_(hDevice, $2D1080, 0, 0, *Info, SizeOf(STORAGE_DEVICE_NUMBER), 0, 0) CloseHandle_(hDevice) EndIf ProcedureReturn Res EndProcedure x.STORAGE_DEVICE_NUMBER Debug GetDiskNimberForDrive("C:", @x) Debug x\DeviceType Debug x\DeviceNumber Debug x\PartitionNumber Да, я свой вариант поправил, там тоже маленькая ошибочка была.
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
nikzzzz, Тоже скоро нужна будет данная функа.
|
AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1324
- Репутация:127[+] [-]
|
Joker-2013 Главное чтобы какой наворот не помешал работе проге в урезанных условиях, всё же утилита системная. твой пример ковырнулIf OpenWindow(0, 0, 0, 400, 250, "Пример с иконками дисков", #PB_Window_MinimizeGadget) file$ = "C:" file2$ = "D:" i=1 hIco=ExtractAssociatedIcon_(GetModuleHandle_(0), @file$, @i) hIco2=ExtractAssociatedIcon_(GetModuleHandle_(0), @file2$, @i) ComboBoxGadget(0, 20, 16, 200, 25, #PB_ComboBox_Image) ; Создаёт раскрывающийся список AddGadgetItem(0, -1, "Диск " + file$, hIco) AddGadgetItem(0, -1, "Диск " + file2$, hIco2) SetGadgetState(0, 0) ; Выбирает первый элемент списка Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow EndIf Есть мысль: иногда надо проверить 2 диска (а может более), проверка примерно 15 и 30 минут. Тогда можно добавить кнопку "Добавить в очередь", то есть выбрав диск добавляем в очередь, потом другой. Жмём "Старт", если очереди нет используем комбо, если есть используем очередь. Запускаем строку в которой 2 и более команд с chkdsk, перед данными вставляем инфостроку из комбо, чтобы потом просматривая лог было видно для какого диска это выполнялась, там только метка вроде по умолчанию. Ещё... выходных почти нет, можно каждый из нас модернизировать и обновлять с датой обновления, а пришедшие скачивают критикуют или добавляют, в итоге быстрее всё сдвинется с места, ну конечно если есть желание. Я на день ночь ухожу и выпадаю почти на 2-е суток.
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO,#PB_ComboBox_Image : Включает поддержку изображений в элементах (не поддерживается для редактируемого ComboBox в OSX) Вот тут, при тестах, я и облажался... Проверил, иконки не отобразились и понавыдумывал что эскизы не того размера, посему и не работает...
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
53601можно каждый из нас модернизировать и обновлять с датой обновления, а пришедшие скачивают критикуют или добавляют, в итоге быстрее всё сдвинется с места, ну конечно если есть желание Так никто кроме нас не пишет в теме... Я всегда был лишь тестором и идейным вдохновителем, программист из меня никакой... Сейчас и свои проекты забросил, дел по дому много...оффтопПолазил я в Админке, было интересно, почему у нас две с лишнем тысячи пользователей на сайте, а пишут от силы 40... И почему не удаляются, в автоматическом режиме, как завещал Puhpol... Оказалось, что у нас на сайте много молчунов, которые периодически появляются, качают что либо и раздают.
|
Отправлено: 10-Май-2018 10:39
(спустя 1 час 32 минуты)
nikzzzz
- Стаж: 9 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO, По поводу очереди, все можно сделать динамически, открыв консоль и добавляя в нее команды. ПримерhCmd=RunProgram("cmd.exe", "", "", #PB_Program_Open|#PB_Program_Write) WriteProgramStringN(hCmd,"@color 1e",#PB_Ascii) WriteProgramStringN(hCmd,"cls & tracert usbtor.ru",#PB_Ascii) While ProgramRunning(hCmd) Delay(100) Wend Или использовать свой выводProcedure.s OemA2Ansi(Str$) user32_dll=OpenLibrary(#PB_Any, "user32.dll") CallFunction(user32_dll,"OemToCharA",@Str$,@Str$) CloseLibrary(user32_dll) ProcedureReturn PeekS(@Str$,-1,#PB_Ascii) EndProcedure hCmd = RunProgram("cmd.exe", "", "", #PB_Program_Open|#PB_Program_Write|#PB_Program_Read|#PB_Program_Hide) If IsProgram(hCmd) WriteProgramStringN(hCmd, "tracert usbtor.ru") WriteProgramStringN(hCmd, "exit") While ProgramRunning(hCmd) If AvailableProgramOutput(hCmd) Answer$=OemA2Ansi(ReadProgramString(hCmd,#PB_Unicode)) If Answer$ Debug Answer$ EndIf EndIf Delay(100) Wend EndIf
|
Страница 1 из 34
Текущее время: 12-Дек 03:43
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|