Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.05;
Скачать: CL | DM;

Вниз

TWriter   Найти похожие ветки 

 
fs   (2009-05-15 15:52) [0]

Столкнулся с проблемой: написал алгоритм сохранения записей класса наследника от 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); прога вешается. Почему возникает ошибка не понятно.


 
Palladin ©   (2009-05-15 15:54) [1]

что за Number и Ко? откуда эти идентификаторы то взялись?


 
Palladin ©   (2009-05-15 15:55) [2]


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


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


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

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


 
fs   (2009-05-15 15:58) [4]

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


 
fs   (2009-05-15 15:58) [5]


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


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


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

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


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


> fs   (15.05.09 15:58) [4]


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


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

все проблему решил. В конструкторе 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;


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


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


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


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

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


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


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


Ой не лукавь)


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



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


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


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


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


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


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

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


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

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


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

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


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


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


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

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


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


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


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


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


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


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

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


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

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


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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2009.07.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
4-1212474363
KygECHuK
2008-06-03 10:26
2009.07.05
Handle по DC


15-1241555404
Юрий
2009-05-06 00:30
2009.07.05
С днем рождения ! 6 мая 2009 среда


2-1242322213
DJ_UZer
2009-05-14 21:30
2009.07.05
Как поместить кнопку на вкладку PageControl?


3-1223445286
edk2
2008-10-08 09:54
2009.07.05
помогите!!!!!


2-1242476766
partizan
2009-05-16 16:26
2009.07.05
Warning: FOR-Loop variable "i" may be undefined after loop