Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2010, 11:17   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Сохранение файла в только что созданную директорию

Сабж в названии темы. Как сохранить файл в только что созданную папку? У меня есть код кнопки, в которой создается директория с текущей датой и туда должен сохраняться файл. Причем если файл с таким именем существует, то второй с таким же именем добавляется, но перед его именем ставится цифра. Например такая ситуация. Создалась директория 25.06.2010. Туда же сохраняется файл с имененем 342353.pdf. Затем, чуть позже, в эту же папку должен сохраниться новый файл, который является продолжением файла с именем 342353, но у второго файла имя уже должно быть 2_342353. Иными словами, должна происходить проверка на наличие файла в папке, у которого имя совпадает с вновь добавляемым. Вот такая вот довольно таки сложная задачка.
Мой наработки:
Код:
procedure TForm3.CheckBox1Click(Sender: TObject);
var
 s: string;
begin
  CreateDir(ExtractFilePath(Application.ExeName) + DateToStr(Now)); //создаю папку 

  Form3.SaveDialog1.DefaultExt:=ExtractFilePath(Application.ExeName); //пытаюсь присвоить путь для SaveDialog1
  Form3.PReport1.FileName:=Form1.Edit29.Text + '.pdf'; //задается имя для файла
  Form3.PReport1.BeginDoc; //начало работы с документом
  Form3.PReport1.Print(Form3.PRPage1); //создание pdf документа
  Form3.PReport1.EndDoc; //конец работы с документом
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 25.06.2010 в 11:20.
artemavd вне форума Ответить с цитированием
Старый 25.06.2010, 11:47   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
procedure TForm3.CheckBox1Click(Sender: TObject);
var
 s, sDir, sFileName : string;
 I : integer; 
begin
  sDir :=  ExtractFilePath(Application.ExeName) + DateToStr(Now);
  CreateDir(sDir); //создаю папку 

{это я не понял, зачем? во-первых, 
при чём здесь расширение по умолачанию DefaultExt
  а во вторых, не вижу вызова SaveDialog1.Execute ..... :(}
  Form3.SaveDialog1.DefaultExt:=ExtractFilePath(Application.ExeName); //пытаюсь присвоить путь для SaveDialog1


sFileName := Form1.Edit29.Text + '.pdf';
i := 1;
while FileExists(sDir+'\'+sFileName) do begin
  inc(i);
  sFileName := IntToStr(i)+'_'+Form1.Edit29.Text + '.pdf';
end;
Form3.PReport1.FileName:= sDir+'\'+sFileName; //задается имя для файла
  Form3.PReport1.BeginDoc; //начало работы с документом
  Form3.PReport1.Print(Form3.PRPage1); //создание pdf документа
  Form3.PReport1.EndDoc; //конец работы с документом
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.06.2010, 12:01   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Серж, супер! Спасибо! . Как смогу - добавлю отзыв!)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.06.2010, 12:05   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как сохранить файл в только что созданную папку?
Ну дык присвой имя папки в некую переменную, а потом эту переменную используй в пути к файлу.
Цитата:
то второй с таким же именем добавляется, но перед его именем ставится цифра.
В цикле
Код:
i:=1;
while fileExists(FileName) do begin
 FileName:=Path+'Файл'+IntToStr(i)+'.расширение';
 inc(i);
end;
Здесь Path = ExtractFilePath(Application.ExeName ) + DateToStr(Now)

Цитата:
Serge_Bliznykov
Собсно я так... Повторяюсь... Не обращай те на меня внимания
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2010, 12:18   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот если бы еще можно было бы вместо даты для созданной папки указать порядковый номер, начиная с единицы, то было бы тоже супер . Но, это впринципе необязательно пока что, так что, если не хотите, то не заморачивайтесь).
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.06.2010, 12:21   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
указать порядковый номер, начиная с единицы,
Дак в чем сложность?
В моем примере вместо fileExists используй DirectoryExists, и на выходе цикла получишь номер последней директории с таким числом в имени
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.06.2010, 12:47   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Виталий, ради интереса пробую твой код:
Код:
i:=1;
while fileExists(FileName) do begin
 FileName:=Path+'Файл'+IntToStr(i)+'.расширение';
 inc(i);
end;
а что в твоем коде вместо FileName ты подразумевал?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.06.2010, 12:52   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

