Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.01.2007, 17:25
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию Всплывающий индикатор копирования.

Подскажите как сделать всплывающий индикатор копирования?
Продедуры которые выполняются делать в этом всплывающем окне с индикатором или в отдельном??
Я пробовал, но туда не передаются данные из переменной.
Индикатор молчит..
Ответить с цитированием
  #2  
Старый 13.01.2007, 20:01
~ SaM ~ ~ SaM ~ вне форума
Начинающий
 
Регистрация: 05.01.2007
Адрес: Днепропетровск
Сообщения: 141
Репутация: 25
По умолчанию

Чувак, а что ты имеешь ввиду по словом "всплывающий"???Просто я сталкивался с такой штукой пару дней назад и решил ее путем тупого ПрогрессБара(т.е. во время копирования он появляется, ну и движется по ходу копирования)!!!!
Если хочешь, то могу тебе на мыло выслать прогу, которая при копировании файла работает с прогрессбаром!!!!
Извини, но сейчас так не вспомню код...

Последний раз редактировалось ~ SaM ~, 13.01.2007 в 20:06.
Ответить с цитированием
  #3  
Старый 14.01.2007, 12:18
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию

Рассказываю.
Значит есть главная форма.
В главной форме есть кнопка (загрузить папки)
Я жму на главную фрму у меня появляется диалоговое окно для загрузки папок и когда я выбираю папку и жму ОК у меня должен всплыть индикатор копирования и показывать результат.
Вот.
Чего значит я сделал.
Создал вторую форму в ней индикатор и там же код.
Не пашет.
получается такая фигня, всплывает окно выбора директории а индикатор копирования как бы неактивный но его видно. Вообщем чушт какая то пол дня провозился, и в конце концов терпение кончилось, чувствую просто не по уму делаю, и сюда решил отписать.
Почему то после закрытия формы диалога выбора каталога, ничего не хочет больше появляться на экран.Хотя вроде как отработала форма и выгрузилась. Просто передала путь в код и все. Дальше работает процедура копирования.
Она по одному файлу копирует и из CheckListBox, галочки снимает. Но индикатор сабака молчит, хотя его видно.
Код вставлен в событие Show. Потом происходит Hide после выполнение копирования.
Тоесть как тока форма вторая с индикатором копирования Show, тут же открывается диалог выбора папки, я выбираю папку, путь передается в переменную например Dir := SelectFolder(Handle, 'Выбери каталог', 'C:\');
Далее пошел код копирования файлов.
Когда все заканчивается все останавливается, форма с индикатором висит, но индикатор нкакой.
И чтоб форма выгрузилась пришлось криво извратится, но это неправильно и временно. Я в событие OnDeactivate воткнул Hide;
Потому что если это воткнуть в событие Show, то по окончании выполнения кпрограммы возникает ошибка.
Вот еще проблемма сделать замоскрывающуюся форму.

Вот...

Последний раз редактировалось Delphinic, 14.01.2007 в 12:30.
Ответить с цитированием
  #4  
Старый 14.01.2007, 19:39
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Показывай код…
Ответить с цитированием
  #5  
Старый 14.01.2007, 23:20
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию

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  
Старый 15.01.2007, 00:57
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Глянь это - primer.zip
Ответить с цитированием
  #7  
Старый 15.01.2007, 06:48
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Меня как-то попросили написать что-то подобное, получильсь вот что (см. вложение), для отображения и настроек используются 4 функции из SystemUtilites, работает довольно сносно даже сам пользуюсь, хотя и делал не для себя.
Алгоритм работы такой:
Установить текст сообщение WaitSayMessage
[Установить минимальное и максимальное значение прогрессбара WaitSetMinMax]
Вывести окно [второй параметр - показывать прогресс или нет] WaitWin
[В цикле ожидания менять значение прогрессбара WaitSetPos]
"Погасить" окно WaitWin
Вложения
Тип файла: zip wait.zip (4.5 Кбайт, 45 просмотров)
Ответить с цитированием
  #8  
Старый 15.01.2007, 18:01
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию

Не. Вы меня не поняли..
Мне надо примостырить только вот это!!

/// Выбор каталога.
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  
Старый 16.01.2007, 05:41
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Кароч, стучись в аську
Ответить с цитированием
  #10  
Старый 21.01.2007, 16:37
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию

Ну вот столько голову ломал и так и сяк,
а всего то надо было вставить в мою программку строчку
Application.ProcessMessages;
И все сразу заработало и все индикаторы стали показывать все что надо!!
Ответить с цитированием
  #11  
Старый 22.01.2007, 10:42
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию

Так чего же делает Application.ProcessMessage??
Почему без него прога не может данные передать куда надо?
Ответить с цитированием
  #12  
Старый 22.01.2007, 10:47
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Заставляет программу обрабатывать сообщения из очереди
Ответить с цитированием
  #13  
Старый 22.01.2007, 10:50
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию

Ну впринципе я так и думал.
Даа, знать бы мне это огда я тока начаинал заниматься, ох скока я всего кривого наделал.. :d
Ответить с цитированием
  #14  
Старый 23.01.2007, 22:54
Аватар для Softovick
Softovick Softovick вне форума
Прохожий
 
Регистрация: 23.01.2007
Адрес: Москва
Сообщения: 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Delphinic
Так чего же делает Application.ProcessMessage??
Почему без него прога не может данные передать куда надо?
Вах, только что собрался написать про эту функцию... не успел, сам догадался
__________________
Delphi & LMD & RXLib / VBA / Windows / Linux
Ответить с цитированием
  #15  
Старый 09.05.2007, 20:56
Garacio Garacio вне форума
Прохожий
 
Регистрация: 09.05.2007
Сообщения: 2
Репутация: 10
По умолчанию А мне помогите!!!!

Мне нужно просто скопировать каталог с индикатором копирования! Пытаюсь скачать Ваши вложения, а качается какая-то ... - attachmentid=76???

Перешлите, пожалуйста:
p10006@mail.ru

Плз!!!!!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter