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

    AZJIO
  • 17953
  • Стаж: 6 лет 2 месяца
  • Сообщений: 1285
  • Репутация:126

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


Последний раз редактировалось: AZJIO (2023-01-25 16:21), всего редактировалось 43 раз(а)

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

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

    [+] [-]
  • Откуда: из прошлого
53736nikzzzz, Добавил возможность изменения размера окна:
Подправил код в данном сообщении, теперь у окна примера имеется иконка и появляется запрос на закрытии окна, если выполняется сканирование диска.
Добавил ещё и авто прокрутку текста.
AZJIO, Вроде всё круто... Осталось тебе, всё в кучу собрать...
Во вложении, "тяжелое" решение от Bluecon (как пример фейса)

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

    AZJIO
  • 17953
  • Стаж: 6 лет 2 месяца
  • Сообщений: 1285
  • Репутация:126

    [+] [-]
А если сделать листвью высотой в 4 пункта с галками выбора, а снизу консоль результатов?

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

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

    [+] [-]
  • Откуда: из прошлого
AZJIO, По мне, так лучше двух оконных мастер.
В первом как в блуконе выбор дисков ListIconGadget, с чек боксами (ты же хотел множественный выбор)
А во втором, вывод консоли...
Или ты хочешь по типу, моей утилиты по сбросу паролей?
В принципе и в одно оконном варианте, будет всё клёво и удобно.
Можно и статус бар прикрутить и вывод текущего времени... + время выполнения
Дерзай, что знаю, тем помогу...

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

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

    [+] [-]
  • Откуда: из прошлого
