Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2013, 17:05   #1
[DisAssembleR]
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 28
Сообщение Проблема со Stream, Цикл (Delphi)

Добрый день (или вечер, у кого как ) необходима помощь.
Я не прошу предоставить мне исправленный код, просто подтолкните в нужном направлении.

Собственно, проблема.
Пытаюсь сделать утилитку, которая через поток записывает несколько произвольных выбранных пользователем файлов в другой, заранее подготовленный файл.
Все, что необходимо я уже реализовал, вопрос только в записи\чтении сразу нескольких файлов. С одним файлом все понятно, его я могу записать\прочитать, но вот с несколькими – пока глухо.
Была мысль использовать цикл, но мои эксперименты доказывают, что я делаю что-то не так, поскольку записываются данные неверно.
Может, что-то неправильно пояснил, но суть такая:
Пользователь выбрал файлы (образно - нижепредставленные):
Файл_1
Файл_2

По идее, цикл должен записать эти файлы так:
Файл_1
Файл_2

Однако когда я использовал цикл, получилось так:
Файл_2
Файл_2

То есть количество файлов пишется верно, но "внутренности" этих файлов одинаковы! Иначе говоря, я только что циклом записал последний файл, так сказать, продублировал его. И это меня огорчает.

Для самих данных записи организовал такой вот тип:
Код:
type
  TFHead = Packed record
  Name  : string[70];          
  Extension  :  string[10];     
  Size  :  dword;                          
end;
Один файл записываю так:
Код:
procedure SaveDataToArchive(FileName: string);
var
  Files: TFHead;
  FS: TFileStream;
begin
try
  Files._FileName := ListView2.Items.Item[ListView2.ItemIndex].Caption;
  Files._FileExtension := ListView2.Items.Item[ListView2.ItemIndex].SubItems[0];
  Files._FileSize := StrToInt(ListView2.Items.Item[ListView2.ItemIndex].SubItems[1]);
  Files._FileDateTimeCreate := StrToDate(ListView2.Items.Item[Form1.ListView2.ItemIndex].SubItems[2]);
  FS := TFileStream.Create(FileName, fmOpenWrite);
  FS.Seek(0, soFromBeginning);
  FS.WriteBuffer(Files, SizeOf(Files));
finally
  FS.Free;
end;
end;
С циклом пробовал так:
Код:
procedure SaveDataToArchive(FileName: string);
var
  Files: TFHead;
  FS: TFileStream;
  I: integer;
  Farr: Array [0..10] of Files; (Или надо использовать Farr: Array [0..10] of TFHead?)
begin
try
for i:=0 to ListView2.Items.Count – 1 do
begin
  Farr[i]._FileName := ListView2.Items.Item[ListView2.ItemIndex].Caption;
  Farr[i]._FileExtension := ListView2.Items.Item[ListView2.ItemIndex].SubItems[0];
  Farr[i]._FileSize := StrToInt(ListView2.Items.Item[ListView2.ItemIndex].SubItems[1]);
  Farr[i]._FileDateTimeCreate := StrToDate(ListView2.Items.Item[Form1.ListView2.ItemIndex].SubItems[2]);
  FS := TFileStream.Create(FileName, fmOpenWrite);
  FS.Seek(0, soFromBeginning);
  FS.WriteBuffer(Farr[i], SizeOf(Files));
finally
  FS.Free;
end;
end;
И таки выдает неверный результат, который опсиан в самом начале вопроса.
Подскажите, где намудрил в коде или может какой-нибудь иной прием использовать для записи?
Заранее спасибо!
[DisAssembleR] вне форума Ответить с цитированием
Старый 03.07.2013, 17:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего это цикл по i, а в качестве индекса используется одно и то же - ListView2.ItemIndex? C чего ему зависеть от i?
Код:
for i:=0 to ListView2.Items.Count – 1 do
begin
  Farr[i]._FileName := ListView2.Items.Item[ListView2.ItemIndex].Caption;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.07.2013, 17:46   #3
[DisAssembleR]
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 28
По умолчанию

Окей, изменил все в соответствии с указанным - все равно запсиывается все продублированно
[DisAssembleR] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выдает ошибку Stream write error(delphi) KICK-BOXER Помощь студентам 2 06.04.2013 17:55
Delphi, UPD, Flash Stream Video Zuzlan Работа с сетью в Delphi 3 17.01.2011 16:51
Variant to Stream & Variant from Stream Oreol Общие вопросы Delphi 1 24.03.2009 13:14
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34