Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [VB6] ProgressBar


Автор: wolk 18.3.2007, 08:23
Мне надо, чтобы progressBar показывала процесс копирования папки или файла. Опишите подробнее или прикрепите пример программы. smile 

Автор: Tectoder 18.3.2007, 09:55
ShFileOperation

Автор: Akina 18.3.2007, 11:04
Процесс копирования папки можно показывать, указывая на прогрессоре количество скопированных от общего количества.
А вот прогресс одного файла можно показывать, только копируя его "вручную" - т.е. открыть источник для чтения, приемник для записи, ичитать-писАть блоки. Тогда можно показывать в прогрессе количество скопированных байтов от общего количества.

В любом разе на прогрессоре минимум=0, максимум= количеству байтов или файлов, текущее значение постоянно обновлятся в процессе копирования. Остальное прогрессор нарисует сам.

Автор: bom 18.3.2007, 11:15
Цитата(Tectoder @  18.3.2007,  12:55 Найти цитируемый пост)
ShFileOperation

Или копируй порциями и присваивай ProgressBar.Value соответсвующее значение.
Akina быстрее ответил, это можно удалить.


Автор: Tectoder 18.3.2007, 17:42
Копировать вручную файл - знак плохого тона. Файл это не только содержимое, он содержит много чего другого. Выполняя "ручное" копирование все "другое" будет утеряно.

Автор: Akina 18.3.2007, 20:46
Цитата(Tectoder @  18.3.2007,  18:42 Найти цитируемый пост)
Выполняя "ручное" копирование все "другое" будет утеряно. 

Это неверно. Все свойства файла (атрибуты, даты, ACL) вполне могут быть установлены в желаемое значение. Но геморрою действительно много.

Цитата(Tectoder @  18.3.2007,  18:42 Найти цитируемый пост)
Копировать вручную файл - знак плохого тона. 

Категорично и, следовательно, неверно. Бывают случаи, когда копирование файла целиком не соответствует задаче.

Автор: Tectoder 18.3.2007, 22:34
Akina, файл это не только атрибуты, дата и acl. Есть еще расширенные атрибуты, есть потоки и другое. Как правило обычные программисты не могут перечислить все составлющие файла. Именно поэтому лучше всего копировать файл именно с помощью системных функций. Но это конечно имхо smile

Автор: Akina 18.3.2007, 23:25
Цитата(Tectoder @  18.3.2007,  23:34 Найти цитируемый пост)
файл это не только атрибуты, дата и acl

Конечно. Впрочем, в рамках данной темы это скорее флуд. Посему предлагаю на этом остановиться.

Автор: wolk 20.3.2007, 08:41
А вы не можете мне дать рабочею программу, чтобы я посмотрел. А то я не врубаюсь. Я раньше не когда не программировал с  progressBar.  smile 

Автор: Akina 20.3.2007, 09:24
Все и всё когда-то делают впервые. Пробуйте на модели.

Автор: wolk 20.3.2007, 10:48
Если бы посмотрел проект то я бы понял как это все работает.

Автор: Akina 20.3.2007, 11:46
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Tectoder 20.3.2007, 11:49
На форме должен быть progress bar:
Код

Option Explicit

Private Sub Form_Load()
    Show
    Dim bCancel As Long, iRet As Long
    iRet = CopyFileWithProgress("I:\Films\Игры разума.avi", "I:\Films\Copy of Игры разума.avi", Me)
    If iRet = 0 Then MsgBox "Error: " & Err.LastDllError, vbCritical Else MsgBox "Done"
    End
End Sub

В модуле:
Код

Option Explicit

Public Type LARGE_INTEGER
    LowPart As Long
    HiPart As Long
End Type

Public Type LARGE_INTEGER2
    QuardPart As Double
End Type

Public Declare Function CopyFileExW Lib "kernel32" (ByVal lpExistingFileName As Long, ByVal lpNewFileName As Long, ByVal lpRoutine As Long, ByVal lData As IUnknown, ByRef bCancel As Long, ByVal dwFlags As Long) As Long

Public Const PROGRESS_CONTINUE As Long = 0
Public Const PROGRESS_CANCEL   As Long = 1
Public Const PROGRESS_STOP     As Long = 2
Public Const PROGRESS_QUIET    As Long = 3

Public Function CopyFileWithProgress(ByVal nSource As String, ByVal nDest As String, ByVal nForm As IUnknown) As Long
    Dim bCancel As Long
    CopyFileWithProgress = CopyFileExW(StrPtr(nSource), StrPtr(nDest), AddressOf CopyProgressRoutine, nForm, bCancel, 0)
End Function

Public Function CopyProgressRoutine(ByVal TotalFileSize As Double, ByVal TotalBytesTransferred As Double, ByVal StreamSize As Double, ByVal StreamBytesTransferred As Double, ByVal StreamNumber As Long, ByVal dwCallbackReason As Long, ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As IUnknown) As Long
    Dim nTotalSize As Single
    Dim nTotalBytesTransferred As Single
    nTotalSize = GetSingleFromLargeInteger(TotalFileSize)
    nTotalBytesTransferred = GetSingleFromLargeInteger(TotalBytesTransferred)
    If lpData Is Nothing Then
        'При неподходящий условиях продолжаем копирование, но не используем прогресс
        CopyProgressRoutine = PROGRESS_QUIET
    Else
        If TypeOf lpData Is Form1 Then
            Dim nFrm As Form1
            Set nFrm = lpData
            nFrm.ProgressBar1.Max = nTotalSize
            'Исключаем арифметические ошибки при преобразовании
            If nTotalBytesTransferred <= nTotalSize Then
                nFrm.ProgressBar1.Value = nTotalBytesTransferred
            Else
                nFrm.ProgressBar1.Value = nTotalSize
            End If
            nFrm.ProgressBar1.Refresh
            CopyProgressRoutine = PROGRESS_CONTINUE
        Else
            'При неподходящий условиях продолжаем копирование, но не используем прогресс
            CopyProgressRoutine = PROGRESS_QUIET
        End If
    End If
End Function

'Перблизительное преобразование LargeInteger в Single
Public Function GetSingleFromLargeInteger(ByVal nDouble As Double) As Single
    Dim nL2 As LARGE_INTEGER2, nL1 As LARGE_INTEGER
    nL2.QuardPart = nDouble
    LSet nL1 = nL2
    GetSingleFromLargeInteger = CSng(nL1.LowPart) + CSng(nL1.HiPart) * CSng(&H7FFFFFFF) * 2
End Function

Автор: wolk 22.3.2007, 15:26
Спасибо! smile 

Автор: wolk 25.3.2007, 07:49
А как сделать ко smile пирование папки с ProgressBar?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)