Войти

Показать полную графическую версию : Не могу разобратся с savedialog


Njey
10-03-2008, 09:48
В программе необходимо сделать возможность копирования файлов по средством 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.Придумайте,как это можно применить к Дельфям.

Njey
12-03-2008, 06:31
Здадача такая. В корневой папке программы лежат следующие файлы:
pas.db
pas.px
pas.val
tepl.db
tepl.px
tepl.val
Необходимо из программы нужные пользователю файлы (те которые он выберет) скопировать в любую директорию которую выберет пользователь.

DillerInc
12-03-2008, 18:01
Задача,значит такая.Берёшь какой-нибудь материал по этой теме и начинаешь зубрить.Тем более,что я сказал в первом своём посте,в какую сторону нужно копать.И потом говоришь,что конкретно не получается.

Вот нашёл у себя небольшой исходник большой давности.Прикладываю.Как раз по этой теме,но там я не использовал сохранение файлов,только открытие.Т.к. дело было давно,то код далёк от идеального.И там НЕ используется VCL.

zip000
12-03-2008, 22:08
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;

Njey
13-03-2008, 08:11
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 просто копируется под разными именами.

zip000
13-03-2008, 15:48
в таком виде таблица pas.db просто копируется под разными именами. »
ну что вы написали в 1 посте, то и получили. Смысл сего довльно прост : когда вы выбираете в SaveDialog несколько файлов, количество выбранных файлов храниться в SaveDialog.Files.Count, а доступ к конкретному имени файла осуществляется так SaveDialog.Files[НОМЕР_ФАЙЛА_В_СПИСКЕ_ВЫБРАННЫХ].

Njey
14-03-2008, 09:16
Цитата 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;
ток теперь вобще копирования не происходит.

detrin
14-03-2008, 20:27
Необходимо из программы нужные пользователю файлы (те которые он выберет) скопировать в любую директорию которую выберет пользователь. »
Что-то не совсем понятно, как вы с помощью только одного Savedialog хотите запомнить нужные файлы и папку куда их копировать? Я так понял ни список файлов заранее не известен, ни папка в которую нужно копировать эти файлы.

Njey
15-03-2008, 11:44
Detrin в идеале да, список файлов не известен. Вернее он ограничен списком файлов лежащих в директории программы. У меня мало опыта в программирововании, поэтому пытаюсь упростить задачу. Думаю сделать сохранение по определенным комбинациям файлов. Вот тока не совсем получается. Посмотрите предидущий пост. В чем моя ошибка?

detrin
15-03-2008, 23:45
Я бы решал задачу по-другому.
Через 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.

Njey
17-03-2008, 13:13
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); то -ошбика.

detrin
17-03-2008, 20:33
Njey
Что за ошибка? У меня всё работает.

Njey
18-03-2008, 16:13
Detrin, ошибка оказалась другого плана. С ней все кончено. Не понятно другое. В опен-диалог я прописывая имя исходного файл. И путь. В данном случае диск 'с'. При открыти на диск 'с'
копируется выбранный файл с именем прописал в диалоге.(в(Pansichar (OpenDialog1 .Files[i]),
'c:\'+'рas.db', false); В данном случае
раs.db. И изменить его на правильное могу только с помощью переименования. И соответственно SHBrowseForFolder
не видет списка файлов. Я так понял, что диалогом должен был откры вать список копируемых файлов, а SHBrowseForFolder
указывает папку куда копирывать. Но ни чего такого нет. Может еще что прописать надо?

detrin
18-03-2008, 21:14
Несовсем понял в чём вы не разобрались. Попробую ещё раз объяснить.
CopyFile (Pansichar(OpenDialog1.Files[i]), ПУТЬ_КУДА_КОПИРУЕМ+ИМЯ_ФАЙЛА, false); »
С помощью SHBrowseForFolder мы получаем "ПУТЬ_КУДА_КОПИРУЕМ". Путь хранится в переменной TempPath. Остаётся только указать имена файлов. В общем случае имена файлов заранее неизвестны, но известны полный путь + имя файла. Они хранятся в OpenDialog1.Files[i]. Ну а далее просто обрезаем путь.




© OSzone.net 2001-2012