Форум » [x]Harbour » Как вызвать "Копирование файлов" в xHarboure ? » Ответить

Как вызвать "Копирование файлов" в xHarboure ?

Andrey: При длительных операциях иногда "полезнее" для пользователя (и для программы) показывать вместо бегунка - стандартное окно: Т.е. если делаешь операции типа копирование из одной базы в другую. Без вывода на экран такая операция намного быстрей проходит. А чтоб юзер не скучал - хочу такое окно повесить. Как перевести пример Филатова \MiniGUI\SAMPLES\Advanced\AVI_Animation под хХарбор ?

Ответов - 37, стр: 1 2 All

santy: Под xHarbour работает без проблем.

Dima: Andrey пишет: Как перевести пример Филатова \MiniGUI\SAMPLES\Advanced\AVI_Animation под хХарбор ? santy пишет: Под xHarbour работает без проблем. Однако

Andrey: santy пишет: Под xHarbour работает без проблем. Покажи пожалуйста как ? Может я непонятно написал вверху, т.е. нужно перевести пример под консоль xHarbour. Типа как вызывается окно "выбора файла". Пример тут. FUNCTION MAIN() LOCAL cFile := CurDrive()+":"+DirName() cFile := GetFile( {{ "All Files (*.*)", "*.*" }} , "Browse for File", cFile ) ? cFile wait RETURN NIL *-----------------------------------------------------------------------------* Function GetFile( aFilter, title, cIniFolder, multiselect, nochangecurdir ) *-----------------------------------------------------------------------------* local c := '' , n local files , fileslist := {} Default aFilter TO {} Default multiselect TO .f. FOR n := 1 TO Len( aFilter ) c += aFilter[n][1] + Chr(0) + aFilter[n][2] + Chr(0) NEXT files := C_GetFile ( c , title, cIniFolder, multiselect, nochangecurdir ) if multiselect if Len( files ) > 0 if Valtype( files ) == "A" FOR n := 1 TO Len( files ) if At( "\\", files[n] ) > 0 .and. Left( files[n], 2 ) != "\\" files[n] := StrTran( files[n] , "\\", "\" ) endif NEXT fileslist := aClone( files ) else aAdd( fileslist, files ) endif endif else fileslist := files endif Return ( fileslist ) ///////////////////////////////////////////////////////////////// #pragma BEGINDUMP // из минигуи #include <windows.h> #include <hbapi.h> #include <shlobj.h> #include <commctrl.h> #include <setupapi.h> #ifdef __XHARBOUR__ #define HB_PARNL( n, x ) hb_parnl( n, x ) #define HB_STORC( n, x, y ) hb_storc( n, x, y ) #define HB_STORL( n, x, y ) hb_storl( n, x, y ) #define HB_STORNI( n, x, y ) hb_storni( n, x, y ) #define HB_STORNL( n, x, y ) hb_stornl( n, x, y ) #else #define HB_PARNL( n, x ) hb_parvnl( n, x ) #define HB_STORC( n, x, y ) hb_storvc( n, x, y ) #define HB_STORL( n, x, y ) hb_storvl( n, x, y ) #define HB_STORNI( n, x, y ) hb_storvni( n, x, y ) #define HB_STORNL( n, x, y ) hb_storvnl( n, x, y ) #endif HB_FUNC( C_GETFILE ) { OPENFILENAME ofn; char buffer[ 32768 ]; char cFullName[ 64 ][ 1024 ]; char cCurDir[ 512 ]; char cFileName[ 512 ]; int iPosition = 0; int iNumSelected = 0; int n; int flags = OFN_FILEMUSTEXIST; buffer[ 0 ] = 0; if( hb_parl(4) ) flags = flags | OFN_ALLOWMULTISELECT | OFN_EXPLORER; if( hb_parl(5) ) flags = flags | OFN_NOCHANGEDIR; memset( ( void * ) &ofn, 0, sizeof( OPENFILENAME ) ); ofn.lStructSize = sizeof( ofn ); ofn.hwndOwner = GetActiveWindow(); ofn.lpstrFilter = hb_parc( 1 ); ofn.nFilterIndex = 1; ofn.lpstrFile = buffer; ofn.nMaxFile = sizeof( buffer ); ofn.lpstrInitialDir = hb_parc( 3 ); ofn.lpstrTitle = hb_parc( 2 ); ofn.nMaxFileTitle = 512; ofn.Flags = flags; if( GetOpenFileName(&ofn) ) { if( ofn.nFileExtension != 0 ) hb_retc( ofn.lpstrFile ); else { wsprintf( cCurDir, "%s", &buffer[ iPosition ] ); iPosition = iPosition + strlen( cCurDir ) + 1; do { iNumSelected++; wsprintf( cFileName, "%s", &buffer[ iPosition ] ); iPosition = iPosition + strlen( cFileName ) + 1; wsprintf( cFullName[ iNumSelected ], "%s\\%s", cCurDir, cFileName ); } while( ( strlen(cFileName) != 0 ) && ( iNumSelected <= 63 ) ); if( iNumSelected > 1 ) { hb_reta( iNumSelected - 1 ); for( n = 1; n < iNumSelected; n++ ) HB_STORC( cFullName[ n ], -1, n ); } else hb_retc( &buffer[ 0 ] ); } } else hb_retc( "" ); } // JK JP #pragma ENDDUMP


PSP: Андрюха, напиши свою функцию рисования прогрессбара. Там делов на 10 минут с тремя перекурами.

Andrey: PSP пишет: напиши свою функцию рисования прогрессбара. Там делов на 10 минут с тремя перекурами. Как ? Никак не могу сообразить .... Я копирую 6 баз (по 350 тыс.записей) из одной структуры в другую.... Прогресс бар пусть будет рисоваться по количеству баз. А так "листочки" из папки в папку летают - красиво и как у всех... Красота для пользователя.... И меня не достают - почему медленно.. И программа (терминалка) как настоящая WINDOWS ...

PSP: Andrey пишет: А так "листочки" из папки в папку летают - красиво и как у всех... Красота для пользователя... Листочки, конечно, красиво, но не информативно. Гораздо информативней вывести затраченное/оставшееся время (кол-во записей) и считать не по количеству баз, а по суммарному количеству записей.

Andrey: PSP пишет: и считать не по количеству баз, а по суммарному количеству записей. Это долго будет... И в добавок по скорости удобней пользоваться APPEND FROM (cInputBase), без вывода прогрессбара... Вот для этого и "листочки" нужны.... На глаз видно, когда из большой базы копируешь записи в другую.

PSP: Andrey пишет: И в добавок по скорости удобней пользоваться APPEND FROM (cInputBase), без вывода прогрессбара... Вот для этого и "листочки" нужны.... Что-то я плохо себе представляю, как ты собрался WinAPI-шный диалог прогресса копирования прикрутить к команде APPEND FROM...

Andrey: PSP пишет: Что-то я плохо себе представляю, как ты собрался WinAPI-шный диалог прогресса копирования прикрутить к команде APPEND FROM... // запуск "листочков" WinAPICopyFILEopen( ' идет копирование баз ') For nI :=1 to LEN(aBase) WinAPICopyFILE( ' идет копирование базы '+STR(nI)) // туда просто сообщение передавать для информации // тут открытие баз .... APPEND FROM (cBaseInput) // - стандартная функция NEXT // убрать "листочки" WinAPICopyFILEclose()

PSP: Andrey пишет: WinAPICopyFILEopen WinAPICopyFILE WinAPICopyFILEclose Это реальные функции или ты просто так написал? Функция WinAPI, которая выводит этот диалог при копировании, называется SHFileOperation. В Висте заменена на IFileOperation.

PSP: Если хочешь, посмотри вот такой простой пример: [pre2]PROCEDURE Main( ... ) LOCAL n RDDSETDEFAULT( "DBFCDX" ) CLS USE Base n := BASE->( LastRec() ) COPY STRUCTURE TO Tmp USE Tmp APPEND FROM Base WHILE Show( n ) WAIT RETURN NIL FUNCTION Show( n ) LOCAL nRecNo := TMP->( RecNo() ) + 1 // единица добавляется потому, //что функция вызывается ДО копирования записи IF nRecNo % 1000 == 0 .or. nRecNo == n // каждую 1000-ую запись и последнюю ?? Str( nRecNo ) + Chr( 13 ) END // IF RETURN .T. [/pre2] В функции Show() можно считать оставшееся время. Пользователь будет знать, сколько еще ждать.

Andrey: PSP пишет: Это реальные функции или ты просто так написал? Это я просто для примера... А как они называются в WinApi я не знаю, и как их вызвать я тоже не представляю.

Andrey: PSP пишет: посмотри вот такой простой пример: Пример хороший. Как к нему "листочки" приделать ?

PSP: Andrey пишет: Как к нему "листочки" приделать ? Никак, Андрюха, никак... Я предложил тебе вариант "без листочков". Для "с листочками" см.функцию WinAPI SHFileOperation. Но тогда будет без APPEND FROM.

SergejKis: Андрей, посмотри такой вариант: http://zalil.ru/32497414

Andrey: Прикольный вариант. Только ужасно не нравиться вызов внешних файлов. Я стараюсь обходиться без дополнительных EXE-ников. Тем более нашел вот это: внимание, файл htmlayout dll скачать не предназначен для коммерческого пользования. используя его вы можете нарушать авторские права владельца ...... Так что такой вариант отпадает !

Петр: PSP пишет: Никак, Андрюха, никак... Я предложил тебе вариант "без листочков". Листочки давай !

SergejKis: Для Andrey 1.По поводу лицензии HTMLayout: You may utilize HTMLayout Component Software Product free of charge in any manner you see fit (subject to the limitations outlined in this license) to build commercial or non-commercial applications and components. Your application shall include link to Terra Informatica site in "About" dialog or similar place in your application. Text of the link: This Application (or Component) uses HTMLayout Component, copyright Terra Informatica Software, Inc. (http://terrainformatica.com). 2.Вместо er32.exe есть c++ текст для посылки сообщений. Могу выложить. 3.Применение одельного exe для таких длителиных операций (как в данном случае) вполне применимо. 4.Можно поискать другие анимационные gif (с листочками).

Andrey: Петр пишет: Листочки давай ! Да там же в папке \MiniGUI\SAMPLES\Advanced\AVI_Animation\161.avi

Andrey: SergejKis пишет: Вместо er32.exe есть c++ текст для посылки сообщений. Могу выложить. Да я не Си-ник, перевести на Харбор не смогу.



полная версия страницы