-
Здравствуйте, у меня проблема с реализацией выборочного сохранения.У меня есть папка(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;
-
1. Загрузи все файлы из директории в TStringList 2. Отсортируй его по имени 3. Выбирай по 2 строки, пока в TStringList что-то есть.
-
> if j=j+1 then
Это гениально :).
-
Жаль, орешник сломан..
> Ega23 © (25.09.11 21:04) [1] > 2. Отсортируй его по имени
Ага. И будет у него 29.tif, 3.tif, 30.tif, 31.tif...
-
> Ага. И будет у него 29.tif, 3.tif, 30.tif, 31.tif
Это только если он глупый. А если нет, то у него будет 01.tif, 02.tif, 03.tif... 29.tif, 30.tif, 31.tif... Любой маломальский меломан знает как "пронумеровать" mp3 файлы, чтобы они воспроизводились в нужном порядке! :)
-
Спасибо большое,сегодня попробую.
-
Как выбрать первые две строки?
begin
strlist:=TstringList.Create;
strlist.Clear;
strlist.Add('c:\image\.tif');
strlist.LoadFromFile('c:\image\.tif');
strlist.Sorted:=True;
end;
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 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;
-
while strlist.Count > 1 do
begin
strlist.Delete(0);
strlist.Delete(1);
end;
-
> if j=j+1 then > begin > j:=j+1; > f:=f+2; > end;
Это поправки для военного времени?
-
while strlist.Count > 1 do
begin
strlist.Delete(0);
strlist.Delete(0);
end;
-
Загрузка файлов из директории почему-то не работает.И мне еще не понятно как первую и вторую строку добавить в цикл чтобы он сохранял все это в нужную мне папку под расширением tif,когда я ставлю strlist [0] на место j,а strlist [1] заместо f,он естественно пишет что целые(Integer) и строковые(String) типы несовместимы! begin
strlist:=TstringList.Create;
strlist.Clear;
strlist.Add('c:\image\*.tif');
strlist.LoadFromFile('c:\image\*.tif');
strlist.Sorted:=True;
end;
while strlist.Count > 1 do
begin
strlist[0];
strlist[1];
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 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('Невозможно соединить файлы.')
begin
strlist.Delete(0);
strlist.Delete(0);
end;
end;
end;
end;
-
> Загрузка файлов из директории почему-то не работает. а с чего ей работать? потому что ты в комментарии написал пожелание?
нажми F1 на LoadFromFile
-
А что именно не правильно в этой строке strlist.LoadFromFile('c:\image\*.tif');Путь к файлам указал,* для загрузки всех файлов расширения tif.
-
avpsol (26.09.11 12:27) [12] Так нельзя :)
-
> ,* для загрузки всех файлов расширения tif.
Обратите внимание: LoadFromFile, а не LoadFromFiles.
-
> strlist[0]; > strlist[1];
И какие же чудеса творятся в этих строчках ?
> для загрузки всех файлов расширения tif.
LoadFromFile для этого не предназначен. Вообще не предназначен. Совсем не предназначен.
-
> Ega23 © (26.09.11 10:52) [9]
ошибка будет при нечетном колве
-
Понятно тогда нужно создавать цикл.
-
а TFileListBox не спасет ОРД ?
-
Каким способом мне тогда загрузить первые два файла,а потом сохранить их в одном файле.Подскажите.
-
Имя первого файла лежит в FileListBox.Items[0], второго - в FileListBox.Items[1]
А к манипуляциям с содержимым файлов TFileListBox не имеет ни малейшего отношения - на то у тебя есть ТВАЙН.
-
Но ТВАЙН работает по циклу 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 TWAIN_LastErrorCode()<>0 then
break;
end;
end;
TWAIN_EndMultipageFile()
end; Он берет 1.tif и 2.tif и сохраняет их в file.tif. Если добавить еще один блок вот так begin
if TWAIN_BeginMultipageFile('c:\Форма1П\file2.tif')=0 then
begin
begin
j:=3;
f:=4;
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; То тогда 3 и 4 .tif он тоже сохраняет в file2.tif. А мне необходимо чтобы при нажатии кнопки он сам сделал то что происходит во втором блоке.
-
т.е. в рез-те нажатия кнопки все файлы из директории c:\image должны исчезнуть, а в директории c:\Форма1П должны появиться файлы в кол-ве в два раза меньшем чем кол-во файлов в c:\image до нажатия кнопки ? Так что ли ?
-
> Так что ли ? + еще уточнить. вся система попросту удаляет первый файл, и переписывает (со всякими сложностями) второй... ну судя по коду TWAIN_LoadNativeFromFilename вместо ожидаемого (???) TWAIN_AddNativeFromFilename. так?
-
имхо, но "дело было не в бобине"... т.е. циклы тут совсем ни причем.
покажи без циклов код для к примеру 4х файлов, с явными названиями/путями и комментариями, что ты от написанного ожидаешь...
-
ему надо: c:\image\1.tiff+c:\image\2.tiff:=c:\Форма\1.tiff c:\image\3.tiff+c:\image\4.tiff:=c:\Форма\2.tiff c:\image\5.tiff+c:\image\6.tiff:=c:\Форма\3.tiff ... вы чо читать разучились?
-
> вы чо читать разучились? словами одно, по коду другое. помощь может быть только по коду, по описанному это уже ТЗ, тут оплата не указана.
-
Он должен делать то что написал QAZ.единственно вот так c:\image\1.tiff+c:\image\2.tiff:=c:\Форма\file.tiff c:\image\3.tiff+c:\image\4.tiff:=c:\Форма\file.tiff c:\image\5.tiff+c:\image\6.tiff:=c:\Форма\file.tiff он каждый multipage файл комбинирует и переименовывает на то что я пишу в эдитах(серийный номер+код): RenameFile('c:\Форма1П\file.tif','c:\Форма1П\' + edt1.text + edt2.text + '.tif'); Комбинирование и переименовывание файлов он у меня прекрасно делает, но только первые два(1.tif и 2.tif) а мне нужно чтоб после этого он удалил эти первые два,и после повторного нажатия кнопки он взялся комбинировать и преименовывать следующие(3.tif и 4.tif),и потом опять следующие(5.tif и 6.tif) и т.д.Циклично.Компрендо?
-
Телепатер подсказывает, что вам нужно объявить глобальную переменную, в которой хранить вот это ваше j, изначально присвоив ему 1: j:=3;
f:=4; f видимо равняется j + 1. И не забывать по окончанию ваших манипуляций увеличивать значение в j на 2. По хорошему, сию переменную конечно лучше сделать полем класса, а не глобальной переменной, и не использовать однобуквенные имена переменных, и отформатировать нормально код, и вынести все ваши абсолютные пути в настройки или конфиги, и сделать еще дюжину очевидных вещей, которые написаны в умных книжках, которые тоже надо бы читать, прежде чем пытаться программировать. Вариант из [1] нравится мне чуть меньше, потому как, с одной стороны, нет никаких гарантий что в этой директории нет других файлов. А с другой стороны, наличие проверок и удалений "не попадающих под маску" файлов из списка сделает код еще менее очевидным, и станет непонятно, зачем был список, если имя файла однозначно определяется индексом в списке.
-
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?
-
Ega23 © (25.09.11 21:04) [1] > 1. Загрузи все файлы из директории в TStringList > 2. Отсортируй его по имени > 3. Выбирай по 2 строки, пока в TStringList что-то есть.
-
Какой функцией я смогу загрузить сразу все файлы??? И как мне выбрать по две строки на примере моего кода???
-
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;
-
> Какой функцией я смогу загрузить сразу все файлы??? Сергей М. © (26.09.11 12:48) [18] > а TFileListBox не спасет ОРД ?
> И как мне выбрать по две строки на примере моего кода??? у тебя НЕТ примера кода, у тебя есть неработающие, не отображающие логики ОГРЫЗКИ. "пургу гонишь" грубо говоря, набор ничем не связанных функций, поток сознания.
-
-
> stas (27.09.2011 11:06:32) [32]
Сразу не выйдет, каждый файл по отдельности
-
> [30] sniknik © (27.09.11 10:56) > Ega23 © (25.09.11 21:04) [1] > > 1. Загрузи все файлы из директории в TStringList
Имена файлов.
-
имена файлов у меня 1.tif,2.tif,3.tif,4.tif......
-
анекдот учитель пишет на доске уравнение... - дети найдите Х. Вовочка подскакивает к доске и тыча пальцем - вот! вот, Х!!!
чем то напоминает.
> имена файлов у меня > 1.tif,2.tif,3.tif,4.tif...... малатца. теперь грузи их в список.
-
дополняй имена файлов слева до длины самого длинного. получишь имена вида 001 002 003 ... 010 011 ... 025 026 и т.д...
Должно всё замечательно сортироваться, всё будет строго по порядку.
-
> [39] Cobalt © (27.09.11 16:29) > дополняй имена файлов слева до длины самого длинного. > получишь имена вида > 001
Да говорили ему об этом.
-
Вариант, безуспешно навязываемый топикстартеру на протяжении всей ветки (топикстартер, надо отметить, судя по всему вообще не понимает, о чем ему говорят, и ждет, что за него напишут код) не будет работать, если в директории есть другие файлы. Что, с моей точки зрения плохо, так как у нас нет данных, что других файлов там нет. Засим, чтобы учесть эту ситуацию придется проверять, что в списке содержаться только файлы нужного расширения (можно сделать силами FindFirst) и что каждый файл на своем месте. В противном случае, при отсутствии файла номер четыре, мы сошьем третий с пятым, и дальше вся цепочка будет неверной. Как мне кажется, при отсутсвие файла номер четыре должно обрабатываться как ошибочная ситуация с соответствующим оповещением пользователя. Включение же этих проверок в код приведет к тому, что в I'м элементе StringList'а будет всегда файл под именем Format('c:\image\%d.tif', [I+1]) А значит, хранить и составлять список нет никакой необходимости.
-
> безуспешно навязываемый кто ж ему навязывал? так предлагали... начал бы делать (а не "пургу гнать"), "просек" ошибочность логики, сказал в чем (кто кроме него знает что ему нужно? в чем вообще смысл этого "скрещивания"), предложили бы другую. да и пофигу ему это, имхо - учебное задание, типа код "нарыть", сдать и забыть.
-
Ладно.Обсуждение можно закрывать.Вам будет смешно как я сделал.Я просто сгенерировал 2000 rename и у меня все заработало.Правда если будет будет больше 2000 то он ничего не сделает но такое врядли случится.
-
Кстати спасибо всем кто помогал,следствие ваших перепетий навело меня на эту мысль.
-
> ваших перепетий
Ладно хоть не перепитий)
Хотя в этой драме перипетия как раз у тебя)
-
на что только люди не идут лишь бы не учиться...
-
> Я просто сгенерировал 2000 rename и у меня все заработало.
А чего не 20 000?
И ведь страдают всегда пользователи...
|