purebasic.info

PureBasic forum
Текущее время: Пт авг 17, 2018 3:31 am

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




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Ср фев 14, 2018 10:44 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 303
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Для показа процента выполнения во все времена было и будет супер кроссплатформенное решение
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
OpenConsole()
PrintN("|+--------+---------+---------+---------+---------+|")
PrintN("|1       20        40        60        80       100|")
PrintN("|+--------+---------+---------+---------+---------+|")
Print("|")
For i = 2 To 100 Step 2
  Print("*")
  Delay(500) ; На этом месте должно быть вычисление процентов выполнения
Next  
PrintN("|")
Print("Ok")
Input()
CloseConsole()



p.s. проверено ещё в середине 80х прошлого века в этом или соседнем помещении ))))
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср фев 14, 2018 12:11 pm 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 55
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Оно, конечно, здорово, но отжирает огромное количество места на экране. А использовать софт планируется на экране 1024х600, и вывод в одну строку. как я писал выше - был бы самым оптимальным решением.

Все равно спасибо за предложение.

_________________
Чат по PureBasic в Telegram


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср фев 14, 2018 12:27 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 303
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Причём тут место на экране? Можно же и последовательно наращивать 1.....20.....30.... .... в одной строке без заголовков
А для кроссплатформенной красоты нужно смотреть в сторону curses и его модификаций
Кстати https://wmcbrine.com/pdcurses/ внезапно обновился впервые за 10 лет и где то прозвучало, что консоль win 10 c какой то версии поддерживает esc - последовательности.
Но стоит ли оно того для отображения процентов в консоли?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср фев 14, 2018 12:48 pm 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 55
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Ну там еще фишка вот в чем.

Пишем в консоль строку вида "some_file.ext [ 87% ]" в ходе выполнения закачки, а в случае ошибки строка должна принимать вид "some_file.ext [ ERR ]". Такую штуку уже не сделать последовательным выводом процесса выполнения. Нет, можно, конечно, сделать что-то типа "some_file.ext [ 0 .. 10% .. 20% .. 23% - ERROR ]", но получается все равно громоздко.

Хочется лаконичности, а не получается. Наверно придется делать как в последнем варианте.

curses гляну конечно, но думаю что это избыточно.

_________________
Чат по PureBasic в Telegram


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср фев 14, 2018 12:56 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 303
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
some_file.ext [ 0 .. 10% .. 20% .. 23% - ERROR ]"
вам же важно показать динамику а не точную цифру, а динамику (пусть тот кто смотрит например через параметр выбирает дискретность)
можно и 1 . . . 50 . . . 100 а в сообщении об ошибке уже точный процент и ещё что то важное нужное....
Я о том что самыми простыми средствами можно выйти из самых сложных ситуаций, а поиск сложных инструментов часто избыточен.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт авг 02, 2018 3:32 pm 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 138
Благодарил (а): 1 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Тоже нужно было,фсе перелопатил ненашел :evil: , а вот сегодня подфортило и НАШЁЛЬ :lol:
нужно совсем немного, и терпения тр.
hConsole = GetStdHandle_( #STD_OUTPUT_HANDLE ) получить индификатор консоли
ConsoleLocate(5, 7) ставим кудато курсор
GetConsoleScreenBufferInfo_( hConsole, @CBI )- получаем даные в структуру
унаем координаты
CurX=CBI\dwCursorPosition\x
CurY=CBI\dwCursorPosition\Y
прога(куда без нее, можно в кодеархив кинуть если нужно)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
;ПОЛУЧАЕМ КООРДИНАТЫ КУРСОРА
 
;ВК - выход из проги
 
CBI.CONSOLE_SCREEN_BUFFER_INFO
; структура CONSOLE_SCREEN_BUFFER_INFO
;     COORD      dwSize;
;     COORD      dwCursorPosition; нам это нужно
;     WORD       wAttributes;
;     SMALL_RECT srWindow;
;     COORD      dwMaximumWindowSize;
 
If OpenConsole()
    EnableGraphicalConsole(1)
   
   
    hConsole = GetStdHandle_( #STD_OUTPUT_HANDLE )
;--------
    ConsoleLocate(5, 7)
   
    GetConsoleScreenBufferInfo_( hConsole, @CBI ); получаем координаты курсора
    X=CBI\dwSize\x
    Y=CBI\dwSize\Y
    Debug Str(X) +"  "+Str(Y);выводит выводит размер всего окна включая скрол(у меня настроено 300 строк)
    Debug CBI\wAttributes; какойто атрибут, может символа, у меня 7
; Structure SMALL_RECT; это тож поморочило, результат ниже
;     left.w
;     top.w
;     right.w
;     bottom.w
; EndStructure    
    Debug CBI\srWindow\bottom; размеры координат видимого окна наверно
    Debug CBI\srWindow\left
    Debug CBI\srWindow\right
    Debug CBI\srWindow\top
 
 
 
    CurX=CBI\dwMaximumWindowSize\x
    CurY=CBI\dwMaximumWindowSize\Y
    Debug Str(CurX) +"  "+Str(CurY);выводит размеры стандартного окна 80*61, может для полноэкранного режима
   
   
    ;\dwCursorPosition  в справке так, ох и долго морочило мне голову, выдает всегда одно и тоже число,
    ;а это оказывается адрес еще одной структуры, пока в инете неувидел пример ниже по координатам
    CurX=CBI\dwCursorPosition\x
    CurY=CBI\dwCursorPosition\Y
    PrintN("ConsoleLocate("+Str(CurX)+","+ Str(CurY)+")" )
        Debug Str(CurX) +"  "+Str(CurY);выводит координаты курсора
       
;--------
    ConsoleLocate(10, 12)
    GetConsoleScreenBufferInfo_( hConsole, @CBI )
    PrintN("ConsoleLocate(10, 12)")
    CurX=CBI\dwCursorPosition\x
    CurY=CBI\dwCursorPosition\Y
   
        Debug Str(CurX) +"  "+Str(CurY);выводит координаты курсора
    Input()
 
EndIf
 



а эта прога позволяет писать и перемещаться клавишами по экрану, использует координаты курсора
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
;ПОЛУЧАЕМ КООРДИНАТЫ КУРСОРА
;ПОЗВОЛЯЕТ ПЕЧАТАТЬ ГДЕ ХОЧЬ В ПРЕДЕЛАХ КОНСОЛИ(У МЕНЯ 80*300 СТРОЧЕК), МОЖНО ХОТЬ БУКВАМИ РИСОВАТЬ
;УПРАВЛЯЕТСЯ СТРЕЛКАМИ, КЛАВИШАМИ СТРАНИЦА ВВЕРХ И ВНИЗ, ПЕРЕВОД СТРОКИ, В НАЧАЛО И В КОНЕЦ СТРОКИ
;ескейп - выход из проги
 
If OpenConsole()
EnableGraphicalConsole(1)
 
  CBI.CONSOLE_SCREEN_BUFFER_INFO
  hConsole = GetStdHandle_( #STD_OUTPUT_HANDLE )
 
 
  GetConsoleScreenBufferInfo_( hConsole, @CBI ); получаем координаты курсора
  ;\dwCursorPosition  в справке так, ох и долго морочило мне голову, выдает всегда одно и тоже число,
  ;а это оказывается адрес еще одной структуры, пока в инете неувидел пример ниже по координатам
CurX=CBI\dwCursorPosition\x
CurY=CBI\dwCursorPosition\Y
 
a:
String$ = Inkey()
String = RawKey();
Delay(10);
;
If String=0 :Goto A:EndIf;
Select String
    Case 37;влево
        CurX-1:;If CurX<0:CurX=0: EndIf
        ConsoleLocate(CurX, CurY)
    Case 13;перевод строки
        ; если дошло до конца то непереводит строку, поэтому нада уменьшать номер строки
        If CurY>298:CurY=298:EndIf
        ConsoleLocate(0, CurY+1);ох ничего себе буферок, так 300 строчек
    Case 38;вверх
        CurY-1
        ConsoleLocate(CurX, CurY)
    Case 39;вправо
        CurX+1
        ConsoleLocate(CurX, CurY)
    Case 40;вниз
        CurY+1
        ConsoleLocate(CurX, CurY)
    Case 33;страница вверх, число от фонаря -40
        CurY-40:If CurY<0:CurY=0:EndIf; если дошло до конца и число минус то нереагирует поэтому надо CurY=0
        ConsoleLocate(CurX, CurY)
    Case 34;страница вниз, число от фонаря -40
        CurY+40:If CurY>299:CurY=299:EndIf
        ConsoleLocate(CurX, CurY)
    Case 36;в начало строки
        CurX=0
        ConsoleLocate(CurX, CurY)
    Case 35;в конец строки
        CurX=79
        ConsoleLocate(CurX, CurY)
    Default ;
        Print(String$)
EndSelect
 
; получаем координаты курсора, вопрос ПОЧЕМУ ТУТ,
; а не в начале поставил- незнаю и так хорошо работае, переписывать нестал.
GetConsoleScreenBufferInfo_( hConsole, @CBI )
CurX=CBI\dwCursorPosition\x
CurY=CBI\dwCursorPosition\Y
Debug Str(CurX) +"  "+Str(CurY);выводит координаты курсора
If String$<>Chr(27):Goto A:EndIf; ВЫХОД ИЗ ПРОГИ
 
EndIf


_________________
искатель истины


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2

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


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 8


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB