Конференция "Начинающим" » Проблема с построением цикла [D7]
 
  • Avpsol (25.09.11 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 © (25.09.11 21:04) [1]
    1. Загрузи все файлы из директории в TStringList
    2. Отсортируй его по имени
    3. Выбирай по 2 строки, пока в TStringList что-то есть.
  • Servy © (25.09.11 21:42) [2]

    > if j=j+1 then


    Это гениально :).
  • Омлет © (25.09.11 23:28) [3]
    Жаль, орешник сломан..

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


    Ага. И будет у него 29.tif, 3.tif, 30.tif, 31.tif...
  • Германн © (25.09.11 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 (26.09.11 05:32) [5]
    Спасибо большое,сегодня попробую.
  • avpsol (26.09.11 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');

  • Омлет © (26.09.11 10:09) [7]
    while strlist.Count > 1 do
    begin
     //strlist[0] - первая строка
     //strlist[1] - вторая строка
     // do something
     strlist.Delete(0);
     strlist.Delete(1);
    end;

  • Очень Злой (26.09.11 10:47) [8]

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


    Это поправки для военного времени?
  • Ega23 © (26.09.11 10:52) [9]
    while strlist.Count > 1 do
    begin
    //strlist[0] - первая строка
    //strlist[1] - вторая строка
    // do something
    strlist.Delete(0);
    strlist.Delete(0);
    end;

  • avpsol (26.09.11 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 © (26.09.11 12:13) [11]
    > Загрузка файлов из директории почему-то не работает.
    а с чего ей работать? потому что ты в комментарии написал пожелание?

    нажми F1 на LoadFromFile
  • avpsol (26.09.11 12:27) [12]
    А что именно не правильно в этой строке
    strlist.LoadFromFile('c:\image\*.tif');Путь к файлам указал,* для загрузки всех файлов расширения tif.
  • stas © (26.09.11 12:29) [13]
    avpsol   (26.09.11 12:27) [12]
    Так нельзя :)
  • И. Павел © (26.09.11 12:31) [14]
    > ,* для загрузки всех файлов расширения tif.

    Обратите внимание: LoadFromFile, а не LoadFromFiles.
  • Сергей М. © (26.09.11 12:36) [15]

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


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


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


    LoadFromFile для этого не предназначен. Вообще не предназначен. Совсем не предназначен.
  • QAZ (26.09.11 12:38) [16]

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

    ошибка будет при нечетном колве
  • avpsol (26.09.11 12:38) [17]
    Понятно тогда нужно создавать цикл.
  • Сергей М. © (26.09.11 12:48) [18]
    а TFileListBox не спасет ОРД ?
  • avpsol (26.09.11 13:24) [19]
    Каким способом мне тогда загрузить первые два файла,а потом сохранить их в одном файле.Подскажите.
  • Сергей М. © (26.09.11 13:34) [20]
    Имя первого файла лежит в FileListBox.Items[0], второго - в FileListBox.Items[1]

    А к манипуляциям с содержимым файлов TFileListBox не имеет ни малейшего отношения - на то у тебя есть ТВАЙН.
  • avpsol (26.09.11 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.
    А мне необходимо чтобы при нажатии кнопки он сам сделал то что происходит во втором блоке.
  • Сергей М. © (26.09.11 14:21) [22]
    т.е. в рез-те нажатия кнопки все файлы из директории c:\image должны исчезнуть, а в директории c:\Форма1П должны появиться файлы в кол-ве в два раза меньшем чем кол-во файлов в c:\image до нажатия кнопки ? Так что ли ?
  • sniknik © (26.09.11 14:28) [23]
    > Так что ли ?
    + еще уточнить.
    вся система попросту удаляет первый файл, и переписывает (со всякими сложностями) второй... ну судя по коду TWAIN_LoadNativeFromFilename  вместо ожидаемого (???) TWAIN_AddNativeFromFilename.
    так?
  • sniknik © (26.09.11 14:32) [24]
    имхо, но "дело было не в бобине"... т.е. циклы тут совсем ни причем.

    покажи без циклов код для к примеру 4х файлов, с явными названиями/путями и комментариями, что ты от написанного ожидаешь...
  • QAZ (26.09.11 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 © (26.09.11 14:52) [26]
    > вы чо читать разучились?
    словами одно, по коду другое.
    помощь может быть только по коду, по описанному это уже ТЗ, тут оплата не указана.
  • Avpsol (26.09.11 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 © (26.09.11 20:29) [28]
    Телепатер подсказывает, что вам нужно объявить глобальную переменную, в которой хранить вот это ваше j, изначально присвоив ему 1:

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



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

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

    Вариант из [1] нравится мне чуть меньше, потому как, с одной стороны, нет никаких гарантий что в этой директории нет других файлов. А с другой стороны, наличие проверок и удалений "не попадающих под маску" файлов из списка сделает код еще менее очевидным, и станет непонятно, зачем был список, если имя файла однозначно определяется индексом в списке.
  • avpsol (27.09.11 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 © (27.09.11 10:56) [30]
    Ega23 ©   (25.09.11 21:04) [1]
    > 1. Загрузи все файлы из директории в TStringList
    > 2. Отсортируй его по имени
    > 3. Выбирай по 2 строки, пока в TStringList что-то есть.
  • avpsol (27.09.11 11:01) [31]
    Какой функцией я смогу загрузить сразу все файлы???
    И как мне выбрать по две строки на примере моего кода???
  • stas © (27.09.11 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 © (27.09.11 11:07) [33]
    > Какой функцией я смогу загрузить сразу все файлы???
    Сергей М. ©   (26.09.11 12:48) [18]
    > а TFileListBox не спасет ОРД ?

    > И как мне выбрать по две строки на примере моего кода???
    у тебя НЕТ примера кода, у тебя есть неработающие, не отображающие логики ОГРЫЗКИ. "пургу гонишь" грубо говоря, набор ничем не связанных функций, поток сознания.
  • stas © (27.09.11 11:07) [34]
  • Anatoly Podgoretsky © (27.09.11 11:59) [35]
    > stas  (27.09.2011 11:06:32)  [32]

    Сразу не выйдет, каждый файл по отдельности
  • Inovet © (27.09.11 12:53) [36]
    > [30] sniknik ©   (27.09.11 10:56)
    > Ega23 ©   (25.09.11 21:04) [1]
    > > 1. Загрузи все файлы из директории в TStringList

    Имена файлов.
  • avpsol (27.09.11 13:42) [37]
    имена файлов у меня
    1.tif,2.tif,3.tif,4.tif......
  • sniknik © (27.09.11 14:19) [38]
    анекдот
    учитель пишет на доске уравнение...
    - дети найдите Х.
    Вовочка подскакивает к доске и тыча пальцем
    - вот! вот, Х!!!

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

    > имена файлов у меня
    > 1.tif,2.tif,3.tif,4.tif......
    малатца. теперь грузи их в список.
  • Cobalt © (27.09.11 16:29) [39]
    дополняй имена файлов слева до длины самого длинного.
    получишь имена вида
    001
    002
    003
    ...
    010
    011
    ...
    025
    026
    и т.д...

    Должно всё замечательно сортироваться, всё будет строго по порядку.
  • Inovet © (27.09.11 18:34) [40]
    > [39] Cobalt ©   (27.09.11 16:29)
    > дополняй имена файлов слева до длины самого длинного.
    > получишь имена вида
    > 001

    Да говорили ему об этом.
  • Servy © (27.09.11 19:47) [41]
    Вариант, безуспешно навязываемый топикстартеру на протяжении всей ветки (топикстартер, надо отметить, судя по всему вообще не понимает, о чем ему говорят, и ждет, что за него напишут код) не будет работать, если в директории есть другие файлы. Что, с моей точки зрения плохо, так как у нас нет данных, что других файлов там нет.

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

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

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



    А значит, хранить и составлять список нет никакой необходимости.
  • sniknik © (27.09.11 20:50) [42]
    > безуспешно навязываемый
    кто ж ему навязывал? так предлагали... начал бы делать (а не "пургу гнать"), "просек" ошибочность логики, сказал в чем (кто кроме него знает что ему нужно? в чем вообще смысл этого "скрещивания"), предложили бы другую.
    да и пофигу ему это, имхо - учебное задание, типа код "нарыть", сдать и забыть.
  • avpsol (28.09.11 08:30) [43]
    Ладно.Обсуждение можно закрывать.Вам будет смешно как я сделал.Я просто сгенерировал 2000 rename и у меня все заработало.Правда если будет будет больше 2000 то он ничего не сделает но такое врядли случится.
  • avpsol (28.09.11 08:31) [44]
    Кстати спасибо всем кто помогал,следствие ваших перепетий навело меня на эту мысль.
  • Сергей М. © (28.09.11 09:23) [45]
    > ваших перепетий

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

    Хотя в этой драме перипетия как раз у тебя)
  • sniknik © (28.09.11 09:27) [46]
    на что только люди не идут лишь бы не учиться...
  • Омлет © (28.09.11 09:57) [47]
    > Я просто сгенерировал 2000 rename и у меня все заработало.

    А чего не 20 000?

    И ведь страдают всегда пользователи...
 
Конференция "Начинающим" » Проблема с построением цикла [D7]
Есть новые Нет новых   [134431   +9][b:0][p:0.005]