|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Всплывающий индикатор копирования.
Подскажите как сделать всплывающий индикатор копирования?
Продедуры которые выполняются делать в этом всплывающем окне с индикатором или в отдельном?? Я пробовал, но туда не передаются данные из переменной. Индикатор молчит.. |
#2
|
|||
|
|||
Чувак, а что ты имеешь ввиду по словом "всплывающий"???Просто я сталкивался с такой штукой пару дней назад и решил ее путем тупого ПрогрессБара(т.е. во время копирования он появляется, ну и движется по ходу копирования)!!!!
Если хочешь, то могу тебе на мыло выслать прогу, которая при копировании файла работает с прогрессбаром!!!! Извини, но сейчас так не вспомню код... Последний раз редактировалось ~ SaM ~, 13.01.2007 в 20:06. |
#3
|
|||
|
|||
Рассказываю.
Значит есть главная форма. В главной форме есть кнопка (загрузить папки) Я жму на главную фрму у меня появляется диалоговое окно для загрузки папок и когда я выбираю папку и жму ОК у меня должен всплыть индикатор копирования и показывать результат. Вот. Чего значит я сделал. Создал вторую форму в ней индикатор и там же код. Не пашет. получается такая фигня, всплывает окно выбора директории а индикатор копирования как бы неактивный но его видно. Вообщем чушт какая то пол дня провозился, и в конце концов терпение кончилось, чувствую просто не по уму делаю, и сюда решил отписать. Почему то после закрытия формы диалога выбора каталога, ничего не хочет больше появляться на экран.Хотя вроде как отработала форма и выгрузилась. Просто передала путь в код и все. Дальше работает процедура копирования. Она по одному файлу копирует и из CheckListBox, галочки снимает. Но индикатор сабака молчит, хотя его видно. Код вставлен в событие Show. Потом происходит Hide после выполнение копирования. Тоесть как тока форма вторая с индикатором копирования Show, тут же открывается диалог выбора папки, я выбираю папку, путь передается в переменную например Dir := SelectFolder(Handle, 'Выбери каталог', 'C:\'); Далее пошел код копирования файлов. Когда все заканчивается все останавливается, форма с индикатором висит, но индикатор нкакой. И чтоб форма выгрузилась пришлось криво извратится, но это неправильно и временно. Я в событие OnDeactivate воткнул Hide; Потому что если это воткнуть в событие Show, то по окончании выполнения кпрограммы возникает ошибка. Вот еще проблемма сделать замоскрывающуюся форму. Вот... Последний раз редактировалось Delphinic, 14.01.2007 в 12:30. |
#4
|
||||
|
||||
Показывай код…
|
#5
|
|||
|
|||
unit CopyIndicators;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, cm_LSVGauges, ActiveX, ShlObj, ShellAPI; type TFcopy = class(TForm) OneCopy: TLSVGauge; procedure FormShow(Sender: TObject); procedure FormDeactivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Fcopy: TFcopy; IMassive : Integer; Dirs, MyDir : String; implementation uses SelectDir, PlayList; {$R *.dfm} function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): integer; stdcall; begin Result := 0; if uMsg = BFFM_INITIALIZED then SendMessage( hwnd, BFFM_SETSELECTION, 1, LongInt( PChar( myDir ) ) ); end; /// Выбор каталога. function SelectDirPlus(hWnd: HWND; const Caption: string; const Root: WideString): String; var WindowList: Pointer; BrowseInfo : TBrowseInfo; Buffer: PChar; RootItemIDList, ItemIDList: PItemIDList; ShellMalloc: IMalloc; IDesktopFolder: IShellFolder; Eaten, Flags: LongWord; Cmd: Boolean; begin FillChar( BrowseInfo, SizeOf( BrowseInfo ), 0 ); if ( ShGetMalloc( ShellMalloc ) = S_OK ) and ( ShellMalloc <> nil ) then begin Buffer := ShellMalloc.Alloc( MAX_PATH ); try RootItemIDList := nil; if Root <> '' then begin SHGetDesktopFolder( IDesktopFolder ); IDesktopFolder.ParseDisplayName( hWnd, nil, POleStr( Root ), Eaten, RootItemIDList, Flags ); end; with BrowseInfo do begin hwndOwner := hWnd; pidlRoot := RootItemIDList; pszDisplayName := Buffer; lpfn := BrowseCallbackProc; lpszTitle := PChar( Caption ); ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT; end; WindowList := DisableTaskWindows( 0 ); try ItemIDList := ShBrowseForFolder( BrowseInfo ); finally EnableTaskWindows( WindowList ); end; Cmd := ItemIDList <> nil; if Cmd then begin ShGetPathFromIDList( ItemIDList, Buffer ); ShellMalloc.Free( ItemIDList ); Result:= Buffer; end; finally ShellMalloc.Free( Buffer ); end; end; end; // Процедура копирования. procedure FastFileCopy(const InfileName, OutFileName: string; SizeDone, SizeFile: LongInt); const BufSize = 3*4*4096; type PBuffer = ^TBuffer; TBuffer = array [1..BufSize] of Byte; var Size : integer; Buffer : PBuffer; infile, outfile : file; // SizeDone, SizeFile: Longint; begin if (InFileName <> OutFileName) then begin buffer := nil; AssignFile(infile, InFileName); System.Reset(infile, 1); try SizeFile := FileSize(infile); AssignFile(outfile, OutFileName); System.Rewrite(outfile, 1); try SizeDone := 0; New(Buffer); repeat BlockRead(infile, Buffer^, BufSize, Size); Inc(SizeDone, Size); FCopy.OneCopy.Progress := SizeDone; // Индикатор копирования. Gauge. FCopy.OneCopy.MaxValue := SizeFile; // Максимальное значение Gauge. BlockWrite(outfile,Buffer^, Size) until Size < BufSize; FileSetDate(TFileRec(outfile).Handle, FileGetDate(TFileRec(infile).Handle)); finally if Buffer <> nil then Dispose(Buffer); System.close(outfile) end; finally System.close(infile); end; end else raise EInOutError.Create('File cannot be copied into itself'); end; procedure TFcopy.FormShow(Sender: TObject); begin FCopy.Visible := True; // Пытался добиться видимости формы. Dirs := SelectDirPlus( Handle, 'Выбор каталога', 'd:\' ); /// Выбор каталога Imassive := 0; Repeat If ListF.CLB.Count = 0 Then Exit; // ListF Список файлов MP3. CheckListBox (CLB) If ListF.CLB.Selected[Imassive] = True Then Begin FileSetAttr(ListF.CLB.items[IMassive],FaArchive); FastFileCopy(ListF.CLB.items.Strings[IMassive],Dirs+'\'+ExtractFileName(ListF.CLB.items.Strings[Imassive]),int1,int); //Обращение к процедуре копирования файлов . End; IMAssive := Imassive + 1; //Form1.Caption := IntToStr(CLB.Count); Until IMassive = ListF.CLB.Count; IMassive := 0; Repeat If ListF.CLB.Count = 0 Then Exit; If ListF.CLB.Checked[Imassive] = True Then Begin FileSetAttr(ListF.CLB.Items.Strings[Imassive],FaArchive); FastFileCopy(ListF.CLB.items[IMassive],Dirs+'\'+ExtractFileName(ListF.CLB.items[Imassive]),int1,int); ListF.CLB.Checked[IMassive] := False; End; Inc(Imassive); Until Imassive = ListF.CLB.Count; end; procedure TFcopy.FormDeactivate(Sender: TObject); begin ShowWindow(Fcopy.Handle, SW_Hide); // Типа скрывается форма. Но по кривому. end; end. Последний раз редактировалось Delphinic, 14.01.2007 в 23:31. |
#6
|
||||
|
||||
Глянь это - primer.zip
|
#7
|
||||
|
||||
Меня как-то попросили написать что-то подобное, получильсь вот что (см. вложение), для отображения и настроек используются 4 функции из SystemUtilites, работает довольно сносно даже сам пользуюсь, хотя и делал не для себя.
Алгоритм работы такой: Установить текст сообщение WaitSayMessage [Установить минимальное и максимальное значение прогрессбара WaitSetMinMax] Вывести окно [второй параметр - показывать прогресс или нет] WaitWin [В цикле ожидания менять значение прогрессбара WaitSetPos] "Погасить" окно WaitWin |
#8
|
|||
|
|||
Не. Вы меня не поняли..
Мне надо примостырить только вот это!! /// Выбор каталога. function SelectDirPlus(hWnd: HWND; const Caption: string; const Root: WideString): String; var WindowList: Pointer; BrowseInfo : TBrowseInfo; Buffer: PChar; RootItemIDList, ItemIDList: PItemIDList; ShellMalloc: IMalloc; IDesktopFolder: IShellFolder; Eaten, Flags: LongWord; Cmd: Boolean; begin FillChar( BrowseInfo, SizeOf( BrowseInfo ), 0 ); if ( ShGetMalloc( ShellMalloc ) = S_OK ) and ( ShellMalloc <> nil ) then begin Buffer := ShellMalloc.Alloc( MAX_PATH ); try RootItemIDList := nil; if Root <> '' then begin SHGetDesktopFolder( IDesktopFolder ); IDesktopFolder.ParseDisplayName( hWnd, nil, POleStr( Root ), Eaten, RootItemIDList, Flags ); end; with BrowseInfo do begin hwndOwner := hWnd; pidlRoot := RootItemIDList; pszDisplayName := Buffer; lpfn := BrowseCallbackProc; lpszTitle := PChar( Caption ); ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT; end; WindowList := DisableTaskWindows( 0 ); try ItemIDList := ShBrowseForFolder( BrowseInfo ); finally EnableTaskWindows( WindowList ); end; Cmd := ItemIDList <> nil; if Cmd then begin ShGetPathFromIDList( ItemIDList, Buffer ); ShellMalloc.Free( ItemIDList ); Result:= Buffer; end; finally ShellMalloc.Free( Buffer ); end; end; end; OpenDialog никатит никак!! Мне надо в строку только каталог.. Мне вообще только каталог надо. Потому что я файл копирую из плейлиста.. Мне ненадо просто файл копировать, это я и сам знаю как. Мне надо выбрать только каталог.. С опендиалогом я сам делал нормально, но эта нгадость ну никак недает форму открыть.. Как буд то все блокирует после себя. |
#9
|
||||
|
||||
Кароч, стучись в аську
|
#10
|
|||
|
|||
Ну вот столько голову ломал и так и сяк,
а всего то надо было вставить в мою программку строчку Application.ProcessMessages; И все сразу заработало и все индикаторы стали показывать все что надо!! |
#11
|
|||
|
|||
Так чего же делает Application.ProcessMessage??
Почему без него прога не может данные передать куда надо? |
#12
|
||||
|
||||
Заставляет программу обрабатывать сообщения из очереди
|
#13
|
|||
|
|||
Ну впринципе я так и думал.
Даа, знать бы мне это огда я тока начаинал заниматься, ох скока я всего кривого наделал.. :d |
#14
|
||||
|
||||
Цитата:
Delphi & LMD & RXLib / VBA / Windows / Linux |
#15
|
|||
|
|||
А мне помогите!!!!
Мне нужно просто скопировать каталог с индикатором копирования! Пытаюсь скачать Ваши вложения, а качается какая-то ... - attachmentid=76???
Перешлите, пожалуйста: p10006@mail.ru Плз!!!!!!! |