Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

Перенос файлов   Найти похожие ветки 

 
Der Nechk@ssoff ©   (2006-04-10 11:48) [0]

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


 
Gydvin ©   (2006-04-10 11:58) [1]

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


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

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"ы и куда тебе там еще надо.



Страницы: 1 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.043 c
2-1144691948
Системщик
2006-04-10 21:59
2006.04.23
Функция CASE


15-1143814893
Tonich
2006-03-31 18:21
2006.04.23
C++


3-1141205347
Kot_
2006-03-01 12:29
2006.04.23
Выборка без дублирования?


1-1142858068
nastya
2006-03-20 15:34
2006.04.23
объявить константы в TypeLibrary


15-1143665763
zeman
2006-03-30 00:56
2006.04.23
Нужна помощь