Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.181.231] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравстсвуйте!
Никак не получается сохранить в файл record, а затем вновь загрузить его! Запись имеет большой размер, состоит из полей разного типа, безразмерных массивов, переменных других типой(определенных) мной. Пробовал очень просто, через поток: var fs: TFileStream; begin if sd.Execute then begin fs:=TFileStream.Create(sd.FileName,fmCreate); fs.WriteBuffer(Project, SizeOf(Project)); fs.Free; end; end; Ну и соответственно загрузка: var fs: TFileStream; begin if not od.Execute then exit; fs:=TFileStream.Create(od.FileName,fmOpenRead); fs.ReadBuffer(Project, fs.Size); fs.Free; end; Ничего не получилось... (( Подскажите как это реализовать? Заранее спасибо! |
Сообщ.
#2
,
|
|
|
Цитата R@RED @ безразмерных массивов, Ну не безразмерных, конечно, а динамических Поэтому и не получается. Самое простое - сделай не запись, а потомка TComponent. Все, что нужно сохранять, объяви как published property. И потом просто используй поток. |
Сообщ.
#3
,
|
|
|
Цитата R@RED @ Показывать надо не только краешек, ниже спускать, как у доктора, иначе тебе никто не поможет. Что за Project? Подскажите как это реализовать? Заранее спасибо! |
Сообщ.
#4
,
|
|
|
TSampleRec=record Text: String; Num: Integer; end; i: integer; sr: TSampleRec; fs: TFileStream; begin sr.Text := 'test text'; sr.Num := 19; // Пишем fs := TFileStream.Create('c:\temp\file.tst', fmCreate); try i := Length(sr.Text); fs.Write(i,4); fs.Write(sr.Text[1],Length(sr.Text)); fs.Write(sr.Num,4); finally fs.Free; end; // Читаем fs := TFileStream.Create('c:\temp\file.tst', fmOpenRead); try fs.Read(i,4); SetLength(sr.Text,i); fs.Read(sr.Text[1],i); fs.Read(sr.Num,4); finally fs.Free; end; |
Сообщ.
#5
,
|
|
|
Цитата Romkin @ Все, что нужно сохранять, объяви как published property. И потом просто используй поток. Угу, а потом когда в след версии измениться логика чтения/сохранения RTTI свойств, попробуй всю эту байду прочитать |
Сообщ.
#6
,
|
|
|
Если косяк именно из-за дин. массивов, то почему бы в структуре не хранить число элементов и написть свою процедуру считывания данных, а не потоком ?
|
Сообщ.
#7
,
|
|
|
Цитата Демо @ fs.Write(i,4); Опять Демо новичков плохому учит! |
Сообщ.
#8
,
|
|
|
Цитата --Ins-- @ Опять Демо новичков плохому учит! Это почему это? -)) |
Сообщ.
#9
,
|
|
|
Цитата Демо @ Это почему это? -)) http://ru.wikipedia.org/wiki/Магическое_число_(программирование) - см. "Плохая практика программирования" Про SizeOf слышал? |
Сообщ.
#10
,
|
|
|
Цитата --Ins-- @ Про SizeOf слышал? Увы, переносимости в любом случае не будет. Как раз в этом случае integer не может менять длину. Оно ОБЯЗАНО быть 4 байта. Иначе нет смысла хранить данные таким образом. Добавлено PS. Википедия - весьма спорный аргумент. Я бы сказал, что ей доверять нельзя ВООБЩЕ. |
Сообщ.
#11
,
|
|
|
Цитата Демо @ Увы, переносимости в любом случае не будет. Уверен? А чем тогда отличаются фундаментальные типы от общих? А конкретно, Longint от Integer? Добавлено Цитата Демо @ Википедия - весьма спорный аргумент. Согласен, но не в данном случае |
Сообщ.
#12
,
|
|
|
Цитата --Ins-- @ Уверен? А чем тогда отличаются фундаментальные типы от общих? А конкретно, Longint от Integer? Поможет ли SizeOf в случае переноса данных с одного ПК на другой, если на одном целый тип будет занимать 8 байт, а на другом 4? Думаю, что нет. Поэтому в этом случае неприменим SizeOf. |
Сообщ.
#13
,
|
|
|
Цитата Демо @ Поможет ли SizeOf в случае переноса данных с одного ПК на другой, если на одном целый тип будет занимать 8 байт, а на другом 4? Думаю, что нет. Поэтому в этом случае неприменим SizeOf. Тэкс, ты вопроса про общие и фундаментальные типы не понял... Что ж, спрошу без намеков... SizeOf(Longint) применим? |
Сообщ.
#14
,
|
|
|
Цитата --Ins-- @ Тэкс, ты вопроса про общие и фундаментальные типы не понял... Что ж, спрошу без намеков... SizeOf(Longint) применим? Longint применим;) Добавлено В смысле Sizeof(Longint)... |
Сообщ.
#15
,
|
|
|
Демо, ну дык чего ты мне доказываешь Видишь, и SizeOf применим, и переносимость, и нет "магических чисел" в коде
|