Вот ещё нашел...
Можно не использовать горизонтальную прокрутку и переносить текст, если ширина окна меньше...
Сразу после создания гаджета EditorGadget пишем строку:
SendMessage_(GadgetID(0),#EM_SETTARGETDEVICE, #Null, 0)
В итоге, даже в таком окне, умещается вся информация:

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

Import "user32.lib"
  OemToCharBuffA(*Buff,*Buff1,SizeBuff)
EndImport
Procedure.s ReadProgramStringOem(iPid)
  Protected Ret$=""
  Protected SizeBuff=AvailableProgramOutput(iPid)
  If SizeBuff>0
    Protected *Buff=AllocateMemory(SizeBuff)
    ReadProgramData(iPid,*Buff,SizeBuff)
    OemToCharBuffA(*Buff,*Buff,SizeBuff)
    Ret$=PeekS(*Buff,SizeBuff,#PB_Ascii)
    FreeMemory(*Buff)
  EndIf
  ProcedureReturn Ret$
EndProcedure
Procedure.s Cn(Str$)
  Protected i,j=1,Ret$="",Sym$,Str1$="",Flag=0
  Str$=ReplaceString(Str$,Chr(13)+Chr(10),Chr(12))
  For i=1 To Len(Str$)
    Sym$=Mid(Str$,i,1)
    Select Sym$
      Case Chr(12)
        Ret$+Str1$+Chr(13)+Chr(10)
        Str1$=""
      Case Chr(13)
        Flag=1
      Default
        If Flag:Str1$="":Flag=0:EndIf
        Str1$+Sym$
    EndSelect
  Next
  Ret$+Str1$
  ProcedureReturn Ret$
EndProcedure
Procedure EditorEndLine(Gadget)
Protected sel.CHARRANGE, GadgetID, LineEnd
GadgetID=GadgetID(Gadget)
LineEnd = SendMessage_(GadgetID, #EM_GETLINECOUNT, 0, 0)-1
sel\cpMin=SendMessage_(GadgetID, #EM_LINEINDEX, LineEnd, 0)
sel\cpMax=sel\cpMin
SendMessage_(GadgetID, #EM_EXSETSEL, 0, @sel)
EndProcedure
Procedure Chkdsk()
  ;    Protected iPid = RunProgram("cmd.exe", "/c tracert usbtor.ru", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  ;    Protected iPid = RunProgram("cmd.exe", "/c chkdsk d: /f /x", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  Protected iPid = RunProgram("cmd.exe", "/c chkdsk c: ", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  Protected Str$,Text$=""
  If iPid
    While ProgramRunning(iPid)
      If WaitWindowEvent(100) = #PB_Event_CloseWindow
        If MessageRequester("Внимание!", "Идет сканирование диска..."+Chr(10)+"Закрыть программу?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)=6
          CloseProgram(iPid)
          End
        EndIf
      EndIf
      Str$=ReadProgramStringOem(iPid)
      If Str$
        Text$+Str$
        SetGadgetText(0,Cn(Text$)+Chr(13)+Chr(10))
        EditorEndLine(0)
      EndIf
    Wend
    CloseProgram(iPid) ; Close the connection to the program
  EndIf
EndProcedure
Procedure SizeWindowHandler()
  ResizeGadget(0,0,0,WindowWidth(0),WindowHeight(0))
EndProcedure
OpenWindow(0,  44, 16, 700, 300, "CHKDSK GUI", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
SendMessage_(WindowID(0),#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",270))
BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
SmartWindowRefresh(0, #True)
WindowBounds(0, 500, 200, #PB_Ignore, #PB_Ignore)
EditorGadget(0, 0, 0, 700, 300, #PB_Editor_ReadOnly)
SendMessage_(GadgetID(0),#EM_SETTARGETDEVICE, #Null, 0)
LoadFont(0, "Courier New", 10)
SetGadgetFont(0, FontID(0))
Chkdsk()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

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

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

    [+] [-]
  • Откуда: из прошлого
Если по простому (и быстро), то можно сделать такое окно:

Или так:

По умолчанию показывать справку к утилите (гую или вывод справки консольной утилиты)]

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

    AZJIO
  • 17953
  • Стаж: 6 лет 2 месяца
  • Сообщений: 1285
  • Репутация:126

    [+] [-]
Joker-2013, можно изначально не отображать консоль, а выдвинуть в момент старта. Кстати в убунту при обновлении такой же фейс, снизу кнопка "Подробно", нажал, вылезла консоль, а у нас при нажатии "Старт" она выдвигается. Я уже делал такое в своём калькуляторе и TextReplace

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

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

    [+] [-]
  • Откуда: из прошлого
AZJIO, Так у меня в SFX конструкторе так же...
Тебе, как автору решать, какой фейс будет у утилиты...
мне лично, не нравятся окна с "выездом"
Но я так понял, что тема совсем не о утилите...
Она лишь как тестовый образец для изучения кода и решений...

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

    Orochi
  • 14100
  • Стаж: 7 лет 10 месяцев
  • Сообщений: 218
  • Репутация:0

    [+] [-]
AZJIO,
Как идея, возможность программы сканировать сразу несколько дисков параллельно и по очереди.
Очень мало подобных утилит умеют это делать параллельно.

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
так это ж надо чтоб сам CheckDisk это умел) а он разве умеет?

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

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

    [+] [-]
  • Откуда: из прошлого
cartmenezz, А зачем ему уметь то? в проге ставим в очередь и вперед...
Дело не сложное, код уже почти весь имеется.
Нужно только всё в кучу собрать, да фейс придумать и реализовать...
Мне вот, например утиль не интересна... Только решения.

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

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

    [+] [-]
53752возможность программы сканировать сразу несколько дисков параллельно
Это имеет смысл только при сканировании разделов, находящихся на разных физических дисках , если одновременно сканировать разделы на одном диске, это приведет к сильной потери скорости по сравнению с последовательным сканированием, особого смысла не вижу.

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

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

    [+] [-]
Joker-2013,
53767Только решения.
А к стати, не попадалась ли информация, как уменьшить мерцания при обновлении окна ?
Можно, конечно на графику перейти, но не хочется все усложнять.

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

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

    [+] [-]
  • Откуда: из прошлого
nikzzzz, так в коде, что я выкладывал, есть команда пьюрика SmartWindowRefresh(1, #True) ...
Есть еще у меня код API (пару строчек), отключает и включает перерисовку объектов...
SendMessage_(GadgetID(40),#WM_SETREDRAW,#False,0)
; заполнение списка
SendMessage_(GadgetID(40),#WM_SETREDRAW,#True,0)
RedrawWindow_(GadgetID(40), #Null, #Null, #RDW_ERASE | #RDW_FRAME | #RDW_INVALIDATE | #RDW_ALLCHILDREN)
Второе, очень убыстряет процесс заполнения списков в гаджете.
как уменьшить мерцания при обновлении окна
Смотря как обновляешь...
В моей программе, есть окно: информация о пользователи, так мерцание можно и совсем убрать, но тогда пользователь не поймет что оно обновилось.
Сейчас, вполне приемлемо...

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

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

    [+] [-]
Joker-2013,
Я имел ввиду общее решение, вот пример.
Procedure SizeWindowHandler()
  ResizeGadget(0,0,0,WindowWidth(0),WindowHeight(0))
EndProcedure
OpenWindow(0,  44, 16, 700, 300, "CHKDSK GUI", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
SendMessage_(WindowID(0),#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",270))
BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
SmartWindowRefresh(0, #True)
WindowBounds(0, 500, 200, #PB_Ignore, #PB_Ignore)
EditorGadget(0, 0, 0, 700, 300, #PB_Editor_ReadOnly)
SendMessage_(GadgetID(0),#EM_SETTARGETDEVICE, #Null, 0)
Courier_New=LoadFont(0, "Courier New", 10)
SetGadgetFont(0, Courier_New)
Text$="Тип файловой системы: NTFS." +Chr(13)+Chr(10)
Text$ +"Тип файловой системы: NTFS." +Chr(13)+Chr(10)
Text$ + "Тип файловой системы: NTFS." +Chr(13)+Chr(10)
Text$ + "Тип файловой системы: NTFS."
SetGadgetFont(0, LoadFont(0, "Courier New", 10))
Repeat
  SetGadgetText(0,Text$+Chr(13)+Chr(10))
Until WaitWindowEvent(1) = #PB_Event_CloseWindow

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

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

    [+] [-]
  • Откуда: из прошлого
nikzzzz, Уменьши цикличность...
Окно не успевает перерисоваться, а ты ему уже новые данные даёшь...
Так практически не моргает:

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


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

Текущее время: 26-Апр 09:52

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


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