FileName -это имя файла с полным путем.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2010, 03:21   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Доброе утро! Я сканирую документ. Вот, пытался сделать сохранение каждой отсканированной страницы в отдельный файл с порядковым номером. Пытался сделать код по аналогии с кодос Сергея. Но у меня получается, что сохраняется только последняя отсканированная страница. В Image грузить не надо. Надо, чтобы сразу отсканированная страница сохранялась в TIFF файл. Помогите подправить код?
Код:
procedure TForm1.BtnClick(Sender: TObject);
var
 dat: hBitMap;
 PInfo: PBitMapInfoHeader;
 Height,Width,num:integer;
 sFileName,sDir: string;

 function stp2(s:byte):longint;
 var
  m: longint;
  i: byte;
 begin
  m:=2;
  for i:=2 to s do m:=m*2;
  stp2:=m;
 end;

begin
 Form1.Timer2.Enabled:=True;

 {Получаем указатель на графические данные}
 dat:=TWAIN_AcquireNative(Handle,0);
 if dat <> 0 then begin
  {Получаем указатель на область памяти содержащей DIB
   данные и блокируем область памяти}
  PInfo:=GlobalLock(dat);
  {Анализируем полученные данные}
  Height:=PInfo.biHeight ;
  Width:=PInfo.biWidth ;
Form1.StatusBar1.Panels[3].Text:=floatToStrF(100/PInfo.biXPelsPerMeter*Width,ffNumber,8,3);
Form1.StatusBar1.Panels[1].Text:=floatToStrF(100/PInfo.biYPelsPerMeter*Height,ffNumber,8,3);
  Form1.StatusBar1.Panels[5].Text:=floatToStrF(stp2(PInfo.biBitCount),ffNumber,8,0);
  {Разблокируем память}
  GlobalUnlock(dat);
  {Передаем в битовую матрицу графические данные}
  {И устанавливаем перехват ошибок}
  try
   MyBitMap.Palette :=TWAIN_CreateDibPalette(dat);
   MyBitMap.Width := Width;
   MyBitMap.Height := Height;
   TWAIN_DrawDibToDC(MyBitMap.Canvas.Handle,0,0,Width,Height,dat,0,0);
  except
   {Обрабатываем наиболее вероятную ошибку связанную с не хваткой ресурсов
    для загрузки изображения}
   on EOutOFResources do
      MessageDlg('Нет ресурсов для загрузки изображения!', mtError,[mbOk],0);
  end;
//   MyBitMap.SaveToFile();
   {Отображаем графические данные}
   {Сохраняем отсканированный файл}

   sFileName:=Form1.Edit1.Text + '.tiff';
   num:=1;
   while FileExists(sDir + '\' + sFileName) do
   begin
    Inc(num);
    sFileName:=IntToStr(num) + '_' + Form1.Edit1.Text + '.tiff';
 //   MyBitMap.SaveToFile(sFileName);
   end;
   //Canvas.Draw(10,10,MyBitMap);
   Image1.Picture.Graphic:=MyBitMap;
   Image1.Picture.SaveToFile(sFileName);
   {Освобождаем память занятую графическими данными}
   TWAIN_FreeNative(dat);
 end;
end;
Свой код я выделил зеленым.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 29.07.2010, 05:47   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я вижу одни небольшой косячок..
не исключено, что дело в нём. (а может и нет.. )
в цикл, когда проверяется существование файла, файл проверяется по пути sDir
а пишется файл - в ТЕКУЩУЮ директорию.
попробуйте так:
Код:
   sFileName:=Form1.Edit1.Text + '.tiff';
   num:=1;
   while FileExists(sDir + '\' + sFileName) do
   begin
    Inc(num);
    sFileName:=IntToStr(num) + '_' + Form1.Edit1.Text + '.tiff';
 //   MyBitMap.SaveToFile(sFileName);
   end;
   //Canvas.Draw(10,10,MyBitMap);
   Image1.Picture.Graphic:=MyBitMap;
   Image1.Picture.SaveToFile(sDir + '\' +  sFileName);
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение файла KREGI Помощь студентам 4 30.03.2009 21:09
Как обратиться к объекту который был только что создан Arassir Помощь студентам 5 24.10.2008 20:42
задать значение переменной в только что макросом открытой книге tolikman Microsoft Office Excel 2 17.10.2008 16:35
Сохранение файла Македонский Общие вопросы Delphi 7 17.08.2007 08:35
Как сделать что-бы Таймер срабатывал только один раз? Greg Компоненты Delphi 11 16.12.2006 01:25