![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение пременной типа Record в поток [D7, WinXP]
Stanislav © (2005-11-16 09:33:00)Есть тип:
Type
TRepQuery=Record
Name,SysName,Query:String;
end;
Объявляю переменную
var Q:^TRepQuery;
Записываю в нее данные:
New (Q);
Q^.SysName:=Query[i].Name;
Q^.Query:=Query[i].SQL.Text;
Но при определении размера переменной Sizeof(Q)
Результат равен 12 байт т.е. равный 3 указателям на строку.
И в поток соответственно сохраняются только указатели, а как сохранить содержимое этих строк?
Германн (2005-11-18 01:26:00) [1]Имхо.
Молодежь смущает то, что:
1. ShortString <> string[]
2. И может быть ещё и отсутствие слова packedв описании типа.
Verg (2005-11-17 18:07:00) [2]
> Reindeer Moss Eater © (17.11.05 17:41) [16]
> Для танкистов
>
> type
> PMyRec = ^TMyRec;
> TMyRec = record
> c1,
> c2,
> c3 : ShortString;
> end;
Видимо молодежь смущает, что размер этой записи не равен суммам длин слов ' Очень ' ' Большие ' ' Глупости '
а типа хотелось бы.
Reindeer Moss Eater (2005-11-17 17:55:00) [3]Ерик, иди учи паскаль.
TStas (2005-11-17 17:52:00) [4]А в чем проблема писать в поток первые 4 байта длинну строки, а потом строку посимвольно?
Erik1 (2005-11-17 17:52:00) [5]Господа Reindeer Moss Eater и jack128 может сначала попробуем, а поcле постить будем? :)))
Deka (2005-11-17 17:48:00) [6]Размер структуры MyRec фиксированный и всегда равен 552 байтам. Возможно что-то изменится, если добавить packed.
Совсем забыл, однако, SizeOf(MyRec);
Deka (2005-11-17 17:47:00) [7]Размер структуры MyRec фиксированный и всегда равен 552 байтам. Возможно что-то изменится, если добавить packed.
Reindeer Moss Eater (2005-11-17 17:41:00) [8]Для танкистов
type
PMyRec = ^TMyRec;
TMyRec = record
c1,
c2,
c3 : ShortString;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Rec : TMyRec;
begin
ZeroMemory(@Rec,SizeOf(TMyRec));
Rec.c1 := ' Очень ';
Rec.c2 := ' Большие ';
Rec.c3 := ' Глупости ';
ShowMessage('256 x 3 = ' + IntToStr(SizeOf(TMyRec))+' ?'#13#10'Или нет?');
with TFileStream.Create('ГлупостиНаглядно.txt',fmCreate) do
try
WriteBuffer(Rec,SizeOf(TMyRec));
finally
Free;
end;
end;
jack128 (2005-11-17 17:37:00) [9]Erik1 © (17.11.05 17:34) [14]
И как ты вычислиш сколько записать надо? Можно даже одной строчкой. :)
SizeOf(MyRec)
Erik1 (2005-11-17 17:34:00) [10]MyRec = record
a: Integer;
b: Boolean;
c: ShortString;
e: set of byte;
f: ShortString;
end;
И как ты вычислиш сколько записать надо? Можно даже одной строчкой. :)
Гаврила (2005-11-17 17:17:00) [11]
> Erik1 ©
Если в Record только ShortString, и там нет никаких других указателей типа string и прочего - никаких длин вычислять не надо.
Пишется и читается весь Record как есть, одной строкой кода
Reindeer Moss Eater (2005-11-17 17:13:00) [12]Согласен.
Это не глупости.
Это Очень Большие Глупости.
Erik1 (2005-11-17 17:00:00) [13]to Reindeer Moss Eater
Тоесть??? Я по такому принципу передачу данных сделал и это не глупости.
Reindeer Moss Eater (2005-11-16 12:55:00) [14]Тогда достаточно вычислить длину ShortString полей и прибавить SizeOf(MyRecord).
Глупости не надо говорить
Erik1 (2005-11-16 12:32:00) [15]Ну почемуже можно сделать допущение, что у тебя только ShortString и поля типа (Integer, Boolean, Word...). Тогда достаточно вычислить длину ShortString полей и прибавить SizeOf(MyRecord). После пиши в поток, правда при востановлении придется считать сначала длины строк и сделать SetLength, но это тоже нетрудно.
Stanislav (2005-11-16 10:46:00) [16]Digitman © (16.11.05 10:03) [7]
Ненадо! Лучше сделаю компонент.
Digitman (2005-11-16 10:03:00) [17]
> Stanislav © (16.11.05 09:51) [5]
> нелзя ли так же сохранять структуру Record
можно.
но придется реализовать тот же алгоритм, что скрывается за Read/WriteComponent(), т.е. для каждой строки читать/писать сначала ее длину и следом собственно строковые данные ... вопрос - а оно надо, если в файлер-объекте есть уже готовый алгоритм ?
Reindeer Moss Eater (2005-11-16 09:52:00) [18]белый бычок и сказка про него
Stanislav (2005-11-16 09:51:00) [19]Digitman © (16.11.05 09:47) [4]
Можно, сделать :-).
Хотел сначала уточнить нелзя ли так же сохранять структуру Record.
Digitman (2005-11-16 09:47:00) [20]
> Stanislav
> Типа как WriteComponent ?
ну так и сделай вместо структуры полноценный компонент !
объяви сохраняемые поля в секции published декларации своего компонента - все остальное Delphi streaming system сделает сама, тебе лишь нужно будет вызвать FileStream.WriteComponent для сохранения своего компонента и FileStream.ReadComponent для его последующего восстановления