Автор | Сообщение |
|
| постоянный участник
|
Пост N: 1998
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.01.12 21:59. Заголовок: Как вызвать "Копирование файлов" в xHarboure ?
При длительных операциях иногда "полезнее" для пользователя (и для программы) показывать вместо бегунка - стандартное окно: Т.е. если делаешь операции типа копирование из одной базы в другую. Без вывода на экран такая операция намного быстрей проходит. А чтоб юзер не скучал - хочу такое окно повесить. Как перевести пример Филатова \MiniGUI\SAMPLES\Advanced\AVI_Animation под хХарбор ?
|
|
|
Ответов - 37
, стр:
1
2
All
[только новые]
|
|
|
| |
Пост N: 23
Зарегистрирован: 16.12.08
|
|
Отправлено: 11.01.12 22:38. Заголовок: Под xHarbour работае..
Под xHarbour работает без проблем.
|
|
|
|
| |
Пост N: 2252
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.01.12 22:46. Заголовок: Andrey пишет: Как п..
Andrey пишет: цитата: | Как перевести пример Филатова \MiniGUI\SAMPLES\Advanced\AVI_Animation под хХарбор ? |
| santy пишет: цитата: | Под xHarbour работает без проблем. |
| Однако
|
|
|
|
| постоянный участник
|
Пост N: 1999
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.01.12 19:09. Заголовок: santy пишет: Под xH..
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
|
|
|
|
|
| постоянный участник
|
Пост N: 668
Зарегистрирован: 27.01.07
|
|
Отправлено: 12.01.12 19:16. Заголовок: Андрюха, напиши свою..
Андрюха, напиши свою функцию рисования прогрессбара. Там делов на 10 минут с тремя перекурами.
|
|
|
|
| постоянный участник
|
Пост N: 2000
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.01.12 20:29. Заголовок: PSP пишет: напиши с..
PSP пишет: цитата: | напиши свою функцию рисования прогрессбара. Там делов на 10 минут с тремя перекурами. |
| Как ? Никак не могу сообразить .... Я копирую 6 баз (по 350 тыс.записей) из одной структуры в другую.... Прогресс бар пусть будет рисоваться по количеству баз. А так "листочки" из папки в папку летают - красиво и как у всех... Красота для пользователя.... И меня не достают - почему медленно.. И программа (терминалка) как настоящая WINDOWS ...
|
|
|
|
| постоянный участник
|
Пост N: 669
Зарегистрирован: 27.01.07
|
|
Отправлено: 12.01.12 20:52. Заголовок: Andrey пишет: А так..
Andrey пишет: цитата: | А так "листочки" из папки в папку летают - красиво и как у всех... Красота для пользователя... |
| Листочки, конечно, красиво, но не информативно. Гораздо информативней вывести затраченное/оставшееся время (кол-во записей) и считать не по количеству баз, а по суммарному количеству записей.
|
|
|
|
| постоянный участник
|
Пост N: 2001
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.01.12 21:41. Заголовок: PSP пишет: и считат..
PSP пишет: цитата: | и считать не по количеству баз, а по суммарному количеству записей. |
| Это долго будет... И в добавок по скорости удобней пользоваться APPEND FROM (cInputBase), без вывода прогрессбара... Вот для этого и "листочки" нужны.... На глаз видно, когда из большой базы копируешь записи в другую.
|
|
|
|
| постоянный участник
|
Пост N: 671
Зарегистрирован: 27.01.07
|
|
Отправлено: 13.01.12 10:26. Заголовок: Andrey пишет: И в д..
Andrey пишет: цитата: | И в добавок по скорости удобней пользоваться APPEND FROM (cInputBase), без вывода прогрессбара... Вот для этого и "листочки" нужны.... |
| Что-то я плохо себе представляю, как ты собрался WinAPI-шный диалог прогресса копирования прикрутить к команде APPEND FROM...
|
|
|
|
| постоянный участник
|
Пост N: 2002
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.01.12 11:07. Заголовок: PSP пишет: Что-то я..
PSP пишет: цитата: | Что-то я плохо себе представляю, как ты собрался WinAPI-шный диалог прогресса копирования прикрутить к команде APPEND FROM... |
| // запуск "листочков" WinAPICopyFILEopen( ' идет копирование баз ') For nI :=1 to LEN(aBase) WinAPICopyFILE( ' идет копирование базы '+STR(nI)) // туда просто сообщение передавать для информации // тут открытие баз .... APPEND FROM (cBaseInput) // - стандартная функция NEXT // убрать "листочки" WinAPICopyFILEclose()
|
|
|
|
| постоянный участник
|
Пост N: 672
Зарегистрирован: 27.01.07
|
|
Отправлено: 13.01.12 11:18. Заголовок: Andrey пишет: WinAP..
Andrey пишет: цитата: | WinAPICopyFILEopen WinAPICopyFILE WinAPICopyFILEclose |
| Это реальные функции или ты просто так написал? Функция WinAPI, которая выводит этот диалог при копировании, называется SHFileOperation. В Висте заменена на IFileOperation.
|
|
|
|
| постоянный участник
|
Пост N: 673
Зарегистрирован: 27.01.07
|
|
Отправлено: 13.01.12 12:09. Заголовок: Если хочешь, посмотр..
Если хочешь, посмотри вот такой простой пример: 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. В функции Show() можно считать оставшееся время. Пользователь будет знать, сколько еще ждать.
|
|
|
|
|
| постоянный участник
|
Пост N: 2003
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.01.12 13:54. Заголовок: PSP пишет: Это реал..
PSP пишет: цитата: | Это реальные функции или ты просто так написал? |
| Это я просто для примера... А как они называются в WinApi я не знаю, и как их вызвать я тоже не представляю.
|
|
|
|
| постоянный участник
|
Пост N: 2004
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.01.12 13:55. Заголовок: PSP пишет: посмотри..
PSP пишет: цитата: | посмотри вот такой простой пример: |
| Пример хороший. Как к нему "листочки" приделать ?
|
|
|
|
| постоянный участник
|
Пост N: 674
Зарегистрирован: 27.01.07
|
|
Отправлено: 13.01.12 14:00. Заголовок: Andrey пишет: Как к..
Andrey пишет: цитата: | Как к нему "листочки" приделать ? |
| Никак, Андрюха, никак... Я предложил тебе вариант "без листочков". Для "с листочками" см.функцию WinAPI SHFileOperation. Но тогда будет без APPEND FROM.
|
|
|
|
| |
Пост N: 51
Зарегистрирован: 18.02.11
|
|
Отправлено: 14.01.12 22:16. Заголовок: Андрей, посмотри так..
|
|
|
|
| постоянный участник
|
Пост N: 2005
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.01.12 07:35. Заголовок: Прикольный вариант. ..
Прикольный вариант. Только ужасно не нравиться вызов внешних файлов. Я стараюсь обходиться без дополнительных EXE-ников. Тем более нашел вот это: внимание, файл htmlayout dll скачать не предназначен для коммерческого пользования. используя его вы можете нарушать авторские права владельца ...... Так что такой вариант отпадает !
|
|
|
|
| постоянный участник
|
Пост N: 1068
Зарегистрирован: 09.10.06
|
|
Отправлено: 15.01.12 11:20. Заголовок: PSP пишет: Никак, А..
PSP пишет: цитата: | Никак, Андрюха, никак... Я предложил тебе вариант "без листочков". |
| Листочки давай !
|
|
|
|
| |
Пост N: 52
Зарегистрирован: 18.02.11
|
|
Отправлено: 15.01.12 14:04. Заголовок: Для Andrey 1.По пово..
Для 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 (с листочками).
|
|
|
|
| постоянный участник
|
Пост N: 2006
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.01.12 15:22. Заголовок: Петр пишет: Листочк..
Петр пишет: Да там же в папке \MiniGUI\SAMPLES\Advanced\AVI_Animation\161.avi
|
|
|
|
| постоянный участник
|
Пост N: 2007
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.01.12 15:24. Заголовок: SergejKis пишет: Вм..
SergejKis пишет: цитата: | Вместо er32.exe есть c++ текст для посылки сообщений. Могу выложить. |
| Да я не Си-ник, перевести на Харбор не смогу.
|
|
|
Ответов - 37
, стр:
1
2
All
[только новые]
|
|