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

Вниз

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

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1242628077
Игорь
2009-05-18 10:27
2009.07.05
Как правильно передать PChar из DLL


2-1242664388
copron
2009-05-18 20:33
2009.07.05
Выделение Timage


2-1242386967
ford
2009-05-15 15:29
2009.07.05
управление другим приложением


15-1241387790
Unknown user
2009-05-04 01:56
2009.07.05
Delphi и debug information


15-1241088234
56m1t
2009-04-30 14:43
2009.07.05
Как прикрутить свой домен с хостингу?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский