Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.006 c
15-1316162516
И. Павел
2011-09-16 12:41
2012.01.08
Переезд в Санкт-Петербург


15-1316774640
К-111
2011-09-23 14:44
2012.01.08
Что нужно знать, чтобы выполнить ТЗ?


1-1277762626
Deltas
2010-06-29 02:03
2012.01.08
Анимация окон Windows 7


2-1316964668
Avpsol
2011-09-25 19:31
2012.01.08
Проблема с построением цикла


2-1317627511
Очень Злой
2011-10-03 11:38
2012.01.08
Сравнение массивов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский