Показать полную графическую версию : Не могу разобратся с savedialog
В программе необходимо сделать возможность копирования файлов по средством savedialog.
Вот код:
If savedialog.Execute then CopyFile (
Pansichar(ExtractFilePath
(Application.ExeName)+'\pas.db'),
Pansichar(SaveDialog1.FileName),
false);
Проблема такая. Несмотря на то, что выделяю несколько файлов копируется всегда только один. Как нужно изменить код, чтобы можно было копировать несколько файлов, желательно любых расширений?
За ранее спасибо.
DillerInc
11-03-2008, 20:27
Njey, нужно больше конкретики: что,куда...
А так я думаю,что это связано с необходимостью использования флага OFN_ALLOWMULTISELECT в структуре OPENFILENAME.Это всё про WinAPI.Придумайте,как это можно применить к Дельфям.
Здадача такая. В корневой папке программы лежат следующие файлы:
pas.db
pas.px
pas.val
tepl.db
tepl.px
tepl.val
Необходимо из программы нужные пользователю файлы (те которые он выберет) скопировать в любую директорию которую выберет пользователь.
DillerInc
12-03-2008, 18:01
Задача,значит такая.Берёшь какой-нибудь материал по этой теме и начинаешь зубрить.Тем более,что я сказал в первом своём посте,в какую сторону нужно копать.И потом говоришь,что конкретно не получается.
Вот нашёл у себя небольшой исходник большой давности.Прикладываю.Как раз по этой теме,но там я не использовал сохранение файлов,только открытие.Т.к. дело было давно,то код далёк от идеального.И там НЕ используется VCL.
Njey, все просто
var
i : Integer;
......................................
if SaveDialog1.Execute then
for i := 0 to SaveDialog1.Files.Count - 1 do begin
CopyFile (ИСХОДНЫЙ_ФАЙЛ, Pansichar(SaveDialog1.Files[i]), false);
end;
Zip000, к сожалению не просто.
var i : Integer;
if
SaveDialog1 .Execute then for i :=
0 to SaveDialog1 .Files.Count - 1
do
begin
CopyFile
(Pansichar(extractfilepatch( Application.ExeNAME)+'\pas.db'),
Pansichar
(SaveDialog1.Files[i]), false);
в таком виде таблица pas.db просто копируется под разными именами.
в таком виде таблица pas.db просто копируется под разными именами. »
ну что вы написали в 1 посте, то и получили. Смысл сего довльно прост : когда вы выбираете в SaveDialog несколько файлов, количество выбранных файлов храниться в SaveDialog.Files.Count, а доступ к конкретному имени файла осуществляется так SaveDialog.Files[НОМЕР_ФАЙЛА_В_СПИСКЕ_ВЫБРАННЫХ].
Цитата zip000:
к конкретному имени файла
осуществляется так
SaveDialog.Files
[НОМЕР_ФАЙЛА_В_СПИСКЕ_ВЫ
БРАННЫХ].
--------
var i : Integer;...................................... if
SaveDialog1 .Execute then for i :=
0 to SaveDialog1 .Files.Count - 1
do begin CopyFile
(ИСХОДНЫЙ_ФАЙЛ, Pansichar
(SaveDialog1.Files[i]), false); end;
-----------
Значит в место ИСХОДНЫЙ_ФАЙЛ мне нужно подставлять все исходные файлы?
Типа так:
const
afilename : array[1..2] of string=('pas.db', 'pas.px');
var i : Integer;
afilename : array[1..2] of string=('pas.db', 'pas.px');
if
SaveDialog1 .Execute then
begin
for i :=
0 to SaveDialog1 .Files.Count - 1 do
CopyFile
(PansiChar ('afilename'), Pansichar
(SaveDialog1.Files[i]), false); end;
ток теперь вобще копирования не происходит.
Необходимо из программы нужные пользователю файлы (те которые он выберет) скопировать в любую директорию которую выберет пользователь. »
Что-то не совсем понятно, как вы с помощью только одного Savedialog хотите запомнить нужные файлы и папку куда их копировать? Я так понял ни список файлов заранее не известен, ни папка в которую нужно копировать эти файлы.
Detrin в идеале да, список файлов не известен. Вернее он ограничен списком файлов лежащих в директории программы. У меня мало опыта в программирововании, поэтому пытаюсь упростить задачу. Думаю сделать сохранение по определенным комбинациям файлов. Вот тока не совсем получается. Посмотрите предидущий пост. В чем моя ошибка?
Я бы решал задачу по-другому.
Через Opendialog получаем список копируемых файлов.
Далее с помощью SHBrowseForFolder получаем папку куда будем их копировать. Вот пример:
uses ShellAPI, ShlObj;
procedure TForm1.Button1Click(Sender: TObject);
var
TitleName: string;
lpItemID: PItemIDList;
BrowseInfo: TBrowseInfo;
DisplayName: array[0..MAX_PATH] of char;
TempPath: array[0..MAX_PATH] of char;
begin
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
BrowseInfo.hwndOwner := Form1.Handle;
BrowseInfo.pszDisplayName := @DisplayName;
TitleName := 'Please specify a directory';
BrowseInfo.lpszTitle := PChar(TitleName);
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then
begin
SHGetPathFromIDList(lpItemID, TempPath);
ShowMessage(TempPath);
GlobalFreePtr(lpItemID);
end;
end;
Ну а далее, как уже писал выше zip000, делаем копирование файлов:
var
i : Integer;
......................................
if OpenDialog1.Execute then
for i := 0 to OpenDialog1.Files.Count - 1 do begin
CopyFile (Pansichar(OpenDialog1.Files[i]), ПУТЬ_КУДА_КОПИРУЕМ+ИМЯ_ФАЙЛА, false);
end;
DillerInc
16-03-2008, 09:49
Ну,хоть кто-то предложил трезвое решение :)
detrin, спасибо за SHBrowseForFolder.
Detrin еще просьба еси можно.
"Ну а далее, как уже писал выше *zip000*, делаем копирование файлов:
Code:
---------
var
i : Integer;
.......................................
if OpenDialog1.Execute then
for i := 0 to OpenDialog1.Files.Count - 1 do begin
CopyFile (Pansichar(OpenDialog1.Files[i]), ПУТЬ_КУДА_КОПИРУЕМ+ИМЯ_ФАЙЛА, false);
end;"
В каком формате записывается "ПУТЬ_КУДА_КОПИРУЕМ+ИМЯ_ФАЙЛА" Есле писать (Pansichar(OpenDialog1.Files[i]), 'c:\'+'рas.db', false); то -ошбика.
Njey
Что за ошибка? У меня всё работает.
Detrin, ошибка оказалась другого плана. С ней все кончено. Не понятно другое. В опен-диалог я прописывая имя исходного файл. И путь. В данном случае диск 'с'. При открыти на диск 'с'
копируется выбранный файл с именем прописал в диалоге.(в(Pansichar (OpenDialog1 .Files[i]),
'c:\'+'рas.db', false); В данном случае
раs.db. И изменить его на правильное могу только с помощью переименования. И соответственно SHBrowseForFolder
не видет списка файлов. Я так понял, что диалогом должен был откры вать список копируемых файлов, а SHBrowseForFolder
указывает папку куда копирывать. Но ни чего такого нет. Может еще что прописать надо?
Несовсем понял в чём вы не разобрались. Попробую ещё раз объяснить.
CopyFile (Pansichar(OpenDialog1.Files[i]), ПУТЬ_КУДА_КОПИРУЕМ+ИМЯ_ФАЙЛА, false); »
С помощью SHBrowseForFolder мы получаем "ПУТЬ_КУДА_КОПИРУЕМ". Путь хранится в переменной TempPath. Остаётся только указать имена файлов. В общем случае имена файлов заранее неизвестны, но известны полный путь + имя файла. Они хранятся в OpenDialog1.Files[i]. Ну а далее просто обрезаем путь.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.