![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с построением цикла [D7]
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] нравится мне чуть меньше, потому как, с одной стороны, нет никаких гарантий что в этой директории нет других файлов. А с другой стороны, наличие проверок и удалений "не попадающих под маску" файлов из списка сделает код еще менее очевидным, и станет непонятно, зачем был список, если имя файла однозначно определяется индексом в списке.