Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TWriter


Страницы:   1 2

fs ©   (2009-05-15 15:52:00) 

Столкнулся с проблемой: написал алгоритм сохранения записей класса наследника от TList. Вот собственно код:


procedure TBranchesBank.WriteTo(const AFileName: string);
var
 P: PBranchBankItem;
 i: Integer;
 S: TStream;
 W: TWriter;
begin
 S := TFileStream.Create(AFileName, fmCreate);
 try
   W := TWriter.Create(S, 0);
   try
     for I := 0 to Count - 1 do
       with P^ do
       begin
         P := PBranchBankItem(List[i]);
         W.WriteInteger(Number);
         W.WriteString(City);
         W.WriteString(Address);
         W.WriteString(Name);
         W.WriteInteger(Code)
      end;
   finally
     W.Free;
   end;
 finally
   S.Free;
 end;
end;


на строке   W.WriteInteger(Number);прога вешается. Почему возникает ошибка не понятно.


Медвежонок Пятачок   (2009-05-15 17:07:00) [1]

кроме того по текущей реализации:
нет вызовов райтлистбегин/енд

как при чтении файла будет контролироваться сколько там элементов в нем записано вчера?
только сбоку через позишн?


fs   (2009-05-15 17:04:00) [2]

и действительно....., сделаю как советуете. Спасибо.


Сергей М.   (2009-05-15 16:57:00) [3]

Можно и DefineProperties + DefineProperty использовать для пущей наглядности - они прямиком ведут к явному использованию TReader/TWriter, столь любимым твоим преподом ..  С одной лишь разницей - конструкторы и деструкторы этих классов ручками вызывать не придется, объекты эти создаются и уничтожаются автоматически


Сергей М.   (2009-05-15 16:53:00) [4]


> препод ниче не шарящий в программухе сказал делать через
> Writer, Reader и все тут


Так ведь WriteComponent, ReadComponent неявно пользуют TWriter и TReader..

Ткни препода носом в генофонд и покажи, что эти классы действительно используются так-то и так-то ..


fs   (2009-05-15 16:45:00) [5]


> Если сам, то почему не унаследовался от TComponent или хотя
> бы от TPersistent ?


Именно так я изначально и собирался организовать структуру,  запись класс - TComponent. С сохранением и загрузкой из файла тогда бы вообще проблем не было (методы WriteComponent, ReadComponent (кажется так называются) использовал бы и все OK). Но препод ниче не шарящий в программухе сказал делать через Writer, Reader и все тут.


Сергей М.   (2009-05-15 16:37:00) [6]


> количество и порядок членов структуры заранее определен
> согласно ТЗ


А мне вот интересно, кто это ТЗ стряпал  - препод или ты сам ?

Если сам, то почему не унаследовался от TComponent или хотя бы от TPersistent ?


Медвежонок Пятачок   (2009-05-15 16:36:00) [7]

вот это я понимаю.
в тз не только члены структуры описаны, но и порядок их следования при сериализации.
Использование райтера я так понимаю тоже в тз прописано?


fs   (2009-05-15 16:34:00) [8]

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


Медвежонок Пятачок   (2009-05-15 16:26:00) [9]

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


Сергей М.   (2009-05-15 16:16:00) [10]


> Медвежонок Пятачок ©   (15.05.09 16:12) [10]


Нашиша ему xml, если он не видел и видит отсутствие инициализации указателя в локальной переменной p, к которой обращается при with p^..


Сергей М.   (2009-05-15 16:14:00) [11]


> проблему решил. В конструкторе TWriter нужно болы в качестве
> Size указать $FF


Ой не лукавь)


> with // куда пропало P^ do ?
>          begin
>            P := PBranchBankItem(List[i]);



> Непонятно что это означает


В справке же написано ..


Медвежонок Пятачок   (2009-05-15 16:12:00) [12]

трайтер был удобен лет сто назад, когда xml еще не изобрели


fs   (2009-05-15 16:08:00) [13]


> Нашиша тут TWriter понадобился ? Только лишь из-за готовых
> методов записи основных типов данных ?


По моему намного удобнее, чем записывать самому в Stream.Write(....), особенно со строками?


fs   (2009-05-15 16:05:00) [14]

все проблему решил. В конструкторе TWriter нужно болы в качестве Size указать $FF (PS. Непонятно что это означает)

procedure TBranchesBank.WriteTo(const AFileName: string);
var
 P: PBranchBankItem;
 i: Integer;
 S: TStream;
 W: TWriter;
begin
 S := TFileStream.Create(AFileName, fmCreate or fmOpenWrite or fmShareDenyNone);
 try
   W := TWriter.Create(S, $FF);
   with W do
     try
       WriteListBegin;
       try
         for I := 0 to Count - 1 do
         with
         begin
           P := PBranchBankItem(List[i]);
           WriteInteger(P^.Number);
           WriteString(P^.City);
           WriteString(P^.Address);
           WriteString(P^.Name);
           WriteInteger(P^.Code)
         end;
       finally
         WriteListEnd;
       end;
     finally
       Free;
     end;
 finally
   S.Free;
 end;
end;


Сергей М.   (2009-05-15 16:02:00) [15]


> fs   (15.05.09 15:58) [4]


ты зачем ворнинги выключил ?)


Сергей М.   (2009-05-15 16:00:00) [16]

Нашиша тут TWriter понадобился ? Только лишь из-за готовых методов записи основных типов данных ?


fs   (2009-05-15 15:58:00) [17]


>   with P^ do >       begin>          P := PBranchBankItem(List[i]);
> дааааа.... гениально... не делите шкуру неубитого медведя,
>  называется


Блин перепутал ....


fs   (2009-05-15 15:58:00) [18]

P := PBranchBankItem(List[i]);-указатель на текущую запись P^.Number


Медвежонок Пятачок   (2009-05-15 15:55:00) [19]

это не читать, здесь рыбу заворачивали


Palladin   (2009-05-15 15:55:00) [20]


>        with P^ do
>       begin
>          P := PBranchBankItem(List[i]);


дааааа.... гениально... не делите шкуру неубитого медведя, называется


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо