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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2009, 02:07   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Чтение нескольких записей в TList ?

Вот есть код, некоторые куски которого были найдены на форуме:
Код:
type
  PMyType = ^MyType;
  MyType = record
    Name : string[30];
    Path : String[100];
  end;  


var
  Form1: TForm1;
  List : TList;
  PMy, ReadItm  : PMyType;
  fs: TFileStream;
  I : Integer;
implementation

{$R *.dfm}

//Заношу структуры в TLsit
procedure TForm1.Button1Click(Sender: TObject);
begin
   List := TList.Create;
      for I := 0 to 2 do
        begin
           New(PMy);
           PMy^.Name := 'Имя'+IntToStr(i);
           PMy^.Path := 'Путь'+IntToStr(i);
           List.Add(PMy);
        end;
end;

//Записываю структуры в файл
procedure TForm1.Button2Click(Sender: TObject);
begin
  fs:=TFileStream.Create('C:\data.st', fmCreate);
   for I := 0 to List.Count - 1 do
      fs.Write(PMyType(List[i])^, sizeof(MyType));
   fs.Free;
end;

//Добавляю значения полей в ListBox1
procedure TForm1.Button3Click(Sender: TObject);
begin
   for I := 0 to List.Count - 1 do
     begin
         ReadItm := List.Items[i];
         ListBox1.Items.Add(ReadItm^.Name + ReadItm^.Path);
     end;
end;

Вопрос: как мене прочитать структуры из файла в TList ?
Народ, подскажите, уже несколько часов над этим сижу и никак не получается
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 30.10.2009 в 09:31.
spamer вне форума Ответить с цитированием
Старый 30.10.2009, 05:34   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кхм...она точно сохраняется?
при такой структуре в файле надо еще хранить длину текста.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.10.2009, 07:35   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
spamer
Вообще-то это не самый лучший подход, поскольку string у тебя не образмерен, а стало быть скорее всего запишется указатель на нее а не ее содержимое.

Я бы на твоем месте описал отдельным методом запить в файл
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.10.2009, 09:31   #4
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

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

