![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TWriter
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]);
дааааа.... гениально... не делите шкуру неубитого медведя, называется