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

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

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

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

Dima: Andrey пишет: Да я не Си-ник, перевести на Харбор не смогу А раздел C++ у нас для чего (надеюсь не только для обсуждения стандартов) ?

Петр: Andrey пишет: Да там же в папке \MiniGUI\SAMPLES\Advanced\AVI_Animation\161.avi Я не это имел ввиду Пример от Григория и SHFileOperation немного разные. Не вдаваясь в подробности, SHFileOperation для визуализации использует шаблон диалога. Найти его можно в той же dll, гле и находится вышеупомянутая функция shellapi.dll (там же и "листочки" ). Вытащить этот шаблон можно с помощью какого-то редактора ресурсов, тюнера или хакера, которых в достаточном количестве можно найти на просторах и-нета. [pre2]1020 DIALOGEX 20, 20, 240, 105, 0 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_FIXEDSYS | WS_POPUPWINDOW | WS_DLGFRAME FONT 8, "MS Shell Dlg" { CONTROL "", 106, "SysAnimate32", 0x5000000E, 10, 0, 240, 25, WS_EX_TRANSPARENT CONTROL "", 103, "STATIC", NOT WS_GROUP | SS_BLACKRECT | SS_GRAYFRAME | SS_NOPREFIX, 55, 46, 175, 10, WS_EX_TOPMOST | WS_EX_TRANSPARENT CONTROL "", 102, "STATIC", NOT WS_GROUP | SS_BLACKRECT | SS_GRAYFRAME | SS_NOPREFIX, 55, 35, 175, 10, WS_EX_TOPMOST | WS_EX_TRANSPARENT CONTROL "", 104, "msctls_progress32", 0, 10, 65, 220, 10, WS_EX_TOPMOST | WS_EX_TRANSPARENT LTEXT "", 105, 78, 85, 100, 10, NOT WS_GROUP | SS_NOPREFIX DEFPUSHBUTTON "Отмена", 500, 180, 83, 50, 14, NOT WS_TABSTOP LTEXT "Название:", 12289, 11, 35, 38, 8, 0, WS_EX_TOPMOST | WS_EX_TRANSPARENT LTEXT "Куда:", 12289, 11, 46, 30, 8, 0, WS_EX_TOPMOST | WS_EX_TRANSPARENT LTEXT "Расчет времени:", 12289, 11, 85, 62, 8, 0, WS_EX_TOPMOST | WS_EX_TRANSPARENT } [/pre2] Вот если бы вы использовали Harbour, то для выполнения этого диалога смогли бы использовать функцию wapi_DialogBoxParam (из библиотеки hbwin). В папке harbour\contrib\hbwin\tests\ можно найти пример вызова диалога dlg.prg Вот как этот пример выглядит в работе

Петр: А вот так выглядит диалог с "листочками"


Петр: Модифицированный код примера [pre2]#include "common.ch" #include "hbwin.ch" #include "dlg1.ch" PROCEDURE Main() wapi_DialogBoxParam( 0, IDD_DIALOG1, 0, @DialogFunc() ) RETURN FUNCTION DialogFunc( hWnd, message, wParam, lParam, wPHigh, wPLow ) HB_SYMBOL_UNUSED( wParam ) HB_SYMBOL_UNUSED( lParam ) HB_SYMBOL_UNUSED( wPHigh ) SWITCH message CASE WM_INITDIALOG wapi_SetDlgItemText( hWnd, IDC_STATIC1, "?" ) wapi_SetDlgItemText( hWnd, IDC_STATIC2, "!" ) wapi_SetDlgItemText( hWnd, IDC_STATIC3, Time() ) wapi_SetDlgItemAvi( wapi_GetDlgItem( hWnd, IDC_ANIMATE1 ), 0, IDR_AVI1 ) wapi_SetDlgItemPBRange( wapi_GetDlgItem( hWnd, IDC_PBAR1 ), 0, 100 ) wapi_SetDlgItemPBPos( wapi_GetDlgItem( hWnd, IDC_PBAR1 ), 50 ) RETURN .T. CASE WM_CLOSE IF wapi_MessageBox( 0, "?!", "!!", WIN_MB_OKCANCEL + WIN_MB_ICONQUESTION ) == 1 wapi_SetDlgItemAvi( wapi_GetDlgItem( hWnd, IDC_ANIMATE1 ), 0, 0 ) wapi_EndDialog( hWnd, 3 ) RETURN .T. ENDIF EXIT CASE WM_COMMAND SWITCH wPLow CASE IDC_BUTTON1 SELF_CLOSE( hWnd ) RETURN .T. ENDSWITCH ENDSWITCH RETURN .F. #pragma BEGINDUMP #include "hbwin.h" #include "hbwapi.h" #include "hbapiitm.h" #include <commctrl.h> #if defined( __BORLANDC__ ) && !defined( HB_ARCH_64BIT ) #undef MAKELONG #define MAKELONG(a,b) ((LONG)(((WORD)((DWORD_PTR)(a) & 0xffff)) | \ (((DWORD)((WORD)((DWORD_PTR)(b) & 0xffff))) << 16))) #endif HB_FUNC( WAPI_SETDLGITEMAVI ) { int iResult = SendMessage( hbwapi_par_raw_HWND( 1 ), ACM_OPEN, ( WPARAM ) hbwapi_par_raw_HINSTANCE( 2 ), ( LPARAM ) hbwapi_par_INT( 3 ) ); hbwapi_SetLastError( GetLastError() ); hbwapi_ret_NI( iResult ); } HB_FUNC( WAPI_SETDLGITEMPBRANGE ) { SendMessage( hbwapi_par_raw_HWND( 1 ), PBM_SETRANGE, 0, MAKELONG( hbwapi_par_INT( 2 ), hbwapi_par_INT( 3 ) ) ); } HB_FUNC( WAPI_SETDLGITEMPBPOS ) { SendMessage( hbwapi_par_raw_HWND( 1 ), PBM_SETPOS, ( WPARAM ) hbwapi_par_INT( 2 ), 0 ); } HB_FUNC_STATIC( SELF_CLOSE ) { SendMessage( hbwapi_par_raw_HWND( 1 ), WM_CLOSE, 0, 0 ); } #pragma ENDDUMP[/pre2]

