Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Не могу разобратся с savedialog (http://forum.oszone.net/showthread.php?t=102447)

Njey 10-03-2008 09:48 756858

Не могу разобратся с savedialog
 
В программе необходимо сделать возможность копирования файлов по средством savedialog.
Вот код:
If savedialog.Execute then CopyFile (
Pansichar(ExtractFilePath
(Application.ExeName)+'\pas.db'),
Pansichar(SaveDialog1.FileName),
false);
Проблема такая. Несмотря на то, что выделяю несколько файлов копируется всегда только один. Как нужно изменить код, чтобы можно было копировать несколько файлов, желательно любых расширений?
За ранее спасибо.

DillerInc 11-03-2008 20:27 758087

Njey, нужно больше конкретики: что,куда...
А так я думаю,что это связано с необходимостью использования флага OFN_ALLOWMULTISELECT в структуре OPENFILENAME.Это всё про WinAPI.Придумайте,как это можно применить к Дельфям.

Njey 12-03-2008 06:31 758325

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

DillerInc 12-03-2008 18:01 758796

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

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

zip000 12-03-2008 22:08 758978

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 759185

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 759492

Цитата:

Цитата Njey
в таком виде таблица pas.db просто копируется под разными именами. »

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

Njey 14-03-2008 09:16 760029

Цитата 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 760573

Цитата:

Цитата Njey
Необходимо из программы нужные пользователю файлы (те которые он выберет) скопировать в любую директорию которую выберет пользователь. »

Что-то не совсем понятно, как вы с помощью только одного Savedialog хотите запомнить нужные файлы и папку куда их копировать? Я так понял ни список файлов заранее не известен, ни папка в которую нужно копировать эти файлы.

Njey 15-03-2008 11:44 760835

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

detrin 15-03-2008 23:45 761329

Я бы решал задачу по-другому.
Через 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 761460

Ну,хоть кто-то предложил трезвое решение :)
detrin, спасибо за SHBrowseForFolder.

Njey 17-03-2008 13:13 762116

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 762383

Njey
Что за ошибка? У меня всё работает.

Njey 18-03-2008 16:13 763001

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

detrin 18-03-2008 21:14 763222

Несовсем понял в чём вы не разобрались. Попробую ещё раз объяснить.
Цитата:

Цитата detrin
CopyFile (Pansichar(OpenDialog1.Files[i]), ПУТЬ_КУДА_КОПИРУЕМ+ИМЯ_ФАЙЛА, false); »

С помощью SHBrowseForFolder мы получаем "ПУТЬ_КУДА_КОПИРУЕМ". Путь хранится в переменной TempPath. Остаётся только указать имена файлов. В общем случае имена файлов заранее неизвестны, но известны полный путь + имя файла. Они хранятся в OpenDialog1.Files[i]. Ну а далее просто обрезаем путь.


Время: 19:26.

Время: 19:26.
© OSzone.net 2001-