Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.08;
Скачать: CL | DM;

Вниз

Проблема с построением цикла   Найти похожие ветки 

 
Avpsol   (2011-09-25 19:31) [0]

Здравствуйте, у меня проблема с реализацией выборочного сохранения.У меня есть папка(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");


 
Ega23 ©   (2011-09-25 21:04) [1]

1. Загрузи все файлы из директории в TStringList
2. Отсортируй его по имени
3. Выбирай по 2 строки, пока в TStringList что-то есть.


 
Servy ©   (2011-09-25 21:42) [2]


> if j=j+1 then


Это гениально :).


 
Омлет ©   (2011-09-25 23:28) [3]

Жаль, орешник сломан..

> Ega23 ©   (25.09.11 21:04) [1]
> 2. Отсортируй его по имени


Ага. И будет у него 29.tif, 3.tif, 30.tif, 31.tif...


 
Германн ©   (2011-09-25 23:57) [4]


> Ага. И будет у него 29.tif, 3.tif, 30.tif, 31.tif

Это только если он глупый. А если нет, то у него будет 01.tif, 02.tif, 03.tif... 29.tif, 30.tif, 31.tif...
Любой маломальский меломан знает как "пронумеровать" mp3 файлы, чтобы они воспроизводились в нужном порядке!
:)


 
Avpsol   (2011-09-26 05:32) [5]

Спасибо большое,сегодня попробую.


 
avpsol   (2011-09-26 10:04) [6]

Как выбрать первые две строки?

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;

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


 
Омлет ©   (2011-09-26 10:09) [7]

while strlist.Count > 1 do
begin
 //strlist[0] - первая строка
 //strlist[1] - вторая строка
 // do something
 strlist.Delete(0);
 strlist.Delete(1);
end;


 
Очень Злой   (2011-09-26 10:47) [8]


>         if j=j+1 then
>         begin
>         j:=j+1;
>         f:=f+2;
>         end;


Это поправки для военного времени?


 
Ega23 ©   (2011-09-26 10:52) [9]

while strlist.Count > 1 do
begin
//strlist[0] - первая строка
//strlist[1] - вторая строка
// do something
strlist.Delete(0);
strlist.Delete(0);
end;


 
avpsol   (2011-09-26 12:07) [10]

Загрузка файлов из директории почему-то не работает.И мне еще не понятно как первую и вторую строку добавить в цикл чтобы он сохранял все это в нужную мне папку под расширением 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;


 
sniknik ©   (2011-09-26 12:13) [11]

> Загрузка файлов из директории почему-то не работает.
а с чего ей работать? потому что ты в комментарии написал пожелание?

нажми F1 на LoadFromFile


 
avpsol   (2011-09-26 12:27) [12]

А что именно не правильно в этой строке
strlist.LoadFromFile("c:\image\*.tif");Путь к файлам указал,* для загрузки всех файлов расширения tif.


 
stas ©   (2011-09-26 12:29) [13]

avpsol   (26.09.11 12:27) [12]
Так нельзя :)


 
И. Павел ©   (2011-09-26 12:31) [14]

> ,* для загрузки всех файлов расширения tif.

Обратите внимание: LoadFromFile, а не LoadFromFiles.


 
Сергей М. ©   (2011-09-26 12:36) [15]


> strlist[0];
> strlist[1];


И какие же чудеса творятся в этих строчках ?


> для загрузки всех файлов расширения tif.


LoadFromFile для этого не предназначен. Вообще не предназначен. Совсем не предназначен.


 
QAZ   (2011-09-26 12:38) [16]


> Ega23 ©   (26.09.11 10:52) [9]

ошибка будет при нечетном колве


 
avpsol   (2011-09-26 12:38) [17]

Понятно тогда нужно создавать цикл.


 
Сергей М. ©   (2011-09-26 12:48) [18]

а TFileListBox не спасет ОРД ?


 
avpsol   (2011-09-26 13:24) [19]

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


 
Сергей М. ©   (2011-09-26 13:34) [20]

Имя первого файла лежит в FileListBox.Items[0], второго - в FileListBox.Items[1]

А к манипуляциям с содержимым файлов TFileListBox не имеет ни малейшего отношения - на то у тебя есть ТВАЙН.


 
avpsol   (2011-09-26 13:50) [21]

Но ТВАЙН работает по циклу
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.
А мне необходимо чтобы при нажатии кнопки он сам сделал то что происходит во втором блоке.


 
Сергей М. ©   (2011-09-26 14:21) [22]

т.е. в рез-те нажатия кнопки все файлы из директории c:\image должны исчезнуть, а в директории c:\Форма1П должны появиться файлы в кол-ве в два раза меньшем чем кол-во файлов в c:\image до нажатия кнопки ? Так что ли ?


 
sniknik ©   (2011-09-26 14:28) [23]

> Так что ли ?
+ еще уточнить.
вся система попросту удаляет первый файл, и переписывает (со всякими сложностями) второй... ну судя по коду TWAIN_LoadNativeFromFilename  вместо ожидаемого (???) TWAIN_AddNativeFromFilename.
так?


 
sniknik ©   (2011-09-26 14:32) [24]

имхо, но "дело было не в бобине"... т.е. циклы тут совсем ни причем.

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


 
QAZ   (2011-09-26 14:44) [25]

ему надо:
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
...
вы чо читать разучились?


 
sniknik ©   (2011-09-26 14:52) [26]

> вы чо читать разучились?
словами одно, по коду другое.
помощь может быть только по коду, по описанному это уже ТЗ, тут оплата не указана.


 
Avpsol   (2011-09-26 19:00) [27]

Он должен делать то что написал 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) и т.д.Циклично.Компрендо?


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

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

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


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

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

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


 
avpsol   (2011-09-27 09:32) [29]

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?


 
sniknik ©   (2011-09-27 10:56) [30]

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


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

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


 
stas ©   (2011-09-27 11:06) [32]

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;


 
sniknik ©   (2011-09-27 11:07) [33]

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

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


 
stas ©   (2011-09-27 11:07) [34]

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


 
Anatoly Podgoretsky ©   (2011-09-27 11:59) [35]

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

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


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

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

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


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

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


 
sniknik ©   (2011-09-27 14:19) [38]

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

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

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


 
Cobalt ©   (2011-09-27 16:29) [39]

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

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


 
Inovet ©   (2011-09-27 18:34) [40]

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

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



Страницы: 1 2 вся ветка

Текущий архив: 2012.01.08;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.012 c
2-1317359287
Natalie
2011-09-30 09:08
2012.01.08
Как отобразить в Memo тест длинною 4000 символов?


2-1317495602
Leon-Z
2011-10-01 23:00
2012.01.08
Соединение с БД MySQL.


15-1316692399
Очень Злой
2011-09-22 15:53
2012.01.08
помогите найти заразу


15-1315302753
Pit
2011-09-06 13:52
2012.01.08
Особенности отображения сайтоа на iPhone


1-1275582894
alpp
2010-06-03 20:34
2012.01.08
слияние 2-х файлов word в один