Петр: Файл ресурсов dlg.rc [pre2] #include <windows.h> #include <commctrl.h> LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 1 MANIFEST "dlg.xml" 1020 DIALOGEX 20, 20, 240, 105, 0 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_FIXEDSYS | WS_POPUPWINDOW | WS_DLGFRAME FONT 8, "MS Shell Dlg" { CONTROL "", 106, "SysAnimate32", 0x5000000E, 10, 0, 240, 25, WS_EX_TRANSPARENT CONTROL "", 103, "STATIC", NOT WS_GROUP | SS_BLACKRECT | SS_GRAYFRAME | SS_NOPREFIX, 55, 46, 175, 10, WS_EX_TOPMOST | WS_EX_TRANSPARENT CONTROL "", 102, "STATIC", NOT WS_GROUP | SS_BLACKRECT | SS_GRAYFRAME | SS_NOPREFIX, 55, 35, 175, 10, WS_EX_TOPMOST | WS_EX_TRANSPARENT CONTROL "", 104, "msctls_progress32", 0, 10, 65, 220, 10, WS_EX_TOPMOST | WS_EX_TRANSPARENT LTEXT "", 105, 78, 85, 100, 10, NOT WS_GROUP | SS_NOPREFIX DEFPUSHBUTTON "Отмена", 500, 180, 83, 50, 14, NOT WS_TABSTOP LTEXT "Название:", 12289, 11, 35, 38, 8, 0, WS_EX_TOPMOST | WS_EX_TRANSPARENT LTEXT "Куда:", 12289, 11, 46, 30, 8, 0, WS_EX_TOPMOST | WS_EX_TRANSPARENT LTEXT "Расчет времени:", 12289, 11, 85, 62, 8, 0, WS_EX_TOPMOST | WS_EX_TRANSPARENT } 2020 AVI "161.avi" [/pre2] Файл манифеста dlg.xml (чтобы приложение поддерживало темы Windows) [pre2]<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="MyOrganization.MyDivision.MyApp" version="1.0.0.0" processorArchitecture="X86" /> <description>Verbal description of MyApp.</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly> [/pre2] Ну и dlg1.ch [pre2]#define IDD_DIALOG1 1020 #define IDC_STATIC1 102 #define IDC_STATIC2 103 #define IDC_PBAR1 104 #define IDC_STATIC3 105 #define IDC_ANIMATE1 106 #define IDC_BUTTON1 500 #define IDR_AVI1 2020 #define WM_INITDIALOG 0x0110 #define WM_COMMAND 0x0111 #define WM_SYSCOMMAND 0x0112 #define WM_CLOSE 0x0010 [/pre2]

Andrey: Петр пишет: Вот если бы вы использовали Harbour А на хХарбор нельзя перетащить ? Очень просим, все работающие на хХарборе тоже захотят ..... Пытался собрать сам, да не получается. хХарбор не понимает команды ENDSWITCH xHarbour Compiler build 1.0.0 (SimpLex) Copyright 1999-2007, http://www.xharbour.org http://www.harbour-project.org/ Compiling 'CopyFileWinApi.PRG'... CopyFileWinApi.PRG(44) Error E0020 Incomplete statement or unbalanced delimiters CopyFileWinApi.PRG(45) Error E0020 Incomplete statement or unbalanced delimiters CopyFileWinApi.PRG(89) Error E0030 Syntax error: "syntax error at 'я'" 3 errors Проект для хХарбора здесь http://zalil.ru/32502422 Может что-то неправильно сделал ?.....

PSP: Andrey пишет: хХарбор не понимает команды ENDSWITCH А END понимает?

Петр: PSP пишет: А END понимает? END он понимает, а вот Андрей не понимает, что он хочет.

Andrey: PSP пишет: А END понимает? А я знаю что-ли ??? Я не пользуюсь такой конструкцией, без надобности.... Петр пишет: END он понимает, а вот Андрей не понимает, что он хочет. Ну понимаю что прошу невыполнимое, но надеюсь, а вдруг можно сделать....

Dima: Andrey пишет: А я знаю что-ли ??? Я не пользуюсь такой конструкцией, без надобности.... :\svn\xharbour\doc\en\switch.txt

Andrey: Опять возвращаюсь к проекту, что Петр выложил. Я на Харборе программ еще не делал, так что опять наткнулся на грабли, как обойти - не знаю. Собрал файл проекта CopyFile.hbp для HBMK2 При компиляции выдает ошибку: Z:\hb30\SHFileOperation>Z:\hb30\bin\hbmk2.exe CopyFile hbmk2: Compiling Harbour sources... Harbour 3.0.0 (Rev. 16951) Copyright (c) 1999-2011, http://harbour-project.org/ Compiling 'CopyFileWinApi.prg'... Lines 965, Functions/Procedures 2 Generating C source output to 'OBJ\CopyFileWinApi.c'... Done. hbmk2: Compiling resources... Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. hbmk2: Compiling... OBJ\CopyFileWinApi.c: Error E2293 CopyFileWinApi.prg 60: ) expected Error E2206 CopyFileWinApi.prg 76: Illegal character '\' (0x5c) *** 2 errors in Compile *** hbmk2: Error: Running C/C++ compiler. 1 bcc32.exe -c -q -d -6 -O2 -OS -Ov -Oi -Oc -tWM -w -Q -w-sig- -nOBJ -IZ:\BCC55\Include -IZ:\hb30\include OBJ\CopyFileWinApi.c Сами исходники здесь: http://zalil.ru/32543676

PSP: Andrey пишет: Error E2293 CopyFileWinApi.prg 60: ) expected Error E2206 CopyFileWinApi.prg 76: Illegal character '\' (0x5c) Ну, а что в файле CopyFileWinApi.prg в строках 60 и 76? ЗЫ. Ну да, ну да... Вроде все красиво. BCC что-ли неправильно препроцессерствует...

Andrey: PSP пишет: ЗЫ. Ну да, ну да... Вроде все красиво. BCC что-ли неправильно препроцессерствует... Вот и я не пойму, что там ему не понравилось ?

PSP: Andrey пишет: Вот и я не пойму, что там ему не понравилось ? Кажись, я понял. После копирования текста из форума, во всех строках в конце добавлен пробел. Получается, что в #define в 60-й строке символ \ остается после обработки препроцессором, а его в результирующей строке быть не должно. Он означает "продолжение на следующей строке", должен быть последним в строке. Убери замыкающий пробел в 60-й строке.

Andrey: PSP пишет: Убери замыкающий пробел в 60-й строке. Не помогло .... Убрал \ и подтянул всю строку, тогда заработало... Но не собралась программа .... Error: Unresolved external '_HB_FUN_WAPI_DIALOGBOXPARAM' referenced from Z:\HB30\SHFILEOPERATION\OBJ\COPYFILEWINAPI.OBJ Error: Unresolved external '_HB_FUN_WAPI_SETDLGITEMTEXT' referenced from Z:\HB30\SHFILEOPERATION\OBJ\COPYFILEWINAPI.OBJ Error: Unresolved external '_HB_FUN_WAPI_GETDLGITEM' referenced from Z:\HB30\SHFILEOPERATION\OBJ\COPYFILEWINAPI.OBJ Error: Unresolved external '_HB_FUN_WAPI_MESSAGEBOX' referenced from Z:\HB30\SHFILEOPERATION\OBJ\COPYFILEWINAPI.OBJ Error: Unresolved external '_HB_FUN_WAPI_ENDDIALOG' referenced from Z:\HB30\SHFILEOPERATION\OBJ\COPYFILEWINAPI.OBJ Error: Unresolved external '_hbwapi_SetLastError' referenced from Z:\HB30\SHFILEOPERATION\OBJ\COPYFILEWINAPI.OBJ hbmk2: Error: Running linker. 2 Видать какую-то библиотеку нужно добавлять....

Andrey: Нашел методом тыка, где сидит WAPI_DIALOGBOXPARAM - в hbwin.lib Добавил в проект -lhbwin.lib Ура, заработало Кому интересно вот готовый проект - http://zalil.ru/32545255 PSP спасибо за подсказку !!! Петр, БОЛЬШОЕ СПАСИБО !!!

Andrey: А как бегунок заставить "бежать" в этом примере ? И надписи меняться - выдавать имя копируемой базы ? Уж больно синтаксис навороченный в этом примере ! Да и правильно хочется понять, как такие конструкции использовать. Заранее спасибо за разъяснения.



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