Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение пременной типа Record в поток [D7, WinXP]


Страницы:   1 2

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 для его последующего восстановления


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо