Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VB6] ProgressBar, копирование папки или файла 
V
    Опции темы
wolk
  Дата 18.3.2007, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



Мне надо, чтобы progressBar показывала процесс копирования папки или файла. Опишите подробнее или прикрепите пример программы. smile 
PM MAIL   Вверх
Tectoder
Дата 18.3.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: нет
Всего: 8



ShFileOperation
PM   Вверх
Akina
Дата 18.3.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bom
Дата 18.3.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: нет
Всего: 6



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

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



Это сообщение отредактировал(а) bom - 18.3.2007, 11:21
PM MAIL   Вверх
Tectoder
Дата 18.3.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: нет
Всего: 8



Копировать вручную файл - знак плохого тона. Файл это не только содержимое, он содержит много чего другого. Выполняя "ручное" копирование все "другое" будет утеряно.
PM   Вверх
Akina
Дата 18.3.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



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

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

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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Tectoder
Дата 18.3.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: нет
Всего: 8



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

Это сообщение отредактировал(а) Tectoder - 18.3.2007, 22:35
PM   Вверх
Akina
Дата 18.3.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
wolk
Дата 20.3.2007, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



А вы не можете мне дать рабочею программу, чтобы я посмотрел. А то я не врубаюсь. Я раньше не когда не программировал с  progressBar.  smile 
PM MAIL   Вверх
Akina
Дата 20.3.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Все и всё когда-то делают впервые. Пробуйте на модели.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
wolk
Дата 20.3.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



Если бы посмотрел проект то я бы понял как это все работает.
PM MAIL   Вверх
Akina
Дата 20.3.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Tectoder
Дата 20.3.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: нет
Всего: 8



На форме должен быть 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

PM   Вверх
wolk
Дата 22.3.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



Спасибо! smile 
PM MAIL   Вверх
wolk
  Дата 25.3.2007, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



А как сделать ко smile пирование папки с ProgressBar?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.