Форум: "Начинающим";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизПеренос файлов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.013 c