Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с построением цикла [D7]


Страницы:   1 2 3

Avpsol ©   (2011-09-25 19:31:00) 

Здравствуйте, у меня проблема с реализацией выборочного сохранения.У меня есть папка(c:\image) в которой имеются изображения в формате tiff они там создаются под номером 1,2,3,4.tif и т.д в каждом файле по одному изображению.Мне нужно по нажатию кнопки взять первые два изображения(лицевую и обратную сторону),соединить их в один файл(multipage) и сохранить в папке(c:\Форма),потом удалить исходные две картинки,и при повторном нажатии на кнопку взять опять первые два файла и сделать тоже самое.С первыми двумя у меня получается(кроме выборочного удаления) а вот со следующими нет он ведь ищет файлы с номером 1,2.tif а они уже 3,4.tif.Нужно как то организовать цикл в цикле все перепробовал не работает.Может кто-нибудь видит где в коде ошибка.Заранее спасибо за помощь.
begin
   if TWAIN_BeginMultipageFile('c:\Форма1П\file.tif')=0 then
  begin
   begin
    j:=1;
    f:=2;
        end;
         for i := j to f do
     begin
       StrFmt(pagefile, 'c:\image\%d.tif', [i]);
        hdib := TWAIN_LoadNativeFromFilename(pagefile);
        if hdib<>0 then
        begin
           TWAIN_DibWritePage(hdib);
           DIB_Free(hdib);
        end;
        if j=j+1 then
        begin
        j:=j+1;
        f:=f+2;
        end;
           if TWAIN_LastErrorCode()<>0 then
           break;
           end;
  end;
           TWAIN_EndMultipageFile()
  end;
  begin
     RenameFile('c:\Форма1П\Выходные данные\file.tif','c:\Форма1П\Выходные данные\' + edt1.text + edt2.text + '.tif');
  if TWAIN_LastErrorCode()<>0 then
     TWAIN_ReportLastError('Невозможно соединить файлы.')
     end;
     end;

//MyRemoveDir('c:\image');


Омлет   (2011-09-28 09:57:00) [1]

> Я просто сгенерировал 2000 rename и у меня все заработало.

А чего не 20 000?

И ведь страдают всегда пользователи...


sniknik   (2011-09-28 09:27:00) [2]

на что только люди не идут лишь бы не учиться...


Сергей М.   (2011-09-28 09:23:00) [3]

> ваших перепетий

Ладно хоть не переп итий)

Хотя в этой драме пер ипетия как раз у тебя)


avpsol   (2011-09-28 08:31:00) [4]

Кстати спасибо всем кто помогал,следствие ваших перепетий навело меня на эту мысль.


avpsol   (2011-09-28 08:30:00) [5]

Ладно.Обсуждение можно закрывать.Вам будет смешно как я сделал.Я просто сгенерировал 2000 rename и у меня все заработало.Правда если будет будет больше 2000 то он ничего не сделает но такое врядли случится.


sniknik   (2011-09-27 20:50:00) [6]

> безуспешно навязываемый
кто ж ему навязывал? так предлагали... начал бы делать (а не "пургу гнать"), "просек" ошибочность логики, сказал в чем (кто кроме него знает что ему нужно? в чем вообще смысл этого "скрещивания"), предложили бы другую.
да и пофигу ему это, имхо - учебное задание, типа код "нарыть", сдать и забыть.


Servy   (2011-09-27 19:47:00) [7]

Вариант, безуспешно навязываемый топикстартеру на протяжении всей ветки (топикстартер, надо отметить, судя по всему вообще не понимает, о чем ему говорят, и ждет, что за него напишут код) не будет работать, если в директории есть другие файлы. Что, с моей точки зрения плохо, так как у нас нет данных, что других файлов там нет.

Засим, чтобы учесть эту ситуацию придется проверять, что в списке содержаться только файлы нужного расширения (можно сделать силами FindFirst) и что каждый файл на своем месте. В противном случае, при отсутствии файла номер четыре, мы сошьем третий с пятым, и дальше вся цепочка будет неверной. Как мне кажется, при отсутсвие файла номер четыре должно обрабатываться как ошибочная ситуация с соответствующим оповещением пользователя.

Включение же этих проверок в код приведет к тому, что в I'м элементе StringList'а будет всегда файл под именем

Format('c:\image\%d.tif', [I+1])

А значит, хранить и составлять список нет никакой необходимости.


Inovet   (2011-09-27 18:34:00) [8]

> [39] Cobalt ©   (27.09.11 16:29)
> дополняй имена файлов слева до длины самого длинного.
> получишь имена вида
> 001

Да говорили ему об этом.


Cobalt   (2011-09-27 16:29:00) [9]

дополняй имена файлов слева до длины самого длинного.
получишь имена вида
001
002
003
...
010
011
...
025
026
и т.д...

Должно всё замечательно сортироваться, всё будет строго по порядку.


sniknik   (2011-09-27 14:19:00) [10]

анекдот
учитель пишет на доске уравнение...
- дети найдите Х.
Вовочка подскакивает к доске и тыча пальцем
- вот! вот, Х!!!

чем то напоминает.

> имена файлов у меня
> 1.tif,2.tif,3.tif,4.tif......
малатца. теперь грузи их в список.


avpsol   (2011-09-27 13:42:00) [11]

имена файлов у меня
1.tif,2.tif,3.tif,4.tif......


Inovet   (2011-09-27 12:53:00) [12]

> [30] sniknik ©   (27.09.11 10:56)
> Ega23 ©   (25.09.11 21:04) [1]
> > 1. Загрузи все файлы из директории в TStringList

Имена файлов.


Anatoly Podgoretsky   (2011-09-27 11:59:00) [13]

> stas  (27.09.2011 11:06:32)  [32]

Сразу не выйдет, каждый файл по отдельности


stas   (2011-09-27 11:07:00) [14]

Подробнее: http://www.delphibasics.ru/FindFirst.php


sniknik   (2011-09-27 11:07:00) [15]

> Какой функцией я смогу загрузить сразу все файлы???
Сергей М. ©   (26.09.11 12:48) [18]
> а TFileListBox не спасет ОРД ?

> И как мне выбрать по две строки на примере моего кода???
у тебя НЕТ примера кода, у тебя есть неработающие, не отображающие логики ОГРЫЗКИ. "пургу гонишь" грубо говоря, набор ничем не связанных функций, поток сознания.


stas   (2011-09-27 11:06:00) [16]

avpsol   (27.09.11 11:01) [31]
>Какой функцией я смогу загрузить сразу все файлы???

var
 searchResult : TSearchRec;

begin

 if FindFirst('c:\Форма1П\*.tif', faAnyFile, searchResult) = 0 then
 begin
   repeat

      List.add (searchResult.Name)

   until FindNext(searchResult) <> 0;

   FindClose(searchResult);
 end;
end;


avpsol   (2011-09-27 11:01:00) [17]

Какой функцией я смогу загрузить сразу все файлы???
И как мне выбрать по две строки на примере моего кода???


sniknik   (2011-09-27 10:56:00) [18]

Ega23 ©   (25.09.11 21:04) [1]
> 1. Загрузи все файлы из директории в TStringList
> 2. Отсортируй его по имени
> 3. Выбирай по 2 строки, пока в TStringList что-то есть.


avpsol   (2011-09-27 09:32:00) [19]

begin
   if TWAIN_BeginMultipageFile('c:\Форма\file.tif')=0 then
  begin
   begin
    j:=1;
    f:=2;
        end;
         for i := j to f do
     begin
       StrFmt(pagefile, 'c:\image\%d.tif', [i]);
        hdib := TWAIN_LoadNativeFromFilename(pagefile);
        if hdib<>0 then
        begin
           TWAIN_DibWritePage(hdib);
           DIB_Free(hdib);
        end;
     
           if TWAIN_LastErrorCode()<>0 then
           break;
           end;
  end;
           TWAIN_EndMultipageFile()
  end;
  begin
     RenameFile('c:\Форма\file.tif','c:\Форма1П\Выходные данные\' + edt1.text + edt2.text + '.tif');
  if TWAIN_LastErrorCode()<>0 then
     TWAIN_ReportLastError('Невозможно соединить файлы.')
     end;
begin
DeleteFile('c:\image\1.tif');
DeleteFile('c:\image\2.tif');
RenameFile('c:\image\3.tif','c:\image\1.tif');
RenameFile('c:\image\4.tif','c:\image\2.tif');
     end;

Вот так все прекрасно работает с первыми четыремя
я могу еще добавить
RenameFile('c:\image\5.tif','c:\image\1.tif');
RenameFile('c:\image\6.tif','c:\image\2.tif');
RenameFile('c:\image\7.tif','c:\image\1.tif');
RenameFile('c:\image\8.tif','c:\image\2.tif');
Тогда он будет обрабатывать первые восемь и комбинировать их в 4 но если их будет 100 не писать же такой длинный код из renamefile-ов?Как задать чтобы с каждым запуском он сам изменял путь каждого renam-а +1?


Servy   (2011-09-26 20:29:00) [20]

Телепатер подсказывает, что вам нужно объявить глобальную переменную, в которой хранить вот это ваше j, изначально присвоив ему 1:

   j:=3;{Область изменения}
   f:=4;{Область изменения}


f видимо равняется j + 1. И не забывать по окончанию ваших манипуляций увеличивать значение в j на 2.

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

Вариант из [1] нравится мне чуть меньше, потому как, с одной стороны, нет никаких гарантий что в этой директории нет других файлов. А с другой стороны, наличие проверок и удалений "не попадающих под маску" файлов из списка сделает код еще менее очевидным, и станет непонятно, зачем был список, если имя файла однозначно определяется индексом в списке.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо