Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перенос файлов [D7, XP]


Der Nechk@ssoff ©   (2006-04-10 11:48:00) 

Здраствуйте!У меня на форме есть два Filelistbox,можно-ли(если да,то как?) реализовать перемещениефайлов(путем перетаскивания или через буттон) из одной папки в другую?
p.s.папки указываются DirectoryListBox-ом.


Старик   (2006-04-10 12:01:00) [1]

procedure TfrDualList.ListDragOver(Sender, Source: TObject; X,
 Y: Integer; State: TDragState; var Accept: Boolean);
var
 DragIndex: integer;
begin
 // из другого листбокса принимаем всегда
 if Source Sender then
   Accept := true
     // а если это мы сами - надо проверить возможность изменения порядка
   // в списке и позицию сбрасывания
 else
   with (Sender as TListBox) do
   begin
     Accept := False;
     if not Sorted and ((SelCount = 1) or (not MultiSelect)) then
     begin
       DragIndex := ItemAtPos(Point(X, Y), True);
       if (DragIndex >= 0) and (DragIndex ItemIndex) then
         Accept := True; // попали внутрь видимого списка
     end;
   end;
 // установка изображения курсора
 if State = dsDragLeave then
   (Source as TListBox).DragCursor := crDrag;
 if (State = dsDragEnter) and ((Source as TListBox).SelCount > 1) then
   (Source as TListBox).DragCursor := crMultiDrag;
end;

procedure TfrDualList.ListDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
 if Source Sender then // перемещаем элементы из другого листбокса
   MoveItems(TListBox(Source), TListBox(Sender))
 else
   BoxMoveSel(TListBox(Sender), // перемещаем элемент внутри списка
     TListBox(Sender).ItemAtPos(Point(X, Y), True));
end;

это тебе на Drag&Drop. По аналогу переписываешь на Shell-компоненты, FileListBox'ы и куда тебе там еще надо.


Gydvin   (2006-04-10 11:58:00) [2]

Copy/paste

function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;

Эта функция работает очень надёжно, поскольку она является частью операционной системы и практически наверняка именно она тестировалась огромное количетво раз. Тем не менее, первое, на чём мы остановимся — что в этой функции нас не устраивает?

if CopyFile(PChar(SourcePath), PChar(TargetPath), False) then
// Выполнилась успешно.
else
// Ошибка. Код ошибки можно получить, вызвав GetLastError.

У этой функции один недостаток, но он способен перекрыть все её достоинства. Мы не имеем доступа к процессу копирования. Это означает, что мы не можем показывать индикатор процесса копирования и не можем прервать функцию CopyFile, если пользователь нажал кнопку "Отмена" или клавишу Escape.

В Delphi для копирования файлов, мы можем воспользоваться объектами класса TFileStream. Например, так:

procedure CopyFile(Source, Target: String);
var
SourceStream: TFileStream;
TargetStream: TFileStream;
begin
SourceStream := TFileStream(Source, fmOpenRead);
try
TargetStream := TFileStream(Target, fmCreate);
try
TargetStream.CopyFrom(SourceStream, 0);
FileSetDate(TargetStream.Handle, FileGetDate(SourceStream.Handle));
finally
TargetStream.Free;
end;
finally
SouceStream.Free;
end;
FileSetAttr(Target, FileGetAttr(Source));
end;
Обработку ошибок, как говорится в таких случаях, я оставляю читателю в качестве упражнения... :)


PS. После копирования файла, удаляй его на старом месте DeleteFile


Наверх

Титульная страница Поиск, карта сайта Написать письмо