Текущий архив: 2005.12.18;
Скачать: CL | DM;
ВнизСохранение пременной типа Record в поток Найти похожие ветки
← →
Stanislav © (2005-11-16 09:33) [0]Есть тип:
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 указателям на строку.
И в поток соответственно сохраняются только указатели, а как сохранить содержимое этих строк?
← →
Reindeer Moss Eater © (2005-11-16 09:39) [1]Указатель на строку есть, длину строки знаешь.
Каие проблемы?
← →
Stanislav © (2005-11-16 09:42) [2]Reindeer Moss Eater ©
Понятно, но это нужно каждое поле сохранять по отдельности, а чтобы сразу всю переменную сохранить нельзя? Типа как WriteComponent ?
← →
Reindeer Moss Eater © (2005-11-16 09:46) [3]Ты её и так всю сохраняешь.
Уже сейчас.
Все три своих поля в записи.
← →
Digitman © (2005-11-16 09:47) [4]
> Stanislav
> Типа как WriteComponent ?
ну так и сделай вместо структуры полноценный компонент !
объяви сохраняемые поля в секции published декларации своего компонента - все остальное Delphi streaming system сделает сама, тебе лишь нужно будет вызвать FileStream.WriteComponent для сохранения своего компонента и FileStream.ReadComponent для его последующего восстановления
← →
Stanislav © (2005-11-16 09:51) [5]Digitman © (16.11.05 09:47) [4]
Можно, сделать :-).
Хотел сначала уточнить нелзя ли так же сохранять структуру Record.
← →
Reindeer Moss Eater © (2005-11-16 09:52) [6]белый бычок и сказка про него
← →
Digitman © (2005-11-16 10:03) [7]
> Stanislav © (16.11.05 09:51) [5]
> нелзя ли так же сохранять структуру Record
можно.
но придется реализовать тот же алгоритм, что скрывается за Read/WriteComponent(), т.е. для каждой строки читать/писать сначала ее длину и следом собственно строковые данные ... вопрос - а оно надо, если в файлер-объекте есть уже готовый алгоритм ?
← →
Stanislav © (2005-11-16 10:46) [8]Digitman © (16.11.05 10:03) [7]
Ненадо! Лучше сделаю компонент.
← →
Erik1 © (2005-11-16 12:32) [9]Ну почемуже можно сделать допущение, что у тебя только ShortString и поля типа (Integer, Boolean, Word...). Тогда достаточно вычислить длину ShortString полей и прибавить SizeOf(MyRecord). После пиши в поток, правда при востановлении придется считать сначала длины строк и сделать SetLength, но это тоже нетрудно.
← →
Reindeer Moss Eater © (2005-11-16 12:55) [10]Тогда достаточно вычислить длину ShortString полей и прибавить SizeOf(MyRecord).
Глупости не надо говорить
← →
Erik1 © (2005-11-17 17:00) [11]to Reindeer Moss Eater
Тоесть??? Я по такому принципу передачу данных сделал и это не глупости.
← →
Reindeer Moss Eater © (2005-11-17 17:13) [12]Согласен.
Это не глупости.
Это Очень Большие Глупости.
← →
Гаврила © (2005-11-17 17:17) [13]
> Erik1 ©
Если в Record только ShortString, и там нет никаких других указателей типа string и прочего - никаких длин вычислять не надо.
Пишется и читается весь Record как есть, одной строкой кода
← →
Erik1 © (2005-11-17 17:34) [14]MyRec = record
a: Integer;
b: Boolean;
c: ShortString;
e: set of byte;
f: ShortString;
end;
И как ты вычислиш сколько записать надо? Можно даже одной строчкой. :)
← →
jack128 © (2005-11-17 17:37) [15]Erik1 © (17.11.05 17:34) [14]
И как ты вычислиш сколько записать надо? Можно даже одной строчкой. :)
SizeOf(MyRec)
← →
Reindeer Moss Eater © (2005-11-17 17:41) [16]Для танкистов
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;
← →
Deka © (2005-11-17 17:47) [17]Размер структуры MyRec фиксированный и всегда равен 552 байтам. Возможно что-то изменится, если добавить packed.
← →
Deka © (2005-11-17 17:48) [18]Размер структуры MyRec фиксированный и всегда равен 552 байтам. Возможно что-то изменится, если добавить packed.
Совсем забыл, однако, SizeOf(MyRec);
← →
Erik1 © (2005-11-17 17:52) [19]Господа Reindeer Moss Eater и jack128 может сначала попробуем, а поcле постить будем? :)))
← →
TStas © (2005-11-17 17:52) [20]А в чем проблема писать в поток первые 4 байта длинну строки, а потом строку посимвольно?
← →
Reindeer Moss Eater © (2005-11-17 17:55) [21]Ерик, иди учи паскаль.
← →
Verg © (2005-11-17 18:07) [22]
> Reindeer Moss Eater © (17.11.05 17:41) [16]
> Для танкистов
>
> type
> PMyRec = ^TMyRec;
> TMyRec = record
> c1,
> c2,
> c3 : ShortString;
> end;
Видимо молодежь смущает, что размер этой записи не равен суммам длин слов " Очень " " Большие " " Глупости "
а типа хотелось бы.
← →
Германн © (2005-11-18 01:26) [23]Имхо.
Молодежь смущает то, что:
1. ShortString <> string[]
2. И может быть ещё и отсутствие слова packed в описании типа.
Страницы: 1 вся ветка
Текущий архив: 2005.12.18;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.012 c