Цитата:
Я бы на твоем месте описал отдельным методом запить в файл
А вот на счет этого, я не понял чето. Вы имеете ввиду что бы вместо записи в файл структур из TList, писать туда сразу созданную структуру не добавляя ее в TList ?
Ну а все же как реализовать чтение структур из файла в TList ?
з.ы. чето я вобще уже запутался(((
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 30.10.2009, 10:11   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот ты подправл код образмерив строки теперь норм.
А вообще я бы такую запись обернул в класс отдельный. В нем свой метод сохранения чтения прикрутил бы, а вместо TList пользовал TObjectList и уже в нем составлял список экземпляров.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.10.2009, 15:07   #6
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Stilet, спс за пояснение улучшения. Но это будет чуть позже. Я хочу вот на это хотябы б реализовать.
Но вопрос о чтении все равно не могу решить.
Вот пытаюсь так читать:
Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
List1 := TList.Create;

fs:=TFileStream.Create('C:\data.st', fmOpenRead);
  for I := 0 to 2 do
    begin
      new(ReadItm);
      fs.Read(ReadItm, sizeof(MyType));
      List1.Add(ReadItm);
    end;
end;
Оно выкидывает ошибку access violation at address ((((
Как переделать мой код что бы оно его нормально читало?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 30.10.2009, 15:44   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я покажу как я обычно делаю:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,Contnrs,Classes;
 type
//Это некий тип данных
  MyType = record
    Name : string[30];
    Path : String[100];
  end;
//это класс - единица работающая с переменной этого типа вместо него можно было использовать динамический массив
// Но с я решил этот тип в класс закатать чтоб работа была удобней
 TMyClass=class
   Private
   Public
    mt:MyType;
//Эта процедура тут лишняя. Я забыл ее удавить
    Procedure Save;
   end;
//Это контейнер того класса. Он имеет список, в который вбираются а точнее
// создаются классы элементы
//Этот контейнер полностью контролирует входящие в него элементы - сам мусор убирает, потому
// и предложил в классы обернуть твой пример
 TMy=class
   Public
    one:TObjectList;
   public
// Эта функа выбирает i-тый элемент
    Function Item(i:integer):TMyClass;
// Эта добавляет в список
    Function add:TMyClass;
// Эта все сохраняет
    Procedure Save;
// Эта считывает из фала создавая список и корректно наполняя его обьектами куда попадает считываемая инфа
    Procedure Open;
    Constructor Create;
    Destructor Free;
 end;

{ TMyClass }

procedure TMyClass.Save;
begin
end;

{ TMy }

function TMy.add: TMyClass;
begin
 if one=nil then one:=TObjectList.Create;
 Result:=TMyClass.Create;
 one.Add(Result);
end;

constructor TMy.Create;
begin
 one:=TObjectList.Create;
end;

destructor TMy.Free;
begin
 one.Free;
end;

function TMy.Item(i: integer): TMyClass;
begin
 Result:=nil;
 if (i>=0)and(i<one.Count) then
  Result:=TMyClass(one[i]);

end;

procedure TMy.Open;
var m:TMyClass;   fs: TFileStream;i:integer;
begin
 if one<>nil then one.Clear else one:=TObjectList.Create;
   fs:=TFileStream.Create('C:\temp\data.st', fmOpenRead);
   while fs.Position<fs.Size do begin
      m:=TMyClass.Create;
      fs.read(m.mt, sizeof(MyType));
      one.Add(m);
   end;
   fs.Free;
end;

procedure TMy.Save;
var  fs: TFileStream;i:integer;
begin
  fs:=TFileStream.Create('C:\temp\data.st', fmCreate);
   for I := 0 to one.Count - 1 do
      fs.Write(TMyClass(one[i]).mt, sizeof(MyType));
   fs.Free;
end;



var m:TMy;q:TMyClass;i:integer;
begin
 m:=TMy.Create;
 q:=m.add; q.mt.Name:='1';q.mt.Path:='11';
 q:=m.add; q.mt.Name:='2';q.mt.Path:='22';
 q:=m.add; q.mt.Name:='3';q.mt.Path:='33';
 m.Save;
 m.Open;
 i:=0;
 q:=m.Item(i);
 while q<>nil do begin
   writeln(q.mt.Name,' ',q.mt.Path);
  inc(i);
  q:=m.Item(i);
 end;


 m.Free;
 readln;
end.
Все оборачиваю в классы.

Пояснения нужны?
I'm learning to live...

Последний раз редактировалось Stilet; 30.10.2009 в 16:31.
Stilet вне форума Ответить с цитированием
Старый 30.10.2009, 16:13   #8
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Stilet, большое спасибо.

Цитата:
Пояснения нужны?
Если тебе не составит труда, то напиши пояснения.

Цитата:
Все оборачиваю в классы.
А это значит, что этот код ты заносиш еще в некий общий класс? Или как это понять?

з.ы. сори за глупые вопросы, просто с классами особо не работал.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 30.10.2009, 16:32   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Если тебе не составит труда, то напиши пояснения.
Написал. См. выше.
Цитата:
что этот код ты заносиш еще в некий общий класс?
Это значит что я твои функции в класс обьединил вместе с данными, чтоб надежнее и удобнее было с ними работать.
Цитата:
просто с классами особо не работал.
Рекомендую - надежность повышается
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.10.2009, 16:37   #10
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Stilet, спасибо еще раз. Теперь буду разбираться в этом детально.

з.ы. сори, что не могу оставить отзыв - пишет, что мол еще кому то нада оставить.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последовательное чтение записей artemavd БД в Delphi 32 09.09.2009 20:14
Удаление нескольких записей Hobbit_88 БД в Delphi 5 23.04.2009 17:18
добавления нескольких записей в MS Acces opel.omega БД в Delphi 276 27.12.2008 09:22
Поиск нескольких записей VenMaster БД в Delphi 1 14.06.2008 22:48
Сохранение нескольких записей из DbGrid в базу Canadec БД в Delphi 5 06.09.2007 14:26