AZJIO
  - Longevity: 6 years 11 months
- Posts: 1317
- REPUTATION:127[+] [-]
|
ChkDskGui (PureBasic)
Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия
Last edited by AZJIO on 2024-11-07 09:05; edited 44 times in total
|
Joker-2013
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
AZJIO, не помешали бы иконки дисков в ComboBox (код видел, но пока не нашел...) Запуск консольной утилиты, производить с помощью процедуры, которую поместить в отдельный поток. (так окно не будет зависать...)
|
AZJIO
  - Longevity: 6 years 11 months
- Posts: 1317
- REPUTATION:127[+] [-]
|
53522не помешали бы иконки дисков в ComboBox 1. Ну пока на повестке номера дисков 2. Думаю над семафором, то есть цикл окна в LockMutex(Mutex) UnlockMutex(Mutex) вставить, чтобы элементы не отвечали на события и семафором на ожидание конца процедуры (пример в CreateSemaphore). Пока это усложняет простоту проги практически не добавляя весомых удобств.
|
 Отправлено: 09-May-2018 12:15
(after 2 hours 25 minutes)
Joker-2013
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
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
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
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-May-2018 15:43
(after 2 hours 31 minute)
Joker-2013
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
Вот код отображения иконок дисков:Дополнительная информация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
  - Longevity: 10 years
- Posts: 3114
- REPUTATION: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)
Last edited by nikzzzz on 2018-05-09 17:06; edited 1 time in total
|
Joker-2013
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
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
  - Longevity: 10 years
- Posts: 3114
- REPUTATION: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
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
nikzzzz,  Тоже скоро нужна будет данная функа.
|
AZJIO
  - Longevity: 6 years 11 months
- Posts: 1317
- REPUTATION: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
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
AZJIO,#PB_ComboBox_Image : Включает поддержку изображений в элементах (не поддерживается для редактируемого ComboBox в OSX) Вот тут, при тестах, я и облажался... Проверил, иконки не отобразились и понавыдумывал что эскизы не того размера, посему и не работает...
|
Joker-2013
  - Longevity: 9 years 7 months
- Posts: 2053
- REPUTATION:120[+] [-]
- Location: из прошлого
|
53601можно каждый из нас модернизировать и обновлять с датой обновления, а пришедшие скачивают критикуют или добавляют, в итоге быстрее всё сдвинется с места, ну конечно если есть желание Так никто кроме нас не пишет в теме... Я всегда был лишь тестором и идейным вдохновителем, программист из меня никакой... Сейчас и свои проекты забросил, дел по дому много...оффтопПолазил я в Админке, было интересно, почему у нас две с лишнем тысячи пользователей на сайте, а пишут от силы 40... И почему не удаляются, в автоматическом режиме, как завещал Puhpol... Оказалось, что у нас на сайте много молчунов, которые периодически появляются, качают что либо и раздают.
|
 Отправлено: 10-May-2018 10:39
(after 1 hour 32 minutes)
nikzzzz
  - Longevity: 10 years
- Posts: 3114
- REPUTATION: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
|
Page 1 of 34
Current time is: 14-Feb 05:54
All times are UTC + 3
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
|
|