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

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

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия


Последний раз редактировалось: AZJIO (2024-11-07 09:05), всего редактировалось 44 раз(а)

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53558
Не надо добавлять Chr(13) , читается не строка, а поток, в нем уже есть эти символы, и для совместимости с OemA2Ansi(Str$) читать надо поток надо в Raw виде, без преобразований.
Код:
Output$ + ReadProgramString(Prog,#PB_Unicode)
В данном случае не умещается в сообщение и оно выходит за пределы окна...
Хотя, по мне так, проще создать новое окно и разместить в нем инфу с прокруткой...
Не только проще, а прямо необходимо, ибо из сообщения неудобно копировать ключи (или всё или ничего)


Последний раз редактировалось: Joker-2013 (2018-05-10 11:43), всего редактировалось 1 раз

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
Или использовать свой вывод
Так то интереснее, если не будет проблем с кодировками...

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

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53611Так то интереснее, если не будет проблем с кодировками...
С кодировками не будет, но для красоты вывода иногда добавляются спец символы, их надо фильтровать, что в общем-то не составляет проблему.
Как вариант, можно поменять кодовую страницу на 1251, но не все программы ее используют, некоторые могут просто проигнорировать, поэтому вариант с OemA2Ansi универсальнее.

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
Чуть я поигрался:

Дополнительная информация

;  тест ChkDskGui
;IncludeFile "RUSCOD.PBI"
Declare.s OemA2Ansi(Str$)
Declare ComboListDrive(List Drive.s())
Declare GetDrives(List Drive.s())
Declare HelpChkdsk()
Declare RunProg(*Value)
Declare.s FormatStr(Sring$)
Declare.s FormatStrFS(Sring$)
Declare.s FormatSizeDisk(Num.q)
Declare.s GetComString()
Declare.s DriveGetNumber(Sring$)
Define.s strexe
NewList Drive.s()
If OpenWindow(0, 100, 200, 440, 130, "ChkDskGui", #PB_Window_MinimizeGadget)
    ComboBoxGadget(0, 20, 16, 400, 25, #PB_ComboBox_Image) ; Создаёт раскрывающийся список
    GetDrives(Drive())
    ComboListDrive(Drive()) ; Получение списка дисков FIXED REMOVABLE
    i=1
    Handle = GetModuleHandle_(0)
    ForEach Drive.s()
      Text.s= Drive.s()
      Letter.s =LSet(Text,1)+":"
      hIco=ExtractAssociatedIcon_(Handle, @Letter, @i)
      AddGadgetItem(0, -1, Drive.s(), hIco)
    Next
    SetGadgetState(0, 0) ; Выбирает первый элемент списка
    If LoadFont(0,"Courier New",9)
        SetGadgetFont(0, FontID(0))  ; Установить загруженный шрифт Courier 10 как новый стандарт
    EndIf
    CheckBoxGadget(1, 20, 45, 280, 20, "\F - Исправление ошибок на диске") : SetGadgetState(1, #PB_Checkbox_Checked)
    CheckBoxGadget(2, 20, 65, 280, 20, "\R - Восстановление поврежденных секторов")
    CheckBoxGadget(3, 20, 85, 280, 20, "\X - Принудительное отключение тома") : SetGadgetState(3, #PB_Checkbox_Checked)
    ;   StringGadget(4,  20, 110, 420, 17, "")
    TextGadget(4,  20, 110, 420, 17, "тест дисков")
;   ButtonGadget(5, 300, 77, 27, 32, "?", #PB_Button_Default) ; не работает Default, не нажимается по Enter
    ButtonGadget(5, 300, 77, 27, 32, "?")
    ButtonGadget(6, 330, 77, 90, 32, "Старт")
;   GadgetToolTip(1,"подсказка")
;   SetActiveGadget(5) ; не работает Active, не нажимается по Enter
    SetGadgetText(4, GetComString())
    SetGadgetState(6, 0)
;     While #True
;   Select WaitWindowEvent()
;     Case #PB_Event_CloseWindow
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case 5 ; ?
            HelpChkdsk()
        Case 6 ; Старт
;           DisableGadget(5, 1) ; это работает не в порядке очереди, поэтому скрываем
            HideGadget(5, 1)
            HideGadget(6, 1) ; даёт невозможность поставить в очередь клики
;           Delay(3000)
;           MessageRequester("Тест",  "/c (Title Check Disk & @Echo off & Color 1e & cls & " + GetComString() + " & set /p Ok=^>^>)", 0)
            CreateThread(@RunProg(), 1)
;           DisableGadget(5, 0)
            HideGadget(5, 0)
            HideGadget(6, 0)
        Case 0
          SetGadgetText(4, GetComString())
        Case 1
            If GetGadgetState(1) = #PB_Checkbox_Unchecked
                SetGadgetState(2, #PB_Checkbox_Unchecked)
                SetGadgetState(3, #PB_Checkbox_Unchecked)
            EndIf
            SetGadgetText(4, GetComString())
        Case 2
            SetGadgetState(1, #PB_Checkbox_Checked)
            SetGadgetText(4, GetComString())
        Case 3
            If GetGadgetState(3) = #PB_Checkbox_Checked
                SetGadgetState(1, #PB_Checkbox_Checked)
            EndIf
            SetGadgetText(4, GetComString())
        EndSelect
      ElseIf Event = #PB_Event_CloseWindow And GetActiveWindow()=1
        HideWindow(1,0)
    EndIf
  Until Event = #PB_Event_CloseWindow And GetActiveWindow()=0
EndIf
End
Procedure RunProg(*Value)
    RunProgram("cmd.exe", "/c (Title Check Disk & @Echo off & Color 1e & cls & " + GetComString() + " & set /p Ok=^>^>)", "")
EndProcedure
Procedure.s GetComString()
    Define.s ComStr
    ComStr = "chkdsk.exe "
    ComStr + RSet(GetGadgetText(0), 1) + ":"
    If GetGadgetState(1)
        ComStr + " /F"
    EndIf
    If GetGadgetState(2)
        ComStr + " /R"
    EndIf
    If GetGadgetState(3)
        ComStr + " /X"
    EndIf
    ProcedureReturn ComStr
EndProcedure
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
Procedure HelpChkdsk()
    Prog = RunProgram("chkdsk.exe", "/?", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
    Output$ = ""
    If Prog
      While ProgramRunning(Prog)
        If AvailableProgramOutput(Prog)
          Output$ + Output$ + ReadProgramString(Prog,#PB_Unicode)
        EndIf
      Wend
      CloseProgram(Prog) ; Close the connection to the program
    EndIf
;   Output$ = RUSCOD(Output$, #DosToWin)
    Output$=OemA2Ansi(Output$)
    ;Output$=ReplaceString(Output$, #CR$ + "                     ", "") ; чтобы на экран умещалось
;   If CreateRegularExpression(0, "\A\s+") ; не удалил пустые строки в начале, только добавил 60 кб к EXE
;   If CreateRegularExpression(0, "\s+\z")
;       Output$ = ReplaceRegularExpression(0, Output$, "")
;   EndIf
;     If OpenWindow(1, 100, 200, 440, 130, "Справка", #PB_Window_MinimizeGadget | #PB_Window_WindowCentered)
;       EndIf
    MessageRequester("Справка", Output$)
EndProcedure
; Получить буквы дисков
Procedure GetDrives(List Drive.s())
    Define.i drives_avail
    drives_avail = GetLogicalDrives_()
    For i = 0 To 31
      If ((drives_avail >> i) & 1)
        AddElement(Drive())
        Drive() = Chr(i + 65)+":"
      EndIf
    Next
  EndProcedure
;Получение номера диска и раздела, из буквы раздела
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
Procedure ComboListDrive(List Drive.s())
    Define.l Serial, type, i
    Define.s Lfwrk, FileSystem, VolName
    Define.q total_bytes
    ForEach Drive.s()
        Lfwrk=Drive.s()+"\"
        type =GetDriveType_(Lfwrk)
        FileSystem = Space(256)
        VolName= Space(256)
        GetVolumeInformation_(@Lfwrk, @VolName, 255, @Serial, 0, 0, @FileSystem, 255)
        Select type
            Case 2
                Drive()+" ["+DriveGetNumber(Drive()) + "] REM    "
            Case 3
                Drive()+" ["+DriveGetNumber(Drive())+"] FIXED  "
            Default
                DeleteElement(Drive())
                Continue
        EndSelect
        Drive() +FormatStr(VolName)+"  "+FormatStrFS(FileSystem)
        If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0))
            Drive() + Space(2) + FormatSizeDisk(total_bytes)
        EndIf
    Next
EndProcedure
; форматирует число в формат "0,5 Гб", "500 Гб"
Procedure.s FormatSizeDisk(Num.q)
    Define.s snum
    Define.f total_gb
    snum = StrF(Num/1024)
    total_gb = ValF(snum)
    total_gb = total_gb/1048576
    snum =StrF(total_gb,3)
    snum =RSet(snum, 7) + " Гб"
;   Debug Len(snum)
    ProcedureReturn snum
  EndProcedure
Procedure.s FormatStr(Sring$)
    Define.l LenSring
    LenSring = Len(Sring$)
    If LenSring >15
        Sring$ = LSet(Sring$,12) + "..."
    ElseIf LenSring < 15
        Sring$ = LSet(Sring$,15)
    EndIf
    ProcedureReturn Sring$
EndProcedure
Procedure.s FormatStrFS(Sring$)
    Define.l LenSring
    LenSring = Len(Sring$)
    If LenSring < 5
        Sring$ = LSet(Sring$,5)
    EndIf
    ProcedureReturn Sring$
EndProcedure
Но что то надоело... Для добавления окон, нужно переделать цикл событий, а что то лень...

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

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

    [+] [-]
53610В данном случае не умещается в сообщение и оно выходит за пределы окна...
На AutoIt3-версии справка выводится в новое окно с Edit. Упирается во время.
53618Для добавления окон, нужно переделать цикл событий
На AutoIt3, когда окно делаешь дочерним цикл переделывать не надо, родительское само перестаёт обрабатывать события и не имеет доступа, а в дочернем свой цикл.
53558Не надо добавлять Chr(13)
Ну во первых код я взял целиком из примера в справке, во вторых, без Chr(13) у меня всё в одной строке, всё в куче.
Joker-2013
Иконки пока думаю лишнее. С точки зрения системы в LiveCD иконки будут разделятся на несъёмный и съёмный, в обычной винде добавится иконка системного диска, ну и если принудительно иконки сменяны то они. У нас Rem и Fixed определяют тип, иконками только это определяется. В общем не несут они ничего, если только сделать свои 2 иконки на эти два типа и назначать взависимости от типа.
Обновил ссылку на пастбин, добавил номера дисков

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53622На AutoIt3, когда окно делаешь дочерним цикл переделывать не надо, родительское само перестаёт обрабатывать события и не имеет доступа, а в дочернем свой цикл.
в пьюрике всё в куче.
Переделывать то не много, точнее совсем малость... обработку закрытия окон.
У меня есть хорошее решение, которое обрабатывает все события, но в моей проге...

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53622Обновил ссылку на пастбин, добавил номера дисков
и испортил подсказку по параметрам...
Добавь событие:
Case 0
          SetGadgetText(4, GetComString())

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

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

    [+] [-]
Joker-2013, проверь дочернее окно (на пастбине), я попробовал как это делается в AutoIt3. Но дочерность не присвоилась, пока ковыряю

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO,
Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
Не ну опрос, в общем цикле... по номеру гаджета...
Дочернее окно сделать просто, есть в справке... нужно указать ID основного окна и всё...

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

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

    [+] [-]
Joker-2013
на счёт WS_POPUP ждём

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO, из меня подсказчик плохой... Но всё предельно просто.
Окна не блокируются, можно заблокировать вручную.
События обрабатываются в основном цикле, по номеру гаджета...
Вот как у меня реализовано:
Я бы дал пример, но мне его создавать долго, может кто более продвинутый, поможет...
Дочернее окно, не имеет своего значка в панели задач.
Как я заметил, у вас возникают сложности, из за знания AutoIT и попытки делать код по подобию...
А язык то отличается... Вот у nikzzzz таких проблем не возникает, он у нас, многозадачный...

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

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

    [+] [-]
53664Как я заметил, у вас возникают сложности, из за знания AutoIT и попытки делать код по подобию...
У AutoIt3 нет проблем создать любой вид окна и дочернее без блокировки и дочернее с одним циклом и переключением между окнами и перебросом данных из одного в другое и самостоятельные окна с взаимодействием (разные скрипты) и сделать чужое окно дочерним по отношению к окну AutoIt3.
Но!!! я обсуждаю вариант, который нужен мне, а не и ситуации что я не могу по иному. Во первых существует порядок/иерархия окон, допустим ты закрыл родительское, как поступать с дочерним? Оно должно закрыться или остаться, что если там данные о которых ты вспомнил когда закрыл родительское?

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

    Joker-2013
  • 1039
  • Стаж: 9 лет 4 месяца
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO, Дождался...
Я там тебе ответил...
Такой цикл обработки событий, по моему мнению, оптимальный, я до него дошел, не сразу...
Обновил код, по моему, отличный пример получился, можно расширить и выложить.
Для новичков, просто находка.
AZJIO, так я и писал про подход... В пьюрике всё вполне просто, но наверное чуть по другому чем в AutoIT...

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

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

    [+] [-]
53664Как я заметил, у вас возникают сложности, из за знания AutoIT и попытки делать код по подобию..
53672AZJIO, так я и писал про подход... В пьюрике всё вполне просто, но наверное чуть по другому чем в AutoIT...
Ну в итоге то по подобию. И знание AutoIt3 в этом помогает. Они же оба используют виндовые функции, ресурсы винды и принцип чтобы это повторить одинаковый. В принципе я искал название аналогов функций и способ передачи дескриптора родительского окна дочернему, что не всегда может быть дескриптором, а внутренним номером связанным с дескриптором. В AutoIt3 к примеру когда получает дескриптор открытого файла возвращает порядковый номер, казалось бы как такое может быть, а причина что он внутри движка содержит именные списки-таблицы для связи идентификаторов с дескрипторами и при завершении автоматом закрывает ресурсы зная сколько элементов в таблице. Но в автоите передаёшь дескриптор для окна, а тут он через внутренний список, подобно файловым дескрипторам в AutoIt3.

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

    nikzzzz
  • 215
  • Стаж: 9 лет 9 месяцев
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO, aa
В принципе, не принципиально на чем писать, все зависит от библиотек, когда их не хватает, возникают проблемы, Autoit имеет огромное преимущество, там только один тип данных - Variant, это позволяет не думать ни о преобразовании типов, ни долго их описывать.
Но я ничего не понял из твоего поста, в принципе отличия не большие, приведи простой пример на Autoit, я не понимаю, в чем проблема.

Страница 2 из 34


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

Текущее время: 21-Ноя 19:15